[software development] 在arm64+UOS上折腾QEMU虚拟机的新进展(AnyLinux系列之二)
Tofloor
poster avatar
kero990
deepin
6 hours ago
Author

自从2022年我拿到这台飞腾2000/4,我就一直在试图折腾qemu虚拟机,来尝试安装win on arm。不过当年并没有写记录,所以很多心得都遗失了。当时唯一能找到的资料来自于oschina的chipo,比如https://my.oschina.net/u/2816653/blog/8830768,他在贴吧也有号https://tieba.baidu.com/p/7588935077?fr=personpage,我们交流过很多次。

当时的限制是UOS,或者说debian10自带的qemu版本过低,压根装不了win on arm。chipo的作法是换系统到银河麒麟,也就是说,在他那,用uos是做不成的。
主要的卡点是在显示设备,arm不支持qemu常见的vga和virt显示设备,在当时,只能使用ramfb,这个是在qemu xx版本的时候加入的,UOS这版没有。
所以后来我尝试完整编译qemu+virt-manage,确实实现了在uos上安装win on arm,当时的版本还是qemu7.1,但对系统的侵入太大了,所有东西都会编译安装到/usr。

再后来,经过研究发现ramfb这个驱动是没有其他依赖的,甚至可以直接把deb包装在uos上,这样就实现了侵入式最小的j简化办法,即安装ramfb包,然后使用自带的qemu来运行。

最后,飞腾出了phyvirt的官方虚拟机,静态打包了qemu(还做了不少魔改适配),虽然作为一个虚拟机来讲自定义程度不高,但确实傻瓜化,有了这个以后,我也就不再折腾虚拟机这套玩意了。

这是之前折腾的前情,但到这时,还有几个问题。
1.phyvirt是飞腾设备专用的,其他arm芯片用不了。
2.从我尝试的结果看,无论是自编译的qemu,还是飞腾的phyvirt,只能装win11 on arm,win10不行,虽然win10的确也有arm版本,但就是启动不了。


那为什么我又开始折腾这玩意呢?显然,这还是跟AnyLinux有关。

如之前帖子,AnyLinux可以让非常旧的系统跑起来非常新版本的软件,这其中,qemu是官方宣传点之一,他们甚至能在ubuntu12上运行最新的qemu11,这就给我们提供了新的办法,不需要再完整编译qemu,甚至不需要root,这玩意是完全可以在标准用户权限下用的。

下面是我的测试,测试系统来自于WindowsSimplify,似乎是一个宝岛台湾做的windows精简版,在2022年几乎是唯一的windows on arm的精简版。这也是之前一直跑不起来的(以至于我今天才发现它的 win10居然不是中文版,win11是有中文版的),很可惜的是它停更了。

目前国内也有一些作者在做windows on arm的镜像,主要服务手机和mac玩家,不过要么是收费群下载,要么是论坛积分下载,略有门槛无法直接获取。

首先用qemu-img创建一个硬盘文件,这个appimage不加后缀默认调用qemu-system-x86_64,加后缀可以运行所有qemu程序:
./QEMU-11.0.0-1-anylinux-aarch64.AppImage qemu-img create -f qcow2 win11.qcow2 20G

实测这版本win10安装完毕后占用不到8G,win11占用9g+,10G硬盘空间会非常极限。
安装时候的启动命令:

./QEMU-11.0.0-1-anylinux-aarch64.AppImage qemu-system-aarch64
-M virt,gic-version=host
-accel kvm
-cpu host
-smp 2
-m 4096
-rtc base=localtime
-object rng-random,filename=/dev/urandom,id=rng0
-device virtio-rng-pci,rng=rng0
-device nec-usb-xhci,id=usb-bus
-device usb-kbd,bus=usb-bus.0
-device usb-tablet,bus=usb-bus.0
-drive file=./win11.qcow2,if=none,id=hd
-device nvme,drive=hd,serial=win10nvme
-drive file=./22631.2861_arm_p_cn_231219.iso,media=cdrom,if=none,id=cdrom,readonly=on
-device usb-storage,drive=cdrom,bus=usb-bus.0
-boot menu=on
-device ramfb
-device virtio-gpu-pci
-device virtio-net,disable-legacy=on,netdev=net0,romfile=""
-netdev user,id=net0,hostfwd=tcp::3389-:3389
-audiodev pa,id=snd0
-device usb-audio,audiodev=snd0
-drive if=pflash,format=raw,file=/opt/apps/cn.com.phytium.phyvirt/files/edk2/aarch64/QEMU_EFI_pvirt-pflash.raw,readonly=on
-drive if=pflash,format=raw,file=./win10_vars.fd

这个安装命令相比之前,使用了nvme硬盘设备,而win10、11原生支持nvme,所以不需要在安装阶段注入virtio驱动,可以在安装完成后统一安装其他的virtio驱动。当然也可以按照以前的流程,在安装阶段首先安装驱动再安装系统。

驱动官方地址下载极慢,可以使用国内镜像
https://mirrors.lierfang.com/pxcloud/pxvirt/virtio-win/
然后把上面命令中挂载安装盘的iso路径改为virtio-win-0.1.285.iso的,重新启动,在win11里安装驱动。
后续的启动命令就可以删掉光驱那两行,删掉ramfb哪一行作为最终的启动命令。

截图_qemu_20260609113902.png

截图_qemu_20260609174933.png

截图_qemu-system-aarch64_20260611124540.png

截图_qemu-system-aarch64_20260611124626.png


那么使用AnyLinux的这套QEMU有什么好处呢?

首先肯定是更新版本带来的bug修复,性能优化等等,我猜测之前即使是飞腾官方的phyvirt也无法启动win10,很可能是qemu版本的问题,估计是从某版本才开始支持。windows on arm在2022年本身就是个新鲜事物,qemu这些年来修复了几百个关于它的bug,现在我们可以无缝享受这些修复了,完全不用自己编译。

包括之前我们只能使用ramfb作为显示设备,然而ramfb是个基础设备,只支持800*600分辨率,不支持任何高级特性。但新变化是最新的 virtio-win 驱动包中包含了arm64版本的ARM64 版本的 VirtIO GPU 驱动(viogpudo),所以现在可以使用virtio-gpu-pci作为显示设备,虽然目前还不像x86虚拟机那样能够随意缩放窗口调整分辨率,但至少不会像ramfb一样卡在800*600,唯一的问题是分辨率需要在bios里调整,系统里面是调整不了的。
所以,实际上我们推荐的使用方式仍然是使用微软远程桌面连接,来获得更好的显示性能。

其次当然是不限于飞腾芯片,麒麟、鲲鹏芯片也可以试试看(我没有这俩机器,欢迎大家反馈测试结果,当然这俩太特殊了,我并不乐观)

最后,不需要任何root权限,默认权限即可使用。

当然了,这套AnyLinux打包的QEMU可玩性就比phyvirt强的多了,你可以像正常qemu一样随意组合命令,来启动你想要的系统,甚至你可以试试启动一个android

截图_qemu-system-aarch64_20260611124857.png

不过我最大的进展就是这个启动界面了,飞腾不支持任何arm64v8.0以上的特性,而aarch64的虚拟机镜像往往是为苹果的m芯片制作的,都是按8.5编译的。麒麟和鲲鹏倒可以试试看,毕竟这俩本身就是手机芯片。

Reply Favorite View the author
All Replies

No replies yet