ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Windows下用QEMU模拟ARM64安装银河麒麟V10的信创适配实践

Windows下用QEMU模拟ARM64安装银河麒麟V10的信创适配实践 做信创适配验证的时候最尴尬的一步往往不是代码问题而是手上没有一台ARM环境的机器。尤其当整个研发团队的主力机都是Windows笔记本申请一台鲲鹏服务器又要走流程、等资源项目又催着要第一轮兼容性结论这时候用QEMU在Windows上模拟鲲鹏ARM装一个银河麒麟V10就成了最务实的“救火方案”。这篇文章记录的就是我实际搭建这套信创测试环境的过程从QEMU的Windows版安装、ARM64 UEFI固件准备到银河麒麟V10 ARM64镜像的获取、虚拟磁盘创建、启动参数逐条拆解再到网络端口转发、共享目录、快照回滚这些测试环境必备的“周边设施”。最后会把我踩过的坑和排查思路整理成一份速查表给同样在Windows下做信创适配验证的朋友参考。1. 需求拆解为什么要在Windows上用QEMU跑ARM版麒麟V101.1 做信创验证时最缺的就是环境信创测试环境里绝大多数被测软件目标平台是ARM64架构尤其是以鲲鹏生态为基准的服务器和桌面终端。但实际开发阶段团队能拿到的资源往往和最终部署环境差着十万八千里Windows办公本、x86开发机、云上临时开的虚拟主机。等到软件编译完、打包完准备做“能不能在目标环境上跑起来”的验证时才发现没有一台ARM机器可以用。实体鲲鹏服务器当然是最优解但它有两个现实问题一是数量少通常放在测试机房或者特定区域研发人员想随时连上去装个依赖、看个日志网络和权限都不一定允许二是申请周期长有些流程环节一卡就是好几天。对于第一轮“架构兼容性粗筛”来说为这么个简单目标去等一台物理机性价比实在太低。这时候QEMU的价值就体现出来了。QEMU是一个全系统模拟器可以在x86的Windows主机上模拟出一台完整的ARM64虚拟机CPU、内存、磁盘、网卡、显示芯片都由软件模拟guest系统完全感知不到自己运行在非ARM硬件上。把银河麒麟V10的ARM64镜像装进去得到一个逻辑上和鲲鹏服务器几乎等价的系统环境用于应用安装测试、依赖库验证、基础命令兼容性检查完全够用。1.2 QEMU跨架构模拟能做到什么、做不到什么先说能做到的。QEMU的TCGTiny Code Generator动态二进制翻译机制会把ARM64指令逐块翻译成x86指令执行。跨架构运行Linux发行版、启动systemd、运行Java或Node.js、安装MySQL、跑Python脚本这些操作系统层面和软件层面的功能逻辑QEMU都能真实模拟软件看到的CPU信息是ARM64架构uname -m输出是aarch64glibc选的是ARM64版本JVM加载的是aarch64的libjvm.so——这些都是真实可控的验证点。再说做不到的。TCG翻译带来的性能开销是实打实的CPU密集型任务性能通常只有真机的五分之一甚至更低io吞吐、网络转发效率也和真实硬件差距明显。所以QEMU模拟环境适合做“能不能跑”“功能对不对”“依赖全不全”这类的适配性验证不适合做性能基准测试、高并发压测和长时间稳定性考核。这一点在项目汇报时要提前说清楚避免业务方把“QEMU下能跑”直接等同于“生产环境能扛住”那是两码事。2. 环境准备Windows下QEMU组件选型与镜像获取2.1 安装QEMU Windows版并确认aarch64支持Windows下最常用的QEMU发行版是qemu.weilnetz.de编译的安装包QEMU官网的Windows下载入口也是指向它的。下载当前稳定版本8.x或9.x均可不必追最新安装时注意两点一是安装路径建议不要带空格比如直接装到C:\qemu后面写启动脚本时能省掉很多多余的引号二是安装过程中记得勾选添加环境变量的选项或者安装完成后手动把C:\qemu加入PATH。安装完打开cmd或PowerShell先验证一下有没有装对组件。QEMU是一套多架构模拟器的集合我们要用的是ARM64系统模拟器可执行文件名是qemu-system-aarch64.exe。如果只装了带图形界面的默认组件这个文件一定会出现别误装了qemu-system-x86_64就去跑ARM镜像那会直接提示无法识别文件格式。qemu-system-aarch64.exe --version能正常打印版本号说明基础环境就绪。另外顺手确认一下安装目录下有没有share文件夹里面应该能找到edk2-aarch64-code.fd这类UEFI固件文件这是下一节的关键依赖。2.2 UEFI固件与机器模型选型x86架构的虚拟机有现成的BIOSQEMU可以像真实主板一样开机引导。但ARM64的virt机器模型没有固定的固件芯片必须由QEMU加载一份UEFI固件虚拟机开机后才能走到硬件初始化、引导GRUB、加载内核这一步。这一步最容易出问题固件缺失或版本不对启动后大概率直接停在UEFI Shell或者黑屏连安装界面都看不到。推荐使用QEMU安装目录自带的edk2-aarch64-code.fd如果找不到也可以单独下载edk2项目针对QEMU的编译产物文件名通常是QEMU_EFI.fd。两种叫法本质都是ARM64 UEFI固件用法上通过-drive ifpflash参数加载即可。加载固件时建议设置readonlyon避免虚拟机内对固件分区的写入污染这个基础文件。机器模型选择上ARM64虚拟化最通用的是virt这是QEMU针对ARM架构专门设计的虚拟化机器模型设备总线干净、virtio设备支持完整装了virtio驱动后磁盘和网络的性能都比模拟老旧设备好得多。CPU模型方面如果追求贴近鲲鹏920的指令集特性用-cpu max最稳妥它会开放QEMU能模拟的所有ARMv8扩展特性如果用-cpu cortex-a72或-cpu cortex-a76更接近具体处理器型号但某些新指令特性可能缺失影响个别软件的适配验证结果。2.3 银河麒麟V10 ARM64镜像获取与校验银河麒麟V10按使用场景分为桌面版和服务器版桌面版面向办公终端服务器版面向数据中心二者提供的安装镜像不同软件包仓库也有差异。做信创适配验证前先想清楚目标环境如果你的交付物是办公终端上的客户端软件或办公套件就下载桌面版如果是中间件、数据库、运维平台这类服务端软件直接下服务器版省得后面装依赖时缺系统库。镜像可以从银河麒麟官方渠道申请评估版下载时务必看清架构标识确认文件名或下载页面标注了arm64。经常有人手滑下了x86_64的镜像拿给QEMU启动时QEMU会直接报“Invalid ELF image”或者启动后一段黑屏排查半天才发现架构选错了。镜像下完之后按官方提供的SHA256校验一下完整性再开始安装避免下载过程损坏导致安装中途崩溃。3. 从零到一创建虚拟磁盘并完成系统安装3.1 qemu-img创建qcow2虚拟磁盘系统装到哪里首先要创建一个虚拟磁盘镜像文件。QEMU支持raw、qcow2、vdi等多种磁盘格式这里强烈推荐qcow2。qcow2格式有两个明显优势一是按需增长创建时指定最大容量实际使用多少占多少一开始只占几百MB磁盘空间二是天然支持快照后面做系统变更前可以一键记录状态测试出了问题秒回滚。以60GB磁盘为例创建命令如下qemu-img create -f qcow2 kylin-arm64.qcow2 60G如果你打算把这个测试环境在团队内多人复用qcow2镜像可以直接压缩打包分发比raw格式的单个大文件灵活得多。磁盘大小建议留足麒麟V10桌面版安装完大概占8~10GB但后续要装开发工具、数据库、中间件等测试软件空间会涨得很快60G起步比较从容。3.2 首次启动命令逐段拆解准备好固件、磁盘和ISO镜像之后就可以启动第一台虚拟完成了。Windows下我习惯写一个bat脚本管理启动参数路径上省心得多。下面这条命令覆盖了安装系统时需要的全部核心参数qemu-system-aarch64.exe ^ -M virt ^ -cpu max ^ -smp 4 ^ -m 4096 ^ -drive ifpflash,fileC:\qemu\share\edk2-aarch64-code.fd,formatraw,readonlyon ^ -drive ifvirtio,fileC:\vms\kylin-arm64.qcow2,formatqcow2,cachewriteback ^ -drive fileC:\vms\Kylin-Desktop-V10-SP2-ARM64.iso,mediacdrom,readonlyon ^ -device virtio-net-pci,netdevnet0 ^ -netdev user,idnet0,hostfwdtcp::2222-:22 ^ -vnc 127.0.0.1:1逐段说明参数的作用。-M virt指定机器模型为virt-cpu max开放全部可模拟的ARM CPU特性-smp 4分配4个vCPU-m 4096分配4GB内存这两个数值可以根据宿主机资源调整TCG模式下建议至少4核4G起步否则安装过程会慢到怀疑人生。固件加载用的是ifpflash系统磁盘用了virtio接口速度优于模拟IDE。一条-drive参数对应一个存储设备ISO镜像通过mediacdrom挂载成光驱。网络使用user模式这是SLIRP实现的用户态NAT网络guest通过DHCP获取IP能访问外网宿主机通过hostfwd把2222端口转发到guest的22端口后面SSH连接管理全靠这个。显示方面用了VNC监听在本地5901端口-vnc 127.0.0.1:1比-vnc :1更安全不会暴露到局域网。Windows本机可以用任意VNC客户端连接开始安装也可以用RealVNC、TigerVNC这类工具。3.3 安装过程中的关键操作点启动运行bat脚本后VNC客户端连接127.0.0.1:5901正常情况下能看到麒麟安装引导界面。如果连接后黑屏优先排查显卡设备参数。部分QEMU版本对VGA设备的兼容性有差异可以在启动命令中把默认显示设备换成-device virtio-gpu-pci或者加一行-vga std再试。安装流程本身和x86版本没有本质区别选择语言、配置分区、创建用户。唯一要留意的是分区方案UEFI引导需要ESP分区麒麟安装器的自动分区默认会生成不建议新手手动分区时删掉它。想省事就选“自动分区”系统会自动分配/boot/efi和根分区装完后引导可靠性最高。安装耗时方面TCG动态翻译模式下ARM64系统的安装速度大概比真机慢3~5倍桌面版全量安装可能需要40分钟到1小时这个时间正好可以去做别的任务。装完后重启前先不要急着点“Reboot”回到宿主机做一个初始快照确保得到一个干净的系统基线状态。具体快照操作见4.3节。4. 测试环境延伸网络、文件交换与快照回滚4.1 让宿主机直接SSH进虚机端口转发配置安装完系统后很多人习惯直接在VNC界面里操作但真正的测试过程必然涉及从宿主机传文件、执行脚本、查看日志这时候SSH才是正确选择。前面启动命令里已经配置了hostfwdtcp::2222-:22也就是说guest内的SSH服务监听22端口会被QEMU映射到宿主机的127.0.0.1:2222端口。先在guest系统里确认SSH服务状态麒麟V10桌面版和服务器版一般都自带openssh-server如果没有就启动一下sudo systemctl enable --now ssh然后在Windows宿主机执行ssh -p 2222 user127.0.0.1能连上就说明端口转发链路通畅。之后测试过程中需要往guest里拷安装包、取日志都用scp或sftp搞定比反复挂载ISO方便得多。如果你想同时暴露多个端口比如测试Web服务可以在-netdev user参数后面追加多个hostfwd项例如hostfwdtcp::8080-:80原理完全一样。4.2 宿主与虚机共享文件的三种方式实际做适配测试时最常用到的场景是把Windows宿主机上的软件安装包传进麒麟系统。根据文件大小和使用频率有三种方式可以选。第一种是SSH传输直接用scp命令或WindTerm、MobaXterm等工具的SFTP面板适合中小文件操作直观缺点是大文件传输效率一般。第二种是ISO挂载把打好包的文件做成ISO通过-drive filexxx.iso,mediacdrom挂载进去在guest里mount使用适合一次性大批量交付的离线安装包集合。第三种是virtio-9p共享目录需要在启动命令里增加-fsdev local,security_modelmapped-xattr,idfsdev0,pathD:\share ^ -device virtio-9p-pci,fsdevfsdev0,mount_taghostshareguest系统挂载命令sudo mkdir -p /mnt/host sudo mount -t 9p -o transvirtio,version9p2000.L hostshare /mnt/host挂载成功后宿主机D:\share目录的内容就实时可见了。9p方式适合开发调试时频繁交换代码和小文件但性能一般不要拿它做大规模数据导入。三种方式没有绝对优劣我是按“日常小文件走ssh、批量离线包走ISO、开发调试走9p”的原则组合使用。4.3 快照与恢复测试高危软件前的保命手段信创适配测试免不了要装各种来历不明的软件包、跑各种依赖冲突的组件装完不满意想回到之前的状态在真机上只能重装系统效率极低。QEMU的qcow2快照机制就是为了解决这个场景准备的。创建快照qemu-img snapshot -c baseline kylin-arm64.qcow2查看快照qemu-img snapshot -l kylin-arm64.qcow2回滚快照qemu-img snapshot -a baseline kylin-arm64.qcow2注意qemu-img snapshot命令操作前必须确保虚拟机关机在guest运行时直接回滚会损坏磁盘元数据。虚拟机运行状态下可以通过QEMU monitor的savevm和loadvm命令做热快照但Windows下操作稍麻烦我习惯的做法是每完成一个清晰的测试阶段关机拍一个snapshot再开机继续下一轮。具体到流程就是系统刚装完、基本软件配置齐全后打一个baseline快照每轮测试新的中间件前打一个pre-test快照测试后如果需要回到干净状态直接-a baseline回滚两分钟复活比在真机上重装系统节省的时间不是一点半点。5. 常见问题速查与性能优化建议5.1 六个高频问题及排查方法搭建过程中遇到的问题五花八门但绝大多数都集中在这六个方向。整理成表方便对照排查。现象可能原因解决思路启动后黑屏VNC无画面显卡设备兼容性问题换用-device virtio-gpu-pci或-vga std启动进入UEFI ShellARM64固件未正确加载确认pflash参数指向edk2-aarch64-code.fd安装界面卡死无响应内存或CPU资源不足提高-m和-smp关闭宿主机高负载程序guest内看不到网卡内核缺virtio-net驱动改用e1000e网卡模型尝试或更新guest内核宿主机SSH连不上guesthostfwd端口未拉起检查-netdev user参数确认guest内SSH服务已启动重启后无法引导系统ESP分区丢失或固件变量不可写重装时保留ESP分区或pflash去掉readonly试一次其中第二项“进入UEFI Shell”是ARM64虚拟化新手最容易卡住的地方。UEFI Shell说明固件正常加载了但找不到可引导设备常见原因是ISO未正确挂载或磁盘上没有安装引导程序。排查时先确认-drive filexxx.iso,mediacdrom这行参数存在再确认开机后VNC画面里能看到光驱设备两者都没问题才考虑分区引导的问题。5.2 让TCG模式跑得更顺的经验Windows宿主上跑ARM64 guest没有KVM可用QEMU底层只能走TCG动态翻译性能天花板就在那里。但合理分配资源体验差距还是可以明显拉开的。CPU分配上QEMU 8.0以后默认启用了多线程TCG多核guest能真实利用宿主机的多个CPU核心所以-smp 4甚至-smp 8都值得给代价是启动瞬间宿主机CPU占用率会被拉高这是正常的。内存分配上guest内存越大页缓存命中率越高编译软件、启动JVM的体验越接近真机建议8G起步宿主物理内存16G以上的机器完全扛得住。安装阶段如果想提速可以临时去掉桌面组件服务器版安装时选择“最小化安装”软件包数量少、安装时间短装好后再按需补装。系统安装完成后进入桌面环境第一件事是关闭动画和桌面特效麒麟V10的桌面特效在TCG模式下是性能杀手。另外磁盘IO方面qcow2的cachewriteback模式可以小幅提升随机写性能但牺牲了一点崩溃一致性测试环境完全可以接受。5.3 这个环境适合验证什么和不该验证什么最后给这套环境画个清晰的边界。它适合做的验证包括ARM64架构的软件能不能安装、能不能启动、核心功能是否正常依赖库JDK、Python、glibc版本相关是否匹配Linux环境变量、服务配置、文件系统权限是否符合预期应用代码在ARM64下有没有隐性的字节序或指针宽度问题。这些正是信创适配第一轮最关心的问题。它不适合也不能替代的验证包括性能基准测试、压力测试、长时间稳定性测试以及依赖GPU硬件加速的场景。TCG模拟下CPU算力损失巨大IO也是模拟出来的这些测试结果没有参考价值反而会误导决策。所以我的建议是QEMU环境作为“第一道筛子”把明显的兼容性问题在本地就暴露掉真正过筛的软件再申请真机做性能复核两相结合信创验证流程的效率和准确度都能兼顾。我在实际搭建这套环境的后期已经把baseline快照做成了团队共享资产新同事加入不再需要从零走一遍安装流程直接拷贝qcow2文件加一条启动命令就能开工。信创适配验证工作本质上拼的是“快速试错”的能力而Windows宿主加QEMU模拟ARM加麒麟V10这个组合恰好给了团队一个不占硬件资源、随时可复现的试错沙箱。如果你正在为手头没有ARM真机发愁照着这篇文章把环境搭起来至少能先把第一轮适配验证跑出个结果。
返回列表