在PVE平台上使用QEMU模拟ARM环境

环境准备

使用的版本是Proxmox VE 8.2.2 版本,首先先配置好镜像源。

需要以下组件

pve-qemu-kvm 8.0.2-7 amd64 Full virtualization on x86 hardware

qemu-efi-aarch64 2022.11-6 all UEFI firmware for 64-bit ARM virtual machines

qemu-server 8.0.7 amd64 Qemu Server Tools

qemu-system-aarch64组件进行arm模拟转换,在PVE8中目前没有内置这个组件,首先通过apt install qemu-efi-aarch64来安装

通过PVE web页面可以快速配置环境,但是仍有部分配置需要手动调整启动命令行来实现,比如spice的支持,等

首先建立虚拟机

  1. 操作系统这里先不选任何介质,因为默认添加的光盘会通过IDE总线挂载,qemu-system-aarch64不支持
  2. 系统这里机型默认i440fx(没测过Q35,按照PVE官方说明不设置硬件直通的情况下都建议使用i440fx)
    bios选择uefi模式,efi的盘随便挂一块

SCSI控制器这里注意,必须且只能选择VirtIO SCSI模式,其他模式qemu-system-aarch64不支持

  1. 硬盘这里总线注意选择SCSI,下面配置根据自己情况酌情勾选,我这里只勾选了SSD仿真

创建虚拟机

  1. CPU这里只选需要的核心数量,类别这里什么都不选,一会再改命令行

  1. 内存情况我选的是2G,貌似是因为发行版不同的原因,目前我尝试非2G内存时会出现鼠标、键盘无法使用的情况
  2. 网络VirtIO (半虚拟化) qemu-system-aarch64是可以支持的,直接用半虚拟化模式
  3. 手动添加镜像,总线选择SCSI,即使在创建向导时选择了不使用任何介质但是在硬件中依然会创建一个CD/DVD Drive 注意删除这个硬件

添加完成后,我们来看一下目前的启动配置和cmdline是什么样的

config文件如下

agent: 1

bios: ovmf

boot: order=scsi0;net0;scsi1

cores: 8

efidisk0: ISCSI-Thin:vm-112-disk-0,efitype=4m,pre-enrolled-keys=1,size=4M

memory: 4096

meta: creation-qemu=8.0.2,ctime=1701243164

net0: virtio=12:DE:C5:6C:F3:B1,bridge=vmbr0,firewall=1

numa: 0

ostype: l26

scsi0: ISCSI-Thin:vm-112-disk-1,iothread=1,size=100G

scsi1: DSM_NFS_ISO:iso/uos-desktop-20-professional-1060-arm64-202309.iso,media=cdrom,size=3588150K

scsihw: virtio-scsi-pci

smbios1: uuid=de71dc68-e726-43b5-8738-a5013e24e6c8

sockets: 1

#vmgenid: 6f1f76ab-b800-4e1b-a7a3-4589f1fce4d2 注释掉这行

arch: aarch64 添加指定架构

cmdline如下

/usr/bin/qemu-system-aarch64 -id 112 -name ‘vm112,debug-threads=on’ -no-shutdown -chardev ‘socket,id=qmp,path=/var/run/qemu-server/112.qmp,server=on,wait=off’ -mon ‘chardev=qmp,mode=control’ -chardev ‘socket,id=qmp-event,path=/var/run/qmeventd.sock,reconnect=5’ -mon ‘chardev=qmp-event,mode=control’ -pidfile /var/run/qemu-server/112.pid -daemonize -smbios ‘type=1,uuid=de71dc68-e726-43b5-8738-a5013e24e6c8’ -drive ‘if=pflash,unit=0,format=raw,readonly=on,file=/usr/share/pve-edk2-firmware//AAVMF_CODE.fd’ -drive ‘if=pflash,unit=1,id=drive-efidisk0,format=raw,file=/dev/zvol/ZFS_workspace/vm-112-disk-0,size=67108864’ -smp ‘8,sockets=1,cores=8,maxcpus=8’ -nodefaults -boot ‘menu=on,strict=on,reboot-timeout=1000,splash=/usr/share/qemu-server/bootsplash.jpg’ -vnc ‘unix:/var/run/qemu-server/112.vnc,password=on’ -cpu cortex-a57 -m 4096 -device ‘pci-bridge,id=pci.1,chassis_nr=1,bus=pcie.0,addr=0x1e’ -device ‘pci-bridge,id=pci.2,chassis_nr=2,bus=pcie.0,addr=0x1f’ -device ‘usb-ehci,id=ehci,bus=pcie.0,addr=0x1’ -device ‘usb-tablet,id=tablet,bus=ehci.0,port=1’ -device ‘usb-kbd,id=keyboard,bus=ehci.0,port=2’ -device ‘virtio-gpu,id=vga,bus=pcie.0,addr=0x2’ -chardev ‘socket,path=/var/run/qemu-server/112.qga,server=on,wait=off,id=qga0’ -device ‘virtio-serial,id=qga0,bus=pcie.0,addr=0x8’ -device ‘virtserialport,chardev=qga0,name=org.qemu.guest_agent.0’ -device ‘virtio-serial,id=spice,bus=pcie.0,addr=0x9’ -chardev ‘spicevmc,id=vdagent,name=vdagent’ -device ‘virtserialport,chardev=vdagent,name=com.redhat.spice.0’ -spice ‘tls-port=61000,addr=127.0.0.1,tls-ciphers=HIGH,seamless-migration=on’ -device ‘virtio-balloon-pci,id=balloon0,bus=pcie.0,addr=0x3,free-page-reporting=on’ -iscsi ‘initiator-name=iqn.1993-08.org.debian:01:dc8a864c80c9’ -device ‘virtio-scsi-pci,id=scsihw0,bus=pcie.0,addr=0x5’ -drive ‘file=/dev/zvol/CoreDataBase/vm-112-disk-0,if=none,id=drive-scsi0,format=raw,cache=none,aio=io_uring,detect-zeroes=on’ -device ‘scsi-hd,bus=scsihw0.0,channel=0,scsi-id=0,lun=0,drive=drive-scsi0,id=scsi0,rotation_rate=1’ -drive ‘file=/mnt/pve/DSM_NFS_ISO/template/iso/uos-desktop-20-professional-1060-arm64-202309.iso,if=none,id=drive-scsi1,media=cdrom,aio=io_uring’ -device ‘scsi-cd,bus=scsihw0.0,channel=0,scsi-id=0,lun=1,drive=drive-scsi1,id=scsi1,bootindex=100’ -netdev ‘type=tap,id=net0,ifname=tap112i0,script=/var/lib/qemu-server/pve-bridge,downscript=/var/lib/qemu-server/pve-bridgedown’ -device ‘virtio-net-pci,mac=12:DE:C5:6C:F3:B1,netdev=net0,bus=pcie.0,addr=0x12,id=net0,rx_queue_size=1024,tx_queue_size=256’ -machine ‘accel=tcg,type=virt+pve0’

这样实际上就已经可以启动了,但是也可以修改SPICE参数使用SPICE来链接。可以改为

spice ‘port=60010(绑定的端口),tls-port=60011(加密的端口),addr=xxx.xxx.xxx.xxx,seamless-migration=on,password-secret=test’ -object ‘secret,id=test,data=123456’

即可用SPICE来链接。

最终效果如下

评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...