先上环境信息
Linux flanker 6.2.16-15-pve #1 SMP PREEMPT_DYNAMIC PMX 6.2.16-15 (2023-09-28T13:53Z) x86_64 GNU/Linux
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模拟方法的官方文档链接
https://www.qemu.org/docs/master/system/target-arm.html
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不支持
3:硬盘这里总线注意选择SCSI,下面配置根据自己情况酌情勾选,我这里只勾选了SSD仿真
4:CPU这里只选需要的核心数量,类别这里什么都不选,一会再改命令行
5:内存根据情况自己选
6:网络VirtIO (半虚拟化) qemu-system-aarch64是可以支持的,直接用半虚拟化模式
7:手动添加镜像,总线选择SCSI
8:添加完成后,我们来看一下目前的启动配置和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'
目前需要修改的地方大概有两个点,1CPU模拟的类型,2SPICE参数(SPICE绑定到指定端口并设置密码)
通过X86环境我们可以得知,CPU模拟是区分类型的,比如X86下有理论上性能最优的host模式和一些其他模式
通过以下命令行得知,aarch64模拟下也支持多种CPU模式如下
root@flanker:~# qemu-system-aarch64 -cpu ?
Available CPUs:
a64fx
arm1026
arm1136
arm1136-r2
arm1176
arm11mpcore
arm926
arm946
cortex-a15
cortex-a35
cortex-a53
cortex-a55
cortex-a57
cortex-a7
cortex-a72
cortex-a76
cortex-a8
cortex-a9
cortex-m0
cortex-m3
cortex-m33
cortex-m4
cortex-m55
cortex-m7
cortex-r5
cortex-r52
cortex-r5f
max
neoverse-n1
pxa250
pxa255
pxa260
pxa261
pxa262
pxa270-a0
pxa270-a1
pxa270
pxa270-b0
pxa270-b1
pxa270-c0
pxa270-c5
sa1100
sa1110
ti925t
我们可以观察到默认的启动CPU模式是-cpu cortex-a57
我没有测试过上面哪种模式下性能最优,没有测试过跑分,体感上感觉都很卡,但我认为需要知道这个参数如何更改,这里更改为cortex-a76
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在PVE8下不能直接设置PW,需要通过secret设置,这里设置一个最普通的方法,secret等于123456
spice 参考这里https://www.qemu.org/docs/master/system/secrets.html
这时候不要通过web界面启动,通过修改后的命令行启动,我们可以看到以及可以正常进入grub并且引导进安装菜单(示例镜像为UOS1060 内核必须选择5X版本,4X内核不行)
因为是通过X86转译模拟的,安装会比较卡,耐心等待
UOS安装
安装完毕后需要将引导盘改回硬盘引导
进系统后,安装vdagent获取spice高级支持,安装qemu-agent使得PVE可以与环境进行通信来实现联动开关机等
apt-get install spice-vdagent
apt-get install qemu-guest-agent
关闭桌面,然后去选项里把spice增强打开
调整一下命令行,再启动系统
进系统后观察到守护进程启动
此时已经可以使用windows上的spice remote viewer连上桌面了
拖拽文件会把文件拉到下载文件夹内
跨环境复制粘贴也OK
结束