根据本手册编译的qemu
尝试使用qemu-system-arch64在Apple Silicon上运行此程序,但出现错误:
错误:内部错误:无法启动QEMU二进制/usr/local/bin/QEMU-system-aarch64进行探测:QEMU-system-aarch64:加速器kvm无效无法分配动态转换器缓冲区
这是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>
感谢您的反馈!
您需要将-machine accel=hvf,highmem=off
作为QEMU参数传递。我有一个完整的Libvirt+QEMU解决方案https://github.com/ihsakashi/VM。Libvirt无法使用uname
识别aarch64体系结构,因为macOS提供了一些不同的东西。已经修补了。
我发现使用shell直接调用QEMU要容易得多,而不是使用XML和virsh。这是我正在使用的脚本:
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
如果你碰巧使用流浪者,你可能会发现我的插件很有用:https://github.com/billyan2018/vagrant-qemu
QEMU似乎正在尝试使用KVM加速器,这显然在macos主机上不起作用,因此QEMU报告"无效加速器kvm";。然后,它试图回到TCG(纯仿真(,但由于涉及mprotect((的macos错误,TCG也失败了,因此"无法分配动态翻译器缓冲区";。(最新的上游QEMU在commitc118881ee607dcac中对此有一个解决方案,但您不需要,因为您只是遇到了它,因为实际上并没有使用hvf。(
我认为发生这种情况是因为您的XML语法不正确,所以QEMU没有看到您试图告诉它使用hvf。具体地说;qemu:arg"XML中的标记必须指定一个单独的命令行参数字,所以如果您想说"-accel hvf";你必须写
<qemu:arg value='-accel'>
<qemu:arg value='hvf'>
对于要指定的所有其他选项和参数,依此类推。(您可以看到,您注释掉的q35选项都是以这种方式指定的,与您为virt机器添加的选项不同:例如,看看那里的-netdev处理与您现有的处理之间的区别。(
如果您尝试像您所做的那样在XML中传递一个较长的字符串,那么QEMU将把它看作一个带有嵌入空格的长命令行参数,然后它可能会把它当作一个非常奇怪的磁盘映像文件名,或者抱怨它无效。
您必须应用此补丁:https://bugs.launchpad.net/qemu/+bug/1914849/comments/3
并重新编译。这似乎阻止了这个错误的发生。然而,我正在完成与您相同的教程,还有一些其他的更改也需要进行。
到目前为止,我只知道我需要参考这个EFI固件:https://www.sevarg.net/images/2021-qemu-m1/QEMU_EFI.fd(参考本教程-https://www.sevarg.net/2021/01/09/arm-mac-mini-and-boinc/)
我在操作系统XML块中尝试过,但似乎找不到:
<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>
因此,我引用UEFI BIOS作为命令行参数。
总之,这是我的完整XML:
<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>
现在我得到这个错误:错误:无法启动域"ubuntu1"错误:内部错误:未定义的硬件架构