macos - libvirt en Apple Silicon con qemu-system-aarch64

CorePress2024-01-24  11

Qemu compilado de este manual

Intenta ejecutar esto en Apple Silicon con qemu-system-aarch64, pero aparece un error:

Error: error interno: No se pudo iniciar QEMU binario /usr/local/bin/qemu-system-aarch64 para sondear: qemu-system-aarch64: acelerador kvm no válido No se pudo asignar el búfer del traductor dinámico

Este es el XML:

<domain type='qemu' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
    <name>ubuntu</name>
    <uuid>2005CB24-522A-4485-9B9A-E60A61D9F8CF</uuid>
    <memory unit='GB'>2</memory>
    <cpu mode='custom'>
        <model>Westmere</model>
    </cpu>
    <vcpu>2</vcpu>
    <features>
        <acpi/>
        <apic/>
    </features>
    <os>
        <type arch='aarch64' machine='cortex-a57'>hvf</type>
        <bootmenu enable='yes'/>
    </os>
    <clock offset='localtime'/>
    <on_poweroff>destroy</on_poweroff>
    <on_reboot>restart</on_reboot>
    <on_crash>destroy</on_crash>
    <pm>
        <suspend-to-mem enabled='no'/>
        <suspend-to-disk enabled='no'/>
    </pm>
    <devices>
        <emulator>/usr/local/bin/qemu-system-aarch64</emulator>
        <controller type='usb' model='ehci'/>
        <disk type='file' device='disk'>
            <driver name='qemu' type='qcow2'/>
            <source file='/Users/matthias/VM/Ubuntu_20.04-LTS/disk.qcow2'/>
            <target dev='vda' bus='virtio'/>
        </disk>
        <!--disk type='file' device='cdrom'>
            <source file='/Users/matthias/VM/Ubuntu_20.04-LTS/ubuntu-20.04.2-live-server-arm64.iso'/>
            <target dev='sdb' bus='sata'/>
        </disk-->
        <console type='pty'>
            <target type='serial'/>
        </console>
        <input type='tablet' bus='usb'/>
        <input type='keyboard' bus='usb'/>
        <graphics type='vnc' port='5900' listen='127.0.0.1'/>
        <video>
            <model type='virtio' vram='16384'/>
        </video>
    </devices>
    <seclabel type='none'/>
    <qemu:commandline>
        <!--qemu:arg value='-machine'/>
        <qemu:arg value='type=q35,accel=hvf'/>
        <qemu:arg value='-netdev'/>
        <qemu:arg value='user,id=n1,hostfwd=tcp::2222-:22'/>
        <qemu:arg value='-device'/>
        <qemu:arg value='virtio-net-pci,netdev=n1,bus=pcie.0,addr=0x19'/-->
    <qemu:arg value='-accel hvf -m 2048 -cpu cortex-a57 -M virt,highmem=off'/>
    <qemu:arg value='-drive file=/usr/local/share/qemu/edk2-aarch64-code.fd,if=pflash,format=raw,readonly=on'/>
    <qemu:arg value='-drive file=ovmf_vars.fd,if=pflash,format=raw'/>
    <qemu:arg value='-serial telnet::4444,server,nowait'/>
    <qemu:arg value='-device virtio-blk-device,drive=hd0,serial="dummyserial"'/>
    <qemu:arg value='-device virtio-net-device,netdev=net0'/>
    <qemu:arg value='-netdev user,id=net0,hostfwd=tcp:127.0.0.1:2222-0.0.0.0:22'/>
    <qemu:arg value='-vga none -device ramfb'/>
    <qemu:arg value='-device usb-ehci -device usb-kbd -device usb-mouse -usb'/>
    <qemu:arg value='-nographic -serial mon:stdio'/>
    </qemu:commandline>
</domain>

¡Gracias por cualquier comentario!



------------------------------------

Debe pasar -machine accel=hvf,highmem=off como argumento QEMU. Tengo una solución Libvirt + QEMU completamente funcional en https://github.com/ihsakashi/VM. Libvirt no pudo identificar la arquitectura aarch64 usando uname siUna vez macOS dio algo diferente. Eso ha sido parcheado.



------------------------------------

En lugar de usar XML y virsh, descubrí que es mucho más fácil usar shell para llamar a QEMU directamente. Aquí está el script que estoy usando:

qemu-system-aarch64 \
         -machine virt,accel=hvf,highmem=off \
         -cpu cortex-a72 -smp 2 -m 4G \
         -device intel-hda -device hda-output \
         -device qemu-xhci \
         -device virtio-gpu-gl-pci \
         -device usb-kbd \
         -device virtio-mouse-pci \
         -display cocoa,gl=es \
             -device e1000,netdev=net0 \
             -netdev user,id=net0 \
         -drive "if=pflash,format=raw,file=#{firmware_path}/edk2-aarch64-code.fd,readonly=on" \
         -drive "if=pflash,format=raw,file=#{firmware_path}/edk2-arm-vars.fd,discard=on" \
         -drive "if=virtio,format=qcow2,file=#{disk_file_location},discard=on" \
             -chardev qemu-vdagent,id=spice,name=vdagent,clipboard=on \
             -device virtio-serial-pci \
             -device virtserialport,chardev=spice,name=com.redhat.spice.0

Si utilizas vagrant, puede que mi complemento te resulte útil: https://github.com/billyan2018/vagrant-qemu



------------------------------------

QEMU parece estar intentando utilizar el acelerador KVM, queobviamente no funciona en un host macos, por lo que QEMU informa "acelerador kvm no válido". Luego intenta recurrir a TCG (emulación pura), lo que también falla debido a un error de macOS relacionado con mprotect(), por lo que "No se pudo asignar el búfer del traductor dinámico". (El último QEMU ascendente tiene una solución alternativa para esto en la confirmación c118881ee607dcac, pero no la necesita ya que solo se está ejecutando porque hvf en realidad no se está utilizando).

Creo que esto sucede porque su sintaxis XML es incorrecta y por eso QEMU no ve su intento de indicarle que use hvf. Específicamente, cada "qemu:arg" La etiqueta en el XML debe especificar una sola palabra de argumento de línea de comando, por lo que si desea decir "-accel hvf" debes escribir

 <qemu:arg value='-accel'>
 <qemu:arg value='hvf'>

y así sucesivamente para todas las demás opciones.ons y argumentos que desea especificar. (Puedes ver que las opciones q35 que comentaste están todas especificadas de esta manera, a diferencia de las que agregaste para la máquina virt: mira la diferencia entre el manejo de -netdev allí y lo que tienes, por ejemplo. )

Si intenta pasar una cadena más larga en el XML como lo ha hecho, entonces QEMU lo verá como un único argumento largo de línea de comando con espacios incrustados, que luego probablemente tratará como un nombre de archivo de imagen de disco muy extraño o del que se quejará. como inválido.



------------------------------------

Tienes que aplicar este parche: https://bugs.launchpad.net/qemu/+bug/1914849/comentarios/3

Y vuelva a compilar. Esto parece evitar que ocurra este error. Sin embargo, estoy trabajando en el mismo tutorial que tú y hay algunos otros cambios que también deben realizarse.

Hasta ahora, todo lo que he descubierto es que necesito hacer referencia a este firmware EFI: https://www.sevarg.net/images/2021-qemu-m1/QEMU_EFI.fd (con referencia a este tutorial: https://www.sevarg.net/2021/01/09/arm-mac-mini-and-boinc/)

Lo probé en el bloque XML del sistema operativo, pero parece que no puedo encontrarlo:

    <os firmware='efi'>
        <type>hvm</type>
        <loader readonly='yes' secure='no' type='pflash'>/Users/darren/Documents/VMs/QEMU_EFI.fd</loader>
        <boot dev='hd'/>
        <bootmenu enable='yes'/>
        <smbios mode='sysinfo'/>
        <bios useserial='yes' rebootTimeout='0'/>
    </os>

Así que en lugar de eso hice referencia al BIOS UEFI como parámetro de línea de comando.

De todos modos, aquí está mi XML completo:

<domain type='qemu' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
    <name>ubuntu1</name>
    <uuid>2005CB24-522A-4485-9B9A-E60A61D9F8CF</uuid>
    <memory unit='GB'>2</memory>
    <cpu mode='custom'>
        <model>cortex-a72</model>
    </cpu>
    <vcpu>1</vcpu>
    <features>
        <apic/>
    </features>
    <os>
        <type arch='aarch64' machine='virt'>hvm</type>
        <bootmenu enable='yes'/>
    </os>
    <clock offset='localtime'/>
    <on_poweroff>destroy</on_poweroff>
    <on_reboot>restart</on_reboot>
    <on_crash>destroy</on_crash>
    <devices>
        <emulator>/usr/local/bin/qemu-system-aarch64</emulator>
        <controller type='usb' model='ehci'/>
        <disk type='file' device='disk'>
            <driver name='qemu' type='qcow2'/>
            <source file='/Users/darren/Documents/VMs/ubuntu1.qcow2'/>
            <target dev='vda' bus='virtio'/>
        </disk>
        <console type='pty'>
            <target type='serial'/>
        </console>
        <input type='tablet' bus='usb'/>
        <input type='keyboard' bus='usb'/>
        <graphics type='vnc' port='5900' listen='127.0.0.1'/>
        <video>
            <model type='virtio' vram='16384'/>
        </video>
    </devices>
    <seclabel type='none'/>
    <qemu:commandline>
        <qemu:arg value='-accel'/>
        <qemu:arg value='hvf'/>
        <qemu:arg value='-netdev'/>
        <qemu:arg value='user,id=n1,hostfwd=tcp::2222-:22'/>
        <qemu:arg value='-device'/>
        <qemu:arg value='virtio-gpu-pci,netdev=n1,bus=pcie.0,addr=0x19'/>
        <qemu:arg value='-bios'/>
        <qemu:arg value='/Users/darren/Documents/VMs/QEMU_EFI.fd'/>
    </qemu:commandline>
</domain>

Ahora recibo este error: error: No se pudo iniciar el dominio 'ubuntu1' error: error interno: arquitectura de hardware no definida

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare