ARTICLE DETAIL

资讯详情

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

Windows上模拟ARM运行麒麟V10:QEMU信创测试环境搭建指南

Windows上模拟ARM运行麒麟V10:QEMU信创测试环境搭建指南 做信创测试的朋友十有八九都会撞上同一个问题交付要求你的系统跑在“鲲鹏麒麟”上可手头根本没有鲲鹏服务器。我在这个事上折腾了好几轮后来试着用 QEMU 在 Windows 上模拟 ARM 架构把银河麒麟 V10 装进虚拟机整套测试环境从“申请物理机”变成了“下载文件写一条命令行”。今天把这套完整过程拆开讲QEMU 怎么装、ARM 虚机怎么建、麒麟 V10 怎么装、网络怎么打通、坑在哪里。适合运维、测试以及做信创适配的研发参考。看完你可以在普通 x86 架构的 Windows 电脑上独立拉起一个可复用的 ARM64 麒麟环境用来跑应用、装中间件、验证兼容性、做回归冒烟。1. 为什么要在 Windows 上模拟 ARM 跑麒麟 V101.1 需求场景没有鲲鹏机器怎么交付测试信创环境下的测试核心不是“操作系统本身能不能用”而是运行在其上的软件生态能不能正常工作。最典型的场景是一套业务系统原来跑在 x86 加 CentOS 上现在要求迁移到 ARM64 加银河麒麟 V10你需要验证 JDK、Tomcat、MySQL、Redis、Nginx 这些组件在 ARM 架构下能不能正常安装、启动、读写数据页面能不能打开定时任务能否如期执行。问题在于真机不常有。企业采购鲲鹏服务器要走流程临时借调也不方便更不用说测试过程中经常要重装系统、重置环境。云厂商虽然提供 ARM 实例但很多数据敏感的业务不愿意放在云端长期挂机测试更是不小的开销。所以我一开始的目标就很明确在本地 Windows 上做一套一模一样的 ARM64 麒麟环境。1.2 三种构建信创测试环境的方案对比我把自己试过的几条路线列个表结论不言自明方案真实度成本灵活性适合场景物理鲲鹏服务器100%高设备昂贵且需排队差重装系统耗时长压测、最终验收、性能基准云厂商 ARM 实例高中按时长计费一般镜像管理稍麻烦短期联调、多区域协作测试Windows QEMU 模拟 ARM指令集兼容几乎为零极好快照任意回滚开发调试、部署验证、兼容性冒烟我用的是第三种。它谈不上绝对完美但胜在“随建随用、随用随毁”。今天这个环境测坏了回滚快照五分钟又是一台干净的机器这在物理机和云主机上都做不到这么轻量。1.3 先想清楚模拟环境的适用边界这里要给读者提个醒QEMU 在 Windows 上没有 KVM 加速它靠 TCGTiny Code Generator把 ARM 指令逐条翻译成 x86 指令执行本质上是全系统模拟性能折扣很大。所以这套环境适合做功能验证、部署验证、兼容性冒烟测试不适合做大规模并发压测。我在实际用的时候把压测任务单独提出来交给别的平台日常大部分“能不能跑起来”的验证全在这台模拟机里解决。另外要注意QEMU 模拟的 CPU 是 cortex-a72、max 这类 ARMv8 通用模型不是精确模拟鲲鹏 920 内部微架构。对普通应用和中间件而言指令集兼容就足够了。凡是遇到和具体 CPU 特性强相关的底层优化、特殊固件调用还要回到真机去验证这一点在做测试方案时要写清楚。2. 环境准备硬件、QEMU、镜像一个都不能少2.1 Windows 宿主机的硬件底线建议别小看这台“模拟机”对宿主机的要求。软件模拟 ARM 指令是把双刃剑兼容性解决了但 CPU 开销全部压在 Windows 这台机器上。我的建议底线是CPUx86_64 架构4 核以上。模拟器本身是纯软件翻译CPU 越强虚机越流畅。内存16GB 起步。虚拟机要分 4GB 到 8GBWindows 自己还要占用8GB 的机器会很紧张。磁盘预留 80GB 以上可用空间。qcow2 磁盘虽然会稀疏增长但装完系统加常用软件很容易吃掉 30GB 到 50GB。系统Windows 10/11 都可以64 位版本。实测下来内存给虚拟机分配 8GB 比分配 4GB 体验提升明显尤其是安装过程中解压软件包的时候。CPU 给 4 核是性价比最高的选择再多核模拟效率提升有限反而增加线程调度开销。2.2 QEMU 安装与版本验证QEMU 在 Windows 上有官方安装包渠道并不难找。直接到 QEMU 官网的 Windows 下载页拿稳定版安装包即可。安装过程没什么技术含量一路下一步建议记住安装目录我这里是默认路径 C:\Program Files\qemu。安装完成后先验证一下工具是否可用。打开命令行窗口执行C:\Program Files\qemu\qemu-system-aarch64.exe --version看到版本号输出就说明安装成功。qemu-img 也是必须的工具用来创建虚拟磁盘C:\Program Files\qemu\qemu-img.exe --version如果你经常在命令行里操作可以把 C:\Program Files\qemu 加入系统 PATH 环境变量后面敲命令会省事很多。不加入也行但每条命令都要写完整路径这直接影响后续操作心情我建议还是加一下。2.3 银河麒麟 V10 ARM64 镜像下载与校验这里最容易踩坑银河麒麟 V10 分了桌面版、服务器版还分了 x86、ARM64 两种架构。我们要搭信创测试环境优先选服务器版下载时务必看清楚是 ARM64 架构文件名里通常带 aarch64 字样例如 Kylin-Server-10-SP2-aarch64.iso 这类命名。官方下载地址在麒麟软件官网的下载中心通过试用申请就能拿到。下载下来的 ISO 体积通常 3GB 到 4GB建议同时把发布页提供的 SHA256 校验值保存下来下载完成后用工具进行一次校验避免镜像包损坏导致安装到一半报错。在 Windows 上校验 SHA256用 PowerShell 一行就能完成Get-FileHash -Algorithm SHA256 D:\vm\Kylin-Server-10-SP2-aarch64.iso把输出值和官网公布的值比对完全一致再进入下一步。镜像文件损坏是最隐蔽的坑安装过程中报文件缺失、包解压失败折腾半天最后发现是镜像下载不完整。2.4 UEFI 固件与虚拟磁盘的准备ARM 架构的虚拟机启动方式和 x86 不一样。x86 虚拟机有 BIOS 或 UEFI 且固化在常见固件中而 QEMU 模拟 ARM 机器时必须显式提供一个 UEFI 固件文件否则开机就是黑屏。好在 QEMU 安装目录里自带了 ARM 用的 UEFI 固件文件名一般是 QEMU_EFI.fd 或 edk2-aarch64-code.fd位置就在 C:\Program Files\qemu 下。然后创建虚拟磁盘。我习惯用 qcow2 格式因为它支持稀疏占用刚创建时很小随数据增长慢慢变大和快照功能这两点后面都会用到C:\Program Files\qemu\qemu-img.exe create -f qcow2 D:\vm\kylin-arm64.qcow2 100G创建完成后会立即生成一个很小的磁盘文件后续容量按需增长。100G 是给虚拟机看到的逻辑容量并不是马上占用宿主机 100G 空间放心写。3. QEMU 创建 ARM 虚机命令参数逐段拆解3.1 完整启动命令安装模式准备就绪后第一次启动是为了安装系统此时要让虚拟机从 ISO 镜像引导。我在 Windows 的 cmd 里用 ^ 做换行写成批处理脚本。先把完整命令贴出来再逐段解释C:\Program Files\qemu\qemu-system-aarch64.exe ^ -machine virt ^ -cpu cortex-a72 ^ -smp 4 ^ -m 8192 ^ -bios C:\Program Files\qemu\QEMU_EFI.fd ^ -drive fileD:\vm\kylin-arm64.qcow2,ifnone,iddisk0,formatqcow2,cachewriteback ^ -device virtio-blk-pci,drivedisk0 ^ -cdrom D:\vm\Kylin-Server-10-SP2-aarch64.iso ^ -device virtio-gpu-pci ^ -device virtio-net-pci,netdevnet0 ^ -netdev user,idnet0,hostfwdtcp::2222-:22,hostfwdtcp::8000-:8000 ^ -device usb-ehci ^ -device usb-kbd ^ -device usb-tablet ^ -vnc 127.0.0.1:1启动前确认 D:\vm 下磁盘文件和 ISO 都存在然后执行这个脚本理论上会看到 QEMU 进程跑起来等待 VNC 连接。3.2 CPU、内存、磁盘参数为什么这样选-m machine virt 是 ARM 模拟推荐的标准虚拟机型它内部集成了中断控制器、总线、串口等设备设备模型比较干净兼容性最好。不要试图改用其他老式 ARM 机型会碰上各种荒诞的外设识别错误。CPU 这块我选了 cortex-a72。很多人问为什么不直接选鲲鹏 920 或者 maxQEMU 对越新的 CPU 模型模拟越不完善某些指令可能未实现运行到特定代码段会直接崩溃。cortex-a72 是 ARMv8-A 的成熟模型稳定可靠而银河麒麟 V10 ARM64 正是为这一代 ARMv8 指令集编译的系统兼容没压力。内存给了 8GB。前面说过4GB 能装系统但装完跑数据库加中间件会捉襟见肘。8GB 是测试环境的甜点配置宿主内存如果不足 16GB你再降回 4GB 也能凑合。磁盘参数写成 ifnone,iddisk0 再通过 virtio-blk-pci 连接是 QEMU 推荐的现代写法比直接 -hda 老接口要灵活I/O 路径也更高效。cachewriteback 允许写入缓存牺牲一点断电持久性换取明显更快写入速度对测试环境非常合适。3.3 网络和显示设备的选择要点网络用了 user 模式配合 hostfwd 做端口转发。这里整条命令最关键的部分是-hostfwdtcp::2222-:22意思是在宿主 Windows 的 2222 端口监听把所有 TCP 流量转发到虚拟机内部 22 端口也就是 SSH 端口。这样后面无论虚拟机网络怎么变化宿主机一条 ssh 命令就能把它拉起来管理。多映射了一个 8000 端口给文件互传做准备后面有专门段落讲。显示方面我用了 virtio-gpu-pci 加 VNC 组合。virtio-gpu 性能好越新的 QEMU 和麒麟系统支持越完善VNC 则让我们不需要额外装桌面环境也能看到图形安装界面。USB 键盘鼠标三件套USB-EHCI、USB-KBD、USB-TABLET也值得说一句ARM 的 virt 机器没有传统 PS2 接口不挂 USB 键盘鼠标VNC 里光标可能漂移、键盘完全没反应安装过程会直接卡死。3.4 收尾工作把启动命令封装成一键脚本每次启动都敲这么长一条命令不现实。我在 D:\vm 下建了一个 start-kylin.bat把所有启动命令放进去以后双击即可启动虚拟机。如果你之后要用图形界面而不走 VNC把最后的 -vnc 127.0.0.1:1 换成 -display gtkWindows 下会弹出独立窗口也能玩。系统安装完成后再次启动时要把 -cdrom 那行去掉否则虚拟机会优先从 ISO 引导重新进入安装程序。我通常是保留一个 install.bat 和一个 start.bat一个装系统、一个跑系统互不干扰。4. 银河麒麟 V10 安装全程实录4.1 VNC 连接并进入图形安装界面启动虚拟机后用 VNC Viewer 连接 127.0.0.1:5901。VNC 小知识命令行里 -vnc 127.0.0.1:1 最后的 1 表示显示编号实际端口是 590015901。连接成功就能看到麒麟的图形安装启动界面。第一次启动到看到安装画面大约需要 3 到 5 分钟纯软件模拟就是这么个节奏别急着关进程。如果鼠标漂移、键盘失灵八成是 USB 设备没挂好返回去检查命令里的 usb-ehci、usb-kbd、usb-tablet 三个参数。走完语言选择、安装摘要等步骤就进入磁盘分区关键环节。4.2 磁盘分区与安装源配置分区我建议用手动。自动分区的问题是你不知道它把分区表规划成什么样后期想调整很被动。手动规划按这套来理解成本和安全度都高分区大小文件系统说明/boot1GBext4存放引导内核空间充足即可swap8GBswap给编译任务和数据库缓冲的兜底内存/剩余全部ext4系统和应用全放这里安装源选择本地介质即可不需要额外配置网络仓库这一步最省心。如果安装器自动识别到 UEFI 引导分区说明我们给的固件挂了。安装过程大约 20 到 40 分钟依据宿主 CPU 性能浮动可以先去忙别的定时回来看看。4.3 系统初始化账号、SSH、软件源重启进入系统后第一件事是配置基础环境。安装过程中可以设置 root 密码建议设置清楚并记好。进入系统后打开终端做下面这几步开启 SSH 服务systemctl enable sshd systemctl start sshd确认 22 端口监听ss -lntp | grep 22在测试环境里为了方便从宿主机直接登录还需要调整 root 的 SSH 登录策略。麒麟默认对 root 远程 SSH 限制很严格编辑 /etc/ssh/sshd_config找到 PermitRootLogin改成 yes然后重启服务sed -i s/#PermitRootLogin prohibit-password/PermitRootLogin yes/ /etc/ssh/sshd_config systemctl restart sshd软件源方面麒麟 V10 自带麒麟源如果虚拟机网络能出外网直接 yum 装软件就行。我在内网测试时遇到源不可达的情况解决办法是先配置一个本地的离线 repo 目录把常用 RPM 包提前放进去测试效率会高很多这个经验后面细说。4.4 在麒麟环境里做一次真实安装验证环境初始化干净后千万别闲着立即装一个真实组件验证整条链路通不通。我当时的做法是在 ARM64 麒麟里装 MySQL 5.7.44。这一步特别能暴露兼容性问题官方 RPM 包结构的依赖顺序、glibc 版本要求、ARM 平台下编译参数都会在安装时冒出来。命令很简单yum install -y mysql-community-server systemctl start mysqld如果你在 x86 麒麟上装过会感觉 ARM 版安装过程除了稍慢一些其余完全一致。数据库起来后建库、建表、插入数据、简单查询都跑一遍确认基础数据链路没问题。至此这个 QEMU 模拟出来的 ARM 麒麟环境才算真正可用。5. 网络打通与文件互传的实用方案5.1 user 模式 NAT 网络的原理用户模式网络是 QEMU 内置的 NAT 实现。虚拟机内部自动获得 10.0.2.15 这类地址默认网关是 10.0.2.2DNS 也是 10.0.2.3。虚拟机主动访问外网完全正常但外网访问虚拟机却不行所以需要 hostfwd 做端口映射。这个设计和家用路由器很像家里电脑是 192.168.x.x外界不能直接访问它但如果给路由器做了端口映射就能通过公网 IP 加上映射端口找到内网设备。QEMU 的 hostfwd 做的是同一件事只是从宿主到虚拟机的单向映射。5.2 SSH 端口转发与远程管理因为在启动命令里已经映射了 2222 端口到虚拟机 22 端口宿主机上直接敲ssh -p 2222 root127.0.0.1就能登录到麒麟虚拟机。Windows 10 以上自带 OpenSSH 客户端不需要额外装 PuttyPowerShell 里直接执行即可。日常用 VS Code 的话还可以装 Remote-SSH 插件连接到这个端口在宿主机的编辑器里直接改虚拟机里的代码体验很好。如果换了端口或者想重新映射不用重建虚拟机只需要在启动命令里追加一个新的 hostfwd 参数。例如给数据库端口预留-hostfwdtcp::3306-:3306这样 Windows 上的数据库客户端直接连 localhost:3306 就能访问虚拟机里的 MySQL测试联调非常方便。5.3 三种文件互传方法实测对比测试过程中频繁要往虚拟机里传安装包、部署脚本。我试下来三种方式够用第一种scp 直接传适合零散文件scp -P 2222 D:\packages\app.tar.gz root127.0.0.1:/opt/第二种麒麟里跑一个临时 HTTP 服务适合传大包给多人拉取cd /opt python3 -m http.server 8000对应启动命令中映射过的 8000 端口宿主机浏览器直接开 http://127.0.0.1:8000 下载比敲 scp 更直观。第三种再挂一块专门的数据盘适合长期共享。创建另一块 qcow2 磁盘启动命令里追加-drive fileD:\vm\share.qcow2,ifnone,iddisk1,formatqcow2 ^ -device virtio-blk-pci,drivedisk1进入麒麟后把磁盘格式化和挂载虚拟机内外都能用这块盘做中转。这三种我都用过最省心的是 scp最灵活的是 HTTP 服务最持久的是独立数据盘按场景选就是。6. 常见问题排查与实测避坑6.1 启动黑屏、VNC 无输出这是出现频率最高的问题。我先核对三件事第一UEFI 固件路径对不对。检查 -bios 指向的文件是否存在在 Windows 命令行里确认 C:\Program Files\qemu\QEMU_EFI.fd 这个文件真实存在。路径中文字符和空格都可能引发问题可以把文件拷到 D:\vm 下用简单路径引用。第二VNC 端口是否被占用。QEMU 启动日志里如果报端口绑定失败换个显示编号或端口号即可。我习惯每次启动新实例前先用 netstat 扫一下 5901 端口Windows 下命令是netstat -ano | findstr 5901第三CPU 型号兼容性问题。如果 cortex-a72 启动异常换 -cpu max 试一下。max 在 QEMU 里表示当前 QEMU 版本支持的最大特性集合部分场景兼容性更好。实在不行加 -machine virt,gic-version3强制指定 GIC 中断控制器版本对 cortex-a72 是必需项。6.2 鼠标漂移、安装界面卡死安装界面下鼠标漂移或者完全没光标基本都是 USB 设备问题。ARM virt 机型没有传统 PS2 鼠标必须以 usb-tablet 方式挂载否则 VNC 里光标动态范围错乱。同时要加上 usb-ehci 提供 USB 控制器根。下面三个参数必须同时存在于命令中-device usb-ehci -device usb-kbd -device usb-tablet如果安装界面还时不时卡死可以尝试把 virtio-gpu-pci 换成 VGA-device VGAVGA 模式虽然老但是在安装器的兼容轮盘上翻车概率反而低。装完系统后再换回 virtio-gpu性能更好。6.3 性能慢得怀疑人生怎么办纯软件模拟的虚拟机性能上限摆在那但有几个优化手段实测有效一是确保 -smp 4 以上的多核配置。QEMU 的 TCG 支持多线程并行模拟多核比单核提升非常明显。二是磁盘 cachewriteback。这是最容易忽略的一项对大量小文件读写有明显加速。三是别给虚拟机挂太多无用设备。音频设备可以去掉如果不需要别在命令里加 -soundhw 相关参数。USB 设备只留必要的。每挂一个模拟设备都意味着 QEMU 每秒钟要处理对应的模拟事件。四是宿主机上退出不必要的后台程序。Windows 的 Defender 实时扫描对 qcow2 大文件的反复扫描会显著拖慢磁盘 I/O虚拟机的目录放到 Defender 排除列表里实测效果立竿见影。还要注意别为了省事关掉 Defender这是安全底线只做目录排除就够。6.4 快照回滚与多节点克隆前面介绍磁盘格式时埋了伏笔qcow2 支持内部快照。测试环境的黄金操作是系统装完、初始化干净、装好常用工具之后立刻打一个干净快照C:\Program Files\qemu\qemu-img.exe snapshot -c clean D:\vm\kylin-arm64.qcow2查看快照列表C:\Program Files\qemu\qemu-img.exe snapshot -l D:\vm\kylin-arm64.qcow2回滚快照C:\Program Files\qemu\qemu-img.exe snapshot -a clean D:\vm\kylin-arm64.qcow2做兼容性测试时我经常在干净系统上装一个软件测完回滚再装下一个全程不重新装系统。这个习惯能省下大量时间。如果测试需要多个节点比如一台主控加两台计算节点更推荐外部快照。基础盘保持不变基于它派生多块新磁盘每块新盘都是独立可写层非常适合模拟多实例集群。命令是C:\Program Files\qemu\qemu-img.exe create -f qcow2 -b D:\vm\kylin-arm64.qcow2 D:\vm\node1.qcow2Windows 上使用外部快照要注意基础盘的路径最好保持稳定移动了它会连带找不到磁盘。6.5 高频问题速查表现象可能原因处理方法启动黑屏UEFI 固件缺失或路径错误核实 -bios 文件改用简单路径VNC 连不上端口被占用或绑定地址不对检查 5901 端口确认 -vnc 参数键盘无响应未挂 USB 键盘添加 usb-ehci 与 usb-kbd鼠标漂移未挂 usb-tablet添加 usb-tablet 参数安装包解压报错ISO 镜像损坏重新校验 SHA256虚拟机网不通user 网络下 DNS 设置异常检查 /etc/resolv.conf或改用 hostfwd 映射性能奇慢磁盘 cache 未设置加上 cachewritebackroot 无法 SSH麒麟默认限制 root 登录修改 sshd_config 并重启 sshd挂载数据盘不识别未装 virtio 驱动或未格式化用 virtio-blk-pci并 mkfs 格式化分区安装界面花屏virtio-gpu 兼容问题安装阶段改用 -device VGA个人建议把这几个参数和命令保存成自己的速查笔记以后不管是自己用还是教同事搭环境都会省心很多。最后分享一个我自己的习惯在这套 QEMU 麒麟环境里我不止跑过单机软件还测试过一主一从的数据库拓扑验证集群脚本在 ARM64 环境下的行为。虽然性能和真机没法比但“行为是否正确”这类问题它给出的答案和真机是一致的。后续如果你需要做更复杂的网络拓扑还可以引入多个 hostfwd 映射或多块网卡把这套模拟环境扩展成小型测试网。踩过几次坑之后我的体会是工具链不重要真正重要的是先想清楚到底要验证什么再决定用哪种方式搭这个环境。
返回列表