ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Windows下用QEMU模拟ARM64安装银河麒麟V10全流程

Windows下用QEMU模拟ARM64安装银河麒麟V10全流程 不扯虚的先说一下我为什么折腾这个。当时接了一个信创适配的活儿软件要跑在银河麒麟V10上CPU是鲲鹏的ARM架构。可我手边没有鲲鹏服务器连一台ARM开发板都临时借不到只有一台Windows笔记本。最开始想过上云结果ARM实例要么要申请、要么环境格格不入来回折腾半天也可能没搞定。后来干脆用QEMU在Windows上直接模拟出一台ARM64机器把银河麒麟V10镜像装进去一个下午就把测试环境跑起来了。这篇文章就把这套完整的搭建过程写出来包括QEMU安装在Windows上的注意事项、AArch64 UEFI固件的准备、启动参数逐项解释、装完之后的网络配置和共享文件方案以及我踩过的一堆坑。适合手里没有ARM真机、却要提前做信创兼容性验证的同学也适合刚开始接触QEMU模拟ARM的朋友参考。1. 为什么这件事非QEMU不可很多人第一反应是Windows上装个VMware或者VirtualBox不就能跑系统了吗真不行这是两个维度的问题。1.1 常见方案各自卡在哪VMware Workstation和VirtualBox在设计上主要支持与宿主机同架构的虚拟机。你在x86的Windows上装VMware它默认只能创建x86/x64的虚拟机选客户机操作系统类型的时候根本没有ARM64这个选项。VirtualBox稍微灵活一点但它的ARM支持是指ARM主机上运行ARM虚拟机不解决x86主机模拟ARM的问题。Hyper-V也是一样的道理。Windows自带的Hyper-V底层走的是硬件虚拟化在x86平台上它只能虚拟化出x86的机器没法凭空变出一个ARM环境。WSL2则更不用说它运行的是x64内核看起来能装一些ARM的交叉工具链但底子还是x86。所以要在Windows上得到一个真正的ARM64 Linux环境QEMU是目前最靠谱、也是社区里用得最多的选择。QEMU本质上是纯软件模拟器它不依赖硬件虚拟化扩展可以做到跨架构模拟在x86上模拟ARM、在ARM上模拟x86、在x86上模拟RISC-V等等。可以把QEMU理解成一个指令翻译官。宿主机的CPU是x86架构QEMU就把ARM机器指令逐条翻译成x86指令去执行。这个过程会有性能损耗但换来的是体系结构级别的兼容真实感比什么模拟出来的壳要强得多。1.2 QEMU在信创测试中的角色定位说清楚一点QEMU模拟出来的ARM环境不是用来替代真机做性能测试的它最擅长的是做能不能装、能不能跑、日志对不对这类功能验证。你拿到一个发行版、一个软件包想知道它在ARM64上表现如何用QEMU先跑一遍成本最低也比光看文档靠谱。信创适配中很多工作其实是流程性的软件安装是否顺利、系统服务能否起来、配置项是否生效、启动日志有没有报错。这些在QEMU虚拟出的ARM环境里基本都能覆盖到而且可以随时截图、随时回滚。1.3 Windows版QEMU的成熟度很多人以为QEMU是Linux专属工具实际上Windows版维护得相当好。官方提供Windows安装包qemu-system-aarch64.exe就是专门跑ARM64系统模拟的。我当前测试用的QEMU版本是8.x后续如果出了9.x也不影响参数基本兼容。2. 开工前准备装QEMU、备固件、下载麒麟ISO这一步先把四样东西准备好QEMU本体、AArch64 UEFI固件、银河麒麟V10镜像、虚拟磁盘。缺一不可。2.1 10分钟装好QEMUWindows下装QEMU最省事的方式是用命令行包管理器。Windows 11自带的winget可以直接装winget install QEMU如果你习惯用Chocolatey也可以用choco install qemu -y装完之后把QEMU的安装目录加入PATH通常是在C:\Program Files\qemu。然后打开一个终端窗口验证qemu-system-aarch64 --version能输出版本信息就说明OK了。如果提示找不到命令多半是PATH没配上直接把QEMU安装目录手动加进系统环境变量就行。安装目录下你会看到一堆qemu-system-*.exe每个对应一种目标架构。我们用的是qemu-system-aarch64.exe这个词要记牢后面所有启动操作都靠它。2.2 最容易忽略的AArch64 UEFI固件这是整个流程里最容易卡壳的一步。QEMU默认是不带任何固件的而ARM架构和x86不一样它没有传统BIOS上电后必须由UEFI固件接管然后从UEFI引导流程去加载启动设备里的引导程序。我一开始就没准备固件直接拿着-M virt参数启动结果虚拟机开机黑屏什么反应都没有。后来才意识到缺少了ARM版的UEFI固件文件QEMU_EFI.fd系统根本走不到引导阶段。这个固件从哪里来Windows安装包里不带需要单独获取。比较常见的途径是去Linux发行版的软件仓库里提取qemu-efi-aarch64软件包包里面就有QEMU_EFI.fd。如果你手边有WSL2或者任意一台Linux机器执行apt install qemu-efi-aarch64然后在/usr/share/qemu-efi-aarch64/目录下就能找到这个30MB左右的固件文件。把它拷贝到Windows上放到一个固定目录例如E:\qemu\QEMU_EFI.fd。也可以从edk2固件的发布渠道下载只要确保是AArch64架构的UEFI固件即可。2.3 挑选银河麒麟V10镜像的坑银河麒麟V10的版本分支比较多有桌面版、服务器版还有V10 SP1、SP2、SP3这些更新版本。下载的时候一定要看清楚架构标识选择aarch64或arm64的ISO文件。我就见过有人下载了x86_64的镜像然后启动时各种报错折腾半天发现下错包了纯属浪费时间。如果你只是搭一个信创测试环境建议优先下载服务器版镜像比如Kylin-Server-V10-SP2-aarch64或类似版本。理由是服务器版对模拟环境的适配更好图形界面开销小系统也更精简QEMU动态翻译的性能压力会小一些。桌面版虽然更直观但模拟出来的图形性能比较吃力体验一般。镜像下载完成后顺手校验一下SHA256哈希Windows下用certutil -hashfile D:\iso\Kylin-Server-V10-SP2-aarch64.iso SHA256这一步不是强迫症镜像站偶尔会发生传输不完整的问题与其等到安装中途报错不如提前花十秒钟确认。2.4 创建虚拟磁盘QEMU的磁盘镜像文件用qemu-img创建。我习惯用qcow2格式因为它支持动态增长一开始只占很少的宿主空间用到多少才扩多少而且后面做快照也方便。打开命令行创建一块60GB的虚拟磁盘qemu-img create -f qcow2 E:\vm\kylin-arm64.qcow2 60G60GB听起来大但qcow2格式实际占用的空间可能就几个GB起步不用担心浪费。如果你的宿主磁盘不宽裕40GB也可以麒麟系统核心安装完大概占用8到12GB左右。3. 启动命令逐项拆解把安装界面跑起来到这里准备工作就算完成了下面进入最有技术含量的一步——写启动命令。QEMU的命令行参数非常多每条都有讲究我先把一套装系统阶段最稳的配置直接贴出来。3.1 完整启动脚本用Windows命令行cmd执行写在一行或使用^换行qemu-system-aarch64.exe ^ -M virt ^ -cpu cortex-a72 ^ -smp 4 ^ -m 4096 ^ -bios E:\qemu\QEMU_EFI.fd ^ -device VGA ^ -drive ifnone,fileE:\vm\kylin-arm64.qcow2,formatqcow2,idhd0 ^ -device virtio-blk-device,drivehd0 ^ -drive ifnone,fileD:\iso\Kylin-Server-V10-SP2-aarch64.iso,mediacdrom,idcd0 ^ -device virtio-blk-device,drivecd0 ^ -netdev user,idnet0 ^ -device virtio-net-device,netdevnet0 ^ -device nec-usb-xhci ^ -device usb-kbd ^ -device usb-mouse如果在PowerShell里运行换行符不用^直接用反引号或者干脆把所有参数挤在一行写。QEMU对单行还是多行没有要求只是多行方便阅读。执行后应该会弹出一个窗口里面先是UEFI的Logo信息然后进入银河麒麟的安装引导界面。如果有任何一步卡住先别慌参数逐个检查下面一节细讲。3.2 每个参数在干什么理解了参数含义以后定制环境就游刃有余。-M virt指定机器类型为ARM virt平台。这是QEMU为ARM虚拟化专门设计的通用主板模型类似于x86下的标准PC几乎所有ARM Linux发行版都支持这个平台。-cpu cortex-a72指定模拟的CPU型号。A72是ARMv8-A架构的经典核麒麟V10跑在上面没有问题。如果你想要更接近新硬件的特性也可以换成-cpu max让QEMU启用所有它能模拟的ARM CPU特性有些软件对特定指令集有要求时用max能提升兼容性。-smp 4和-m 4096分别指定4个虚拟CPU核心和4GB内存。模拟器的多核效果和真实多核不一样但系统能识别到对应数量的CPU对安装和对软件的配置检查是足够的。-bios指定UEFI固件就是前面提到的那个QEMU_EFI.fd。没有它系统完全起不来。接下来是磁盘和光驱的配置。-drive ifnone,file...,formatqcow2,idhd0定义了一个不直接连接到任何控制器上的磁盘然后在后面用-device virtio-blk-device,drivehd0把它挂到virtio-blk总线上。光驱也同理。为什么要绕这一圈直接ifide在某些ARM virt平台上兼容性并不理想而virtio设备是现代ARM虚拟化的标准方案性能和兼容性都更稳。网络方面-netdev user,idnet0创建了一个用户态网络后端QEMU会为虚拟机内置一个NAT网络虚拟机可以上网但外部访问虚拟机需要端口转发规则这一点后面展开。-device virtio-net-device,netdevnet0把虚拟网卡挂到virtio-net总线上。最后三个USB参数很关键。-device nec-usb-xhci创建一个USB控制器-device usb-kbd和-device usb-mouse挂上USB键盘和鼠标。安装界面里如果鼠标键盘完全没反应大多数时候是少了这套USB设备参数。3.3 系统安装过程中容易卡住的地方我第一次跑安装时就遇到黑屏进不去的状况。排查下来是缺少UEFI固件加了-bios参数就好。如果你用的是这个脚本还进不了安装界面从三个方向检查确认ISO文件确实是aarch64版本确认固件路径正确确认没有在VGA参数上瞎改。如果启动后进入了UEFI Shell而不是安装器说明引导顺序没有正确找到ISO里的引导文件。在Shell里输入fs0:切换到第一个文件系统然后ls查看内容尝试找到EFI\BOOT\BOOTAA64.EFI目录并手动执行。大部分ARM64 Linux发行版的UEFI引导文件都在这个路径。分区环节要留意一个细节自定义分区时一定要给UEFI引导保留一个EFI系统分区挂载到/boot/efi格式为vfat。如果只分根分区安装器可能不会自动生成EFI分区重启后又会掉回UEFI Shell。银河麒麟安装器默认布局一般会自动处理但如果你习惯手动分区这一点要记住。安装过程中鼠标经常会被锁在QEMU窗口里按CtrlAltG可以释放鼠标回到Windows桌面。这个快捷键对QEMU用户来说是肌肉记忆级别的存在。3.4 安装时的性能取舍建议QEMU模拟ARM属于动态二进制翻译每个ARM指令都会被翻译成x86指令再执行性能天然打折。如果你的Windows宿主机内存有16GB以上建议给虚拟机分8GB内存编译和图形界面会舒服很多。CPU核心数给4到6个即可注意在动态翻译模式下太多核心的收益不是线性的有时反而增加调度开销。我个人的经验是装图形界面版系统时内存小于4GB会明显卡顿在安装器界面都可能有严重的延迟感。如果你手头内存紧就选服务器版镜像不装图形桌面安装速度能快不少。4. 装完之后的三件事网络、SSH、系统瘦身系统安装完成、重启进入银河麒麟V10之后第一件事不是急着点开各种应用而是先把远程访问和服务环境理顺。4.1 确认虚拟机网络状态QEMU默认的用户态网络模式下虚拟机的网卡会拿到一个形如10.0.2.15的IP地址网关是10.0.2.2DNS一般是10.0.2.3。这些是QEMU内置的口径安装系统时DHCP会自动配好你登录系统后用ip addr就能看到。如果你在系统里执行ping 10.0.2.2看到通说明虚拟网络工作正常。如果要访问外网前提是宿主机本身能上网因为用户态网络最终是借宿主机网络出去的。4.2 配置端口转发彻底摆脱图形窗口长时间对着QEMU的模拟图形窗口总是不舒服窗口小、分辨率低而且鼠标偶尔漂移。最理想的姿势是跳过图形界面通过SSH连接虚拟机。做法是在启动时给网络参数加上端口转发规则把宿主机的2222端口转发到虚拟机的22端口-netdev user,idnet0,hostfwdtcp::2222-:22完整替换掉原来那一行。这样启动虚拟机后Windows宿主机上直接执行ssh root127.0.0.1 -p 2222就能进入银河麒麟的命令行了。在虚拟机一侧记得确认SSH服务已经开启systemctl enable sshd --now systemctl status sshd端口转发的好处是测试脚本、文件传输、远程运维全部走标准SSH通道不依赖图形窗口稳定性大幅提升。哪怕QEMU窗口整个最小化只要虚拟机在跑SSH连接就不会断。4.3 关闭图形服务把资源留给测试程序如果这台模拟机器是用来跑服务端软件测试的图形桌面留着纯粹浪费模拟性能。装完系统、完成基本配置之后可以切换到多用户文本模式systemctl set-default multi-user.target reboot重启后就不再进入图形登录界面系统内存占用和CPU负载都会明显下降。我在同一台Windows宿主机上测过关闭图形桌面之后软件编译和数据库安装的速度提升非常明显因为QEMU省下了大量翻译图形指令的开销。另外如果你要用QEMU的guest agent特性可以在系统里装上对应的agent包例如qemu-guest-agent。这个组件可以和宿主机QEMU通信在需要做文件系统静默、虚拟机内部关机等操作时比较好用。不过只是做常规测试的话SSH已经完全够用了。5. Windows与虚拟机之间共享文件几种方案实测对比模拟环境里测试软件免不了要在Windows宿主机和银河麒麟虚拟机之间传文件。这块我踩过不少坑专门开一章说说实测过的方案。5.1 端口转发加SFTP最省心的方案既然已经配置了SSH端口转发文件传输直接用SFTP即可无需任何额外工作。Windows自带的OpenSSH客户端支持scp命令或者直接用支持SFTP的图形客户端例如WinSCP、MobaXterm。命令行下最直接的用法scp -P 2222 D:\软件包\mysql-5.7.44.tar.gz root127.0.0.1:/opt/把Windows上的文件直接推送到虚拟机的/opt目录。反向传输同样可以从虚拟机拉到Windows。这个方案的优点是完全建立在SSH通道上可靠、加密、无额外配置缺点是走网络协议传输大文件时受虚拟网络带宽限制但几GB以内的文件完全够用。5.2 SMB网络共享接近局域网体验如果想要在虚拟机里直接挂载Windows的文件夹SMB方案更贴近日常操作。在Windows端把一个目录设置为共享然后在虚拟机里执行sudo mkdir -p /mnt/share sudo mount -t cifs //10.0.2.2/share /mnt/share -o usernameyourwindows账号,passwordyourwindows密码注意这里访问的IP是10.0.2.2也就是虚拟机的网关地址它同时代表着宿主机。实测下来Windows的SMB共享在QEMU用户网络下是可以通的但有两点要注意Windows防火墙需要放行SMB相关端口共享目录的权限和账号密码要准确否则挂载时会报权限错误。SMB方案适合虚拟机频繁读写Windows目录的场景比如直接把Windows上的源码目录挂载进虚拟机里编译。5.3 打包成ISO挂载一次性拷入大文件还有一种更离线的思路把文件打包成ISO然后挂载到QEMU的光驱上。对一次性拷贝大量文件来说这种方式反而最快。在Windows端可以用UltraISO、AnyToISO之类的工具把目录制作成ISO也可以用PowerShell脚本生成ISO。启动QEMU时把ISO作为cdrom挂上去同时在脚本里启动后进入麒麟系统挂载它mkdir -p /mnt/cdrom mount /dev/cdrom /mnt/cdrom不过这个方案只适合一次性读入如果你想持续性地在Windows和虚拟机之间交换数据还是SSH或SMB更顺手。5.4 Windows宿主机上不要指望virtiofsQEMU在Linux环境下的virtiofs共享文件性能很好但Windows版本的QEMU对vhost-user后端的支持非常有限virtiofs基本跑不起来。我试过几种Windows下的后端方案都不够稳定最后还是老老实实回归SSH和SMB。这一点提前说明省得你在网上搜到一堆Linux教程后在Windows上踩坑。6. 高频踩坑从黑屏到卡死的排查链路这条弯路我替大家走过了把常见的故障和排查顺序整理成一个清单。6.1 开机黑屏黑屏是遇到最多的现象几乎九成是三个原因固件缺失或路径不对、显示参数冲突、ISO架构选错。先检查-bios路径是否存在再确认VGA参数最后确认ISO文件名里有没有aarch64或arm64字样。如果你改了显示参数还是黑屏尝试把-device VGA换成-device virtio-gpu-pci有些新内核的发行版对virtio-gpu支持更好。6.2 卡在UEFI Shell启动后没有进入系统而是进入了Shell提示符说明引导设备没被正确识别或引导文件路径不对。这时候不要慌在Shell里手动引导。先执行fs0:进入第一个EFI分区用ls看看文件目录然后尝试运行EFI\BOOT\BOOTAA64.EFI。如果能进入安装器说明ISO没问题如果提示找不到文件顺手检查一下当前是不是fs0有时候多个文件系统时引导分区是fs1。还有一个小技巧在按顺序尝试多个文件系统前可以用map -r刷新设备映射防止设备顺序错乱。6.3 鼠标键盘完全没反应安装界面里鼠标键盘失灵通常是没有挂载USB设备。检查启动脚本里是否包含-device nec-usb-xhci -device usb-kbd -device usb-mouse这三个参数必须同时存在。如果你用的是virtio-gpu-pci也可以试试配套的virtio-input设备但USB这套最通用。安装完成进入系统后如果没有鼠标键盘多半也是启动参数问题不是系统问题。6.4 图形界面卡顿和鼠标漂移QEMU模拟ARM下的图形性能不会太好鼠标漂移也是常见现象。如果实在需要在图形界面里操作先按CtrlAltG释放鼠标再重新抓取通常会改善。系统进入桌面后关掉视觉效果。银河麒麟桌面默认的特效在模拟环境下是性能杀手可以在系统设置里把动画关闭卡顿感会缓解很多。另一个优化手段是在启动参数里改用-device virtio-gpu-pci并且安装系统自带的virtio-gpu驱动分辨率支持和刷新体验比VGA好一些。6.5 系统装完重启又进入安装器如果是安装完重启后仍然进安装器而不是进系统多半是引导顺序的问题。检查启动脚本中光驱的挂载安装完成后应该让硬盘优先启动。最简单的方式是直接重启时不带ISO或者把光驱的-drive参数从脚本中移除。QEMU默认从第一个可引导设备开始硬盘排在光驱后面的话就会先读到ISO。也可以给硬盘加上bootindex0、光驱加bootindex1来显式指定顺序。6.6 SSH端口转发连不上前面配置了hostfwdtcp::2222-:22但连不上时先确认虚拟机里的SSH服务已经启动、22端口在监听然后在宿主机上netstat -ano | findstr 2222看看端口有没有被其他程序占用最后确认你连的是127.0.0.1而不是虚拟机的IP地址。这里有个常见误会QEMU的用户网络模式下从宿主机访问虚拟机不能直接访问10.0.2.15必须通过端口转发也就是宿主机127.0.0.1:2222对应虚拟机10.0.2.15:22。先把这一点刻在脑子里能省掉一半的排查时间。6.7 虚拟系统整体性能异常慢QEMU模拟ARM本来就慢但如果到了操作一步等半天的程度就要检查资源分配了。4GB内存对服务器版来说能跑对桌面版来说就紧张。如果你的宿主机的CPU没有开启虚拟化相关特性也不影响QEMU软件模拟但整体吞吐会受宿主CPU单核性能影响很大。还有一点Windows的实时保护或者安全软件可能会在QEMU读写磁盘镜像时反复扫描拖慢IO。实测中把虚拟机目录加入Defender的排除列表磁盘性能提升非常明显。这个坑比较隐蔽我一度以为是自己给的磁盘太小其实是杀毒软件在实时扫描qcow2文件。7. 模拟环境和真实鲲鹏的差异以及还能往哪儿扩展用QEMU模拟鲲鹏ARM跑银河麒麟毕竟不等于真机。你心里要有一杆秤哪些测试结果可以采信哪些只能作为参考。7.1 哪些结论可以信哪些不能信可以信的是软件层和系统层的行为系统能不能装、服务能不能跑、依赖能不能满足、配置有没有问题、日志有没有异常、脚本能不能执行。这些测试在QEMU里的结果和真机基本一致因为用户的软件和Linux内核都是纯ARM64代码在跑只是执行方式从硬件变成了动态翻译。不能信的是性能数据和硬件外设相关的测试结果。QEMU的翻译开销意味着CPU密集型的跑分和真机完全不可比虚拟化的virtio磁盘、virtio网卡也和真机的磁盘控制器、网卡驱动完全不同。如果有软件依赖特殊硬件能力比如硬件加速卡、特定型号网卡DPDK驱动这类测试在QEMU环境里没有意义只能等真机。7.2 指令集层面的差异QEMU的-cpu cortex-a72模拟的是ARMv8-A架构而鲲鹏920处理器基于ARMv8.2架构两者在指令集细节上有所差异。如果软件在运行中出现非法指令之类的报错可以尝试把CPU参数改成-cpu max启用QEMU能模拟的全部ARM特性。对于大多数用户态软件来说这两种配置都能正常运行但遇到指令集敏感的工具链、数学库时max的兼容面更广。7.3 用它验证软件栈MySQL、Zabbix这些常见场景搭好这套环境后最常干的事就是在里面做中间件和应用的安装验证。就拿关键词里频繁出现的MySQL 5.7.44来说ARM64架构下官方提供的二进制包覆盖并不完整很多时候需要自己找源码包或者社区的ARM版本编译安装。在QEMU模拟环境里编译MySQL源码速度比真机慢不少所以建议给虚拟机加大swap空间不然编译过程中内存一紧张就会直接卡死。Zabbix 7.0这种监控系统的部署也是类似。先确认它的Zabbix Server、Zabbix Agent和数据库组件有没有aarch64版本的软件包再按照官方文档逐步安装。QEMU模拟环境在验证整个部署流程和配置项时完全够用甚至能帮你提前发现很多文档里不会写的问题。7.4 往集群和云平台方向延伸的思路如果你觉得单机QEMU还不够其实OpenStack的Nova计算节点底层用的就是QEMU。OpenStack天然支持通过Nova调度不同架构的虚拟化计算节点在数据中心里部署多架构虚拟机就是这么做的。你在Windows上用QEMU搭的这个单套环境本质上就是OpenStack里一个ARM64计算节点的最小原型——同样的镜像格式、同样的虚拟化设备模型。从单机调试到多节点分布式测试这套方法论的迁移成本并不高只是把Windows上的QEMU换成Linux服务器上的KVM加QEMU组合而已。我自己现在的习惯是每搭建一台这样的模拟机器都会在旁边放一个启动脚本start-kylin.cmd把常用参数按行写好旁边再加一行注释说明内存、CPU、磁盘路径各自对应的位置。新一轮适配需求来的时候直接复制改改路径就能用十分钟内开出一台新的ARM64测试环境。这也是文章结尾想送给你的一条实在建议这套环境最值钱的不是模拟本身而是让你在没有真机的时候也能提前把流程跑通、把坑趟平等真机到位时你已经比谁都熟悉这套系统了。
返回列表