16
2024
05
15:57:42

一种通过PVE-QEMU-KVM搭建arm模拟环境的方法,并使用SPICE进行远程连接


先上环境信息

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不支持

1

2:系统这里机型默认i440fx(没测过Q35,按照PVE官方说明不设置硬件直通的情况下都建议使用i440fx)
bios选择uefi模式,efi的盘随便挂一块

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

2

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

3

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

4

5:内存根据情况自己选

6:网络VirtIO (半虚拟化) qemu-system-aarch64是可以支持的,直接用半虚拟化模式

7:手动添加镜像,总线选择SCSI

5

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模式和一些其他模式

6

通过以下命令行得知,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安装

UOS安装

安装完毕后需要将引导盘改回硬盘引导

进系统后,安装vdagent获取spice高级支持,安装qemu-agent使得PVE可以与环境进行通信来实现联动开关机等

apt-get install spice-vdagent

apt-get install qemu-guest-agent

关闭桌面,然后去选项里把spice增强打开

调整一下命令行,再启动系统

进系统后观察到守护进程启动

此时已经可以使用windows上的spice remote viewer连上桌面了


拖拽文件会把文件拉到下载文件夹内

跨环境复制粘贴也OK

结束




推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://hqyman.cn/post/6103.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

您的IP地址是: