ARTICLE DETAIL

资讯详情

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

Windows上用QEMU模拟ARM环境运行银河麒麟V10的完整指南

Windows上用QEMU模拟ARM环境运行银河麒麟V10的完整指南 这段时间一直在折腾信创适配手头一时半会儿申请不到鲲鹏真机只有一台跑着Windows的笔记本而项目要求在银河麒麟V10上验证ARM兼容性。说实话一开始心里挺没底的申请云上的ARM实例走了大半天流程还没批下来后来索性试了另一条路用QEMU在Windows里模拟aarch64架构把银河麒麟V10的ARM版镜像直接跑了进去。实测下来这条路完全走得通装系统、装中间件、跑测试用例、日常联调都能干而且整套环境可复制、可快照、可回滚。这篇文章就把完整过程梳理一下。面向的读者很明确做信创适配、软件迁移、国产化验证的开发和测试同学你们手头可能没有鲲鹏服务器但确实需要提前验证ARM平台上的兼容性那这套模拟环境就是性价比最高的起步方案之一。1. 方案选型为什么我在Windows上搞ARM模拟1.1 信创适配测试的现实困境搞过信创适配的人应该都有同感最大的瓶颈往往不是技术而是“没有机器”。鲲鹏这类ARM服务器审批周期长很多团队在拿到真机之前就已经积压了一堆待验证的问题比如“这个Java中间件在aarch64上能不能跑起来”“这个数据库驱动有没有ARM版本”“这套部署脚本在麒麟系统上会不会有路径问题”。这些问题如果全靠等真机来了再验证整个项目的节奏都会被拖垮。所以本地先有一个能跑的ARM环境价值非常大。它不需要多高的性能只要指令集是ARM的、操作系统是银河麒麟V10、软件能正常装上去、跑起来那大部分“兼容性”层面的问题就能提前暴露。真机到位后再把同样的验证流程重跑一遍做最终确认就能把等待真机的时间成本压缩到最低。1.2 QEMU能模拟到什么程度QEMU在这套方案里的角色是“指令集翻译器”。我们宿主机是x86_64的Windows目标guest是aarch64的Linux系统QEMU做的事情就是逐条把ARM64指令翻译成x86指令然后在本地CPU上执行这个过程叫TCG动态二进制翻译。有人可能会纠结“QEMU模拟的是cortex-a72不是真正的鲲鹏920这能算数吗”。这个担心有道理但要分清场景。在指令集层面鲲鹏920是ARMv8架构QEMU模拟的cortex-a72同样实现ARMv8-AArch64指令集所以一个软件如果是因为架构不兼容跑不了在QEMU模拟环境里一样会暴露。但QEMU模拟不出鲲鹏专属的硬件特性比如缓存层次、访存带宽、鲲鹏协处理器所以涉及性能基准、硬件调优的测试就别指望它了。一句话功能兼容性测试可信性能测试不可信。1.3 三种方案的对比选型接触过一圈方案之后我把几种常见路线的优劣势整理成了一张表给后来人一个直观参考方案成本上手速度与真机一致性适合场景申请鲲鹏物理机/信创整机高审批周期长慢最高性能测试、真机验收、最终兼容性确认公有云ARM云主机中按量付费中需开白名单高需要高一致性且能接受云上环境Windows本地QEMU模拟低免费快半天起步中指令集一致性能有差距日常功能验证、脚本测试、中间件部署演练我最终选了Windows本地QEMU核心原因就两个一是快当天就能把环境跑起来二是零成本一台普通办公电脑就够了。另外它在团队里有个额外好处——同一套脚本和命令可以拷给其他人大家各自在笔记本上搭环境互不占资源。2. 环境准备镜像、QEMU、UEFI固件一次备齐2.1 Windows宿主机最低要求虽然QEMU是软件模拟对硬件没有特殊要求但体验好不好还是跟配置有关。我这边实际用下来的感受是CPU只要支持虚拟化指令集就行内存建议至少8G预留4G给虚拟机硬盘剩下40G以上空间。如果内存只有4G虚拟机分2G也能跑但那体验就比较挣扎了开个桌面都可能卡。另外有个小细节容易忽略Windows的实时防护和杀毒软件可能会扫描QEMU启动时生成的大文件导致启动变慢。我建议把虚拟磁盘目录加入杀软的白名单能明显减少卡顿。这个问题在后面的踩坑章节还会提到。2.2 银河麒麟V10 ARM64镜像从哪获取银河麒麟V10分桌面版和服务器版两个版本都提供x86_64和aarch64两种架构的ISO镜像。我们的目标很明确找文件名里带aarch64或arm64标识的那个。获取渠道我建议走官方申请银河麒麟官网有试用版下载入口提交信息后一般很快就能拿到下载链接。这里要特别提醒一句网上有些第三方分享的镜像一定要谨慎一方面不明来源的镜像可能存在被植入后门的风险另一方面版本不完整会导致安装中途报错。我们做信创适配尤其要养成习惯基准环境越干净后面排查问题越容易。如果公司有正式的麒麟授权渠道优先走那条路拿正式镜像。2.3 安装QEMU for WindowsQEMU在Windows上有官方安装包直接在qemu.org下载装的过程没什么特殊选项安装完成后记得把qemu-system-aarch64.exe所在目录加入系统PATH方便在任意路径下执行命令。安装目录默认在C:\Program Files\qemu之类的位置具体看版本。安装完验证一下qemu-system-aarch64 --version能正常输出版本号就说明安装成功。注意不要误用qemu-system-x86_64.exe我们要的是aarch64版本两个是独立的可执行文件。2.4 UEFI固件准备与校验这一步是新手的头号拦路虎很多人卡在这里半天找不到原因。银河麒麟V10的aarch64镜像采用的是UEFI方式启动但QEMU的virt虚拟平台默认不带UEFI固件如果直接启动ISO界面会一片黑什么输出都没有。所以我们需要额外准备一份ARM版的UEFI固件文件名字通常是QEMU_EFI.fd。这个文件可以从Linaro的UEFI发布页或者edk2的预编译产物里找下载后建议放在一个专门的目录和虚拟磁盘放一起。文件本身不大几MB但它的作用至关重要——没有它后续所有步骤都是白搭。拿到固件后可以简单校验一下大小和格式如果是4MB左右的文件基本就没问题。后面启动命令里通过-bios QEMU_EFI.fd参数把这个固件交给QEMU。补充说明一下网上有些教程用的是双pflash做法也就是把固件拆成QEMU_EFI.fd和QEMU_VARS.fd两个文件分别存放只读固件和非易失性变量。这种做法更接近真实UEFI启动流程但对我们装系统来说用-bios参数指定固件已经够用我不会在基础步骤里把它搞复杂。3. 实操全流程创建磁盘、启动安装、验证系统3.1 用qemu-img创建虚拟磁盘安装系统之前先生成一块虚拟磁盘。我比较推荐用qcow2格式因为它的好处非常贴合我们这种测试场景按实际使用量增长一开始建立的文件很小支持快照以后如果要把环境拷到别的机器也方便。创建40G虚拟磁盘qemu-img create -f qcow2 kylin-arm.qcow2 40G为什么是40G银河麒麟V10装完系统大概占用十几G剩下留给中间件、日志、测试数据。如果你打算在里面装MySQL、Zabbix这类偏重量级的服务40G是一个比较稳妥的起步值。磁盘文件初始只有几百KB之后慢慢变大不用担心一下子占满宿主机磁盘。3.2 首次启动安装命令逐段拆解启动安装的完整命令如下我拆开讲每一段的作用方便你根据自己的情况调整qemu-system-aarch64 ^ -M virt ^ -cpu cortex-a72 ^ -smp 4 ^ -m 4096 ^ -bios QEMU_EFI.fd ^ -device virtio-gpu-pci ^ -display gtk ^ -device qemu-xhci -device usb-kbd -device usb-mouse ^ -drive filekylin-arm.qcow2,ifvirtio,formatqcow2,cachewriteback ^ -cdrom Kylin-V10-SP2-aarch64.iso ^ -netdev user,idnet0,hostfwdtcp::2222-:22 ^ -device virtio-net-pci,netdevnet0逐个参数说清楚-M virt指定QEMU的虚拟平台为virt。这是QEMU针对ARM设计的通用开发板平台对virtio设备支持很好也是跑Linux发行版最常用的选择。-cpu cortex-a72指定模拟的CPU型号。AArch64指令集下比较通用的选择避免用max这种全特性模式在某些系统上引发CPU特性探测问题。-smp 4 -m 40964核4G内存。QEMU模拟ARM本身就是性能瓶颈这里如果再抠内存和核数安装过程会慢到怀疑人生。继续往下看-bios QEMU_EFI.fd加载UEFI固件这是能启动银河麒麟V10镜像的关键。-device virtio-gpu-pci添加半虚拟化显卡。virt平台本身没有固定显卡不加这个参数图形界面就出不来。-display gtk在宿主机上弹出图形窗口。-device qemu-xhci -device usb-kbd -device usb-mouse添加USB控制器和键鼠。这行是针对ARM虚拟机的特别设置virt平台没有传统的PS/2接口如果不加USB键鼠安装界面里鼠标键盘都会失灵看起来像“卡死”了其实是输入设备根本没接上。存储和网络-drive filekylin-arm.qcow2,ifvirtio,formatqcow2,cachewriteback指定系统盘走virtio接口。银河麒麟V10的内核自带virtio驱动不用担心安装器找不到盘。cachewriteback对模拟环境磁盘性能有一些帮助后面会细说。-cdrom Kylin-V10-SP2-aarch64.iso挂载安装镜像。-netdev user,idnet0,hostfwdtcp::2222-:22创建user模式网络并把宿主机2222端口转发到虚拟机的22端口这样装完系统就能从Windows直接SSH进虚拟机。-device virtio-net-pci,netdevnet0网卡走virtio性能比模拟网卡高不少。如果是Windows终端里跑路径含空格的地方记得加引号比如C:\Program Files\qemu\qemu-system-aarch64.exe。我用的是换行^拼接命令你完全可以写成一行。3.3 走一遍安装流程分区、用户、重启命令启动后会弹出GTK窗口看到银河麒麟V10的安装引导界面。安装界面是中文的流程和大多数Linux发行版类似没有特殊门槛。我走了一遍有几个地方值得提醒第一磁盘分区。这步如果不熟直接选自动分区就行安装器会自己处理好在虚拟磁盘上创建分区。如果你想手动分区至少要预留一个挂在/的分区和一个swap分区UEFI模式下还需要一个EFI系统分区。说实话在测试环境里手动分区意义不大自动分区省心很多。第二软件包选择。安装器会让你勾选要安装的组件默认的桌面环境就够日常使用。如果只做服务器用途可以选最小化安装装完再按需补充。做兼容性测试的话我通常装带桌面的版本方便开浏览器看页面效果。第三创建用户和密码。注意用户名尽量用英文字母避免后面一些脚本在处理中文用户名时踩坑。root密码可以同时设置因为有些测试操作需要切root。安装过程大概10到20分钟取决于宿主机CPU性能。期间可以看到进度条走动如果窗口看似没反应别急着关打开任务管理器看看QEMU进程的CPU占用只要CPU在忙就是在干活。装完后安装器会提示重启这时候直接关掉窗口去掉-cdrom参数重新启动即可。重启后如果提示找不到引导设备多半是UEFI固件的启动变量没有正确写入后面排查章节会展开说。3.4 安装后的正常启动脚本系统装好后日常启动就不需要挂载ISO了。我把启动命令存成了一个start-kylin.bat放在虚拟磁盘同目录下每次双击就起环境qemu-system-aarch64 ^ -M virt ^ -cpu cortex-a72 ^ -smp 4 ^ -m 4096 ^ -bios QEMU_EFI.fd ^ -device virtio-gpu-pci ^ -display gtk ^ -device qemu-xhci -device usb-kbd -device usb-mouse ^ -drive filekylin-arm.qcow2,ifvirtio,formatqcow2,cachewriteback ^ -netdev user,idnet0,hostfwdtcp::2222-:22 ^ -device virtio-net-pci,netdevnet0对比安装命令只少了一行-cdrom。这套命令是后续所有工作的基线建议保存好。3.5 系统验证确认这是真正的aarch64环境系统启动后在终端里跑几个命令确认环境正确这一步别偷懒uname -m输出的aarch64告诉你当前内核运行在ARM64指令集上。接着看系统版本cat /etc/os-release能明确看到系统是银河麒麟V10。再看CPU信息lscpu | grep Architecture同样应该是aarch64。到这里一个可用的信创模拟环境就搭起来了。后面无论是编译ARM版程序、部署中间件还是跑测试用例都是在这个环境里进行。4. 网络、共享文件与性能优化4.1 user模式NAT与SSH端口转发先解释一下user模式网络到底是什么。QEMU在用户态实现了一个轻量级的NAT网络虚拟机内部看到的IP通常是10.0.2.15网关是10.0.2.2DNS是10.0.2.3。虚拟机访问外部网络时QEMU把包转发给宿主机的网络栈整个过程对宿主机网络环境没有任何侵入性也不需要管理员权限。我建议安装完系统之后第一件事就是验证SSH连接因为日常操作里图形窗口只是辅助大多数时候还是SSH进去干活更顺手。在宿主机上执行ssh -p 2222 用户名127.0.0.1能连上就说明端口转发正常工作。这个端口映射的思路还可以扩展比如以后要给虚拟机做HTTP服务调试就再加一个hostfwdtcp::8080-:80把虚拟机的80端口映射到宿主机8080。如果用user模式网络访问不了外网先别急着怀疑网络配置在虚拟机里检查一下路由和DNSip route ping -c 3 10.0.2.2 echo nameserver 10.0.2.3 | sudo tee /etc/resolv.conf如果直连宿主机网关能通说明NAT链路没问题剩下的就是DNS配置问题。4.2 让虚拟机和宿主机共享文件做适配测试时经常要把宿主机上的安装包装进虚拟机。我有三种方案按推荐优先级排最省事的是scp。在宿主机的PowerShell里scp -P 2222 安装包.tar.gz 用户名127.0.0.1:/home/用户名/这条命令走的就是SSH通道不需要额外配置传个几百兆的安装包完全没问题。第二种方案是QEMU的virtfs 9p共享目录。这是QEMU直接提供的共享机制启动命令里加一行-virtfs local,pathE:\share,mount_taghostshare,security_modelnone,idshare0虚拟机里挂载sudo mkdir -p /mnt/share sudo mount -t 9p -o transvirtio hostshare /mnt/share挂载成功后/mnt/share就是宿主机的E:\share目录。这个方案的好处是双向共享实时生效适合两边同时编辑文件的开发场景。要注意的一点是security_modelnone在Windows路径配合下权限处理比较宽泛方便是方便但共享目录里的文件安全性就别指望了只放非敏感文件。第三种方案是单独创建一个数据盘镜像挂进虚拟机像插U盘一样。这个适合测试环境传递和归档但步骤比前两种繁琐日常用得少。4.3 模拟环境性能优化清单在性能这条路上我实测下来最有效的是下面几个调整按收益排序第一-cpu cortex-a72后面可以尝试-accel tcg,threadmulti。这个参数让QEMU使用多线程执行TCG翻译任务在宿主机多核对模拟性能的提升是最直观的。启动命令里加上这段实测编译和安装软件时的负载能更均匀地分布到多个CPU核心上。第二磁盘缓存设成cachewriteback。默认的缓存模式在写操作多的时候会有明显的卡顿改成writeback后磁盘写入的表现会稳定不少。极端情况下也可以试cachenone但这会把更多IO压力直接打到宿主机磁盘上Windows宿主机磁盘不好的话反而更慢。第三如果系统跑起来感觉卡先看虚拟机的内存。现在桌面系统4G内存只是“能跑”要是再同时开着浏览器和中间件swap一频繁就卡得没法用。有条件的把-m调到8G体验完全是两个档次。第四善用qcow2快照。做测试之前先打个快照改坏了系统分分钟回滚这比重新装一遍系统省太多事。关机状态下执行qemu-img snapshot -c base kylin-arm.qcow2回滚时用-a base即可。我在做中间件部署测试时几乎每次都打快照这个习惯强烈推荐。5. 实战踩坑记录与排查速查表5.1 黑屏、无画面、鼠标键盘失灵模拟环境启动后屏幕全黑是第一道拦路虎。排查思路从简到繁先确认命令里有没有-device virtio-gpu-pci。我用GTK窗口输出图形时缺了这行参数就是纯黑屏QEMU报了显卡相关错误但窗口还在。加上后正常。然后再看-bios QEMU_EFI.fd。如果固件文件本身下载不完整QEMU可能直接无输出。我踩过一次下载的QEMU_EFI.fd只有几百KB明显是下载没成功重新下载一个完整的就好了。还有一个经常发生的情况窗口弹出来了但鼠标点不动、键盘没反应。这不是死机而是缺少USB键鼠设备。确认命令里有-device qemu-xhci -device usb-kbd -device usb-mouse这整段。或者改用VNC方式连进去看-vnc 127.0.0.1:0然后用任意VNC客户端连127.0.0.1:5900VNC客户端的鼠标键盘输入和QEMU窗口是两条链路有时候窗口显示异常但VNC里是好的。5.2 安装器不认磁盘如果银河麒麟V10的安装界面里看不到虚拟磁盘八成是磁盘接口的问题。虽然我说过麒麟内核带virtio驱动但我自己在不同版本镜像上都遇到过偶发看不到盘的情况。这时候把磁盘接口换回IDE或SATA命令改成-drive filekylin-arm.qcow2,ifide,formatqcow2这样性能会略差一点但安装阶段完全够用装完再改成virtio也可以。如果你确认系统里面其实有virtio驱动也可以保持virtio接口只是得在安装器里手动加载驱动那个环节更折腾不如直接换接口来得快。5.3 能启动但网络不通虚拟机起来了IP地址拿不到或者能ping通网关但上不了外网这是user模式网络最常见的两类问题。如果虚拟机里ip addr看不到eth0先检查QEMU启动命令里是否同时有-netdev user和-device virtio-net-pci这两个配套参数。只写了-device virtio-net-pci忘记写-netdev网卡设备存在但没有任何后端网络接上系统自然拿不到IP。如果网卡存在、IP也有但ping不通域名优先检查DNS。uuser模式默认的DNS是10.0.2.3确认/etc/resolv.conf里有没有这个地址。有时候系统安装时写入的DNS是别的网段改回10.0.2.3就好了。这里补一个高进阶选项如果你的办公网络有条件可以在Windows上装TAP驱动然后用-netdev tap,idnet0,ifnametap0让虚拟机直接桥接到局域网这样虚拟机就能从公司DHCP获取独立IP别人也能直接访问它。但配置TAP需要管理员权限还涉及Windows网络共享设置比较复杂。日常测试用user模式就够了别在这个上面耗太多时间。5.4 磁盘IO慢到令人崩溃模拟环境里磁盘慢是常态但如果慢到装个软件都要等半天就是配置问题而不是“模拟就是慢”。我遇到过最离谱的一次是虚拟机磁盘操作响应间隔几十秒后来发现是Windows杀毒软件在实时扫描qcow2文件每次都把整个镜像文件读一遍。解决方式前面提过把虚拟磁盘目录加入白名单磁盘性能立刻恢复。另一个常见问题是忘了cachewriteback。默认缓存策略在写多读少的适配测试场景里表现很差加了这个参数后明显改善。如果还觉得慢给虚拟机加内存减少swap这个比任何磁盘参数都更立竿见影。5.5 常见问题速查表把上面的经验浓缩成一张表方便遇到问题直接查现象可能原因处理办法启动后全黑无输出缺UEFI固件或固件损坏重新下载完整QEMU_EFI.fd确认文件大小图形窗口黑屏缺少显卡设备加-device virtio-gpu-pci鼠标键盘失灵virt平台无PS/2接口加-device qemu-xhci -device usb-kbd -device usb-mouse安装器看不到磁盘磁盘接口不兼容改成ifide虚拟机上不了网缺少netdev配套参数同时检查-netdev user与-device virtio-net-pciDNS解析失败resolv.conf配置不对设nameserver为10.0.2.3磁盘IO极慢杀软扫描镜像文件把qcow2目录加入杀软白名单系统卡顿严重内存不足触发swap把-m调到8G开机提示找不到引导UEFI启动变量丢失用-drive ifpflash双固件方式启动或重装引导5.6 哪些测试适合模拟环境哪些别抱幻想最后聊聊边界问题。用这套QEMU模拟环境我建议你把精力集中在这些场景上安装部署验证、软件兼容性检查、脚本运行测试、中间件配置演练、基础的页面功能验证。这些场景最看重的是“ARM指令集银河麒麟V10系统”的组合是否成立QEMU能给到的就是这层保障。而性能压测、并发基准、网络吞吐这类对硬件敏感的任务留着等鲲鹏真机到位再做。模拟环境的结果不能成为性能结论的依据这个认知很重要否则容易在汇报时被挑战。我在实际适配过程中已经用这套环境排查出不少真问题某个国产数据库的ARM版驱动加载失败、某个Python库在aarch64下没有预编译wheel导致源码编译报错、某个部署脚本里有硬编码的x86路径。这些问题都是先在本机模拟环境里抓出来的等真机到了以后同样的流程基本一遍就过大幅缩短了适配周期。最后再分享一个小技巧这套环境搭完别只当一次性玩具。你可以把QEMU_EFI.fd、Kylin-V10-SP2-aarch64.iso、start-kylin.bat、以及一个“干净系统未安装任何软件”的快照版本镜像都归档起来。团队里任何人需要做ARM验证直接把整个目录拷过去解压即用不需要从零开始重新折腾。等将来申请到鲲鹏真机这些在模拟环境里验证过的安装脚本和测试用例照样可以在真机上复用这才是这套模拟方案真正值钱的地方。
返回列表