在Windows11上通过QEMU构建ARM64开发测试环境
1. 为什么要在Windows11上搭建ARM64环境?
最近几年ARM架构处理器越来越火,从手机芯片到苹果M系列处理器,再到各种物联网设备,ARM64已经成了不可忽视的技术生态。作为开发者,我们经常需要在本地测试ARM平台的软件兼容性,或者为嵌入式设备交叉编译程序。但现实是,大多数人的主力开发机还是x86架构的Windows电脑。
我之前在给树莓派开发程序时就遇到这个问题——本地编译好的x86程序放到ARM设备上完全跑不起来。后来发现用QEMU模拟ARM环境是个不错的解决方案,特别是配合Windows11的WSL2使用,效果出奇地好。这个方案最大的优势是不需要额外购买ARM开发板,用现有的Windows电脑就能搭建完整的ARM64开发测试环境。
2. 环境准备与工具安装
2.1 获取必要软件包
首先需要下载几个关键组件。QEMU的Windows版本可以从官网获取,我推荐使用weilnetz.de提供的预编译版本,这个版本对Windows支持最好:
https://qemu.weilnetz.de/w64/UEFI固件文件是ARM虚拟机启动的关键,建议使用Linaro维护的版本:
https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd至于操作系统镜像,我实测下来openEuler对ARM虚拟机的兼容性最好,下载地址:
https://mirrors.tuna.tsinghua.edu.cn/openeuler/openEuler-20.03-LTS-SP3/ISO/aarch64/openEuler-20.03-LTS-SP3-aarch64-dvd.iso2.2 安装配置QEMU
下载完QEMU安装包后直接运行安装程序,建议使用默认路径。安装完成后需要将QEMU的安装目录(比如C:\Program Files\qemu)添加到系统PATH环境变量中。这样后续就可以在任何目录下直接调用qemu命令。
验证安装是否成功:
qemu-system-aarch64 --version如果看到版本号输出,说明安装正确。我建议同时安装tap-windows虚拟网卡驱动,后面配置网络时会用到:
https://build.openvpn.net/downloads/releases/tap-windows-9.24.7-I601-Win10.exe3. 创建和配置ARM虚拟机
3.1 初始化虚拟磁盘
在PowerShell中执行以下命令创建20GB的虚拟磁盘:
qemu-img create -f qcow2 openEuler-arm64.img 20G这里使用qcow2格式而不是raw格式,主要是因为:
- 支持动态扩容,实际占用空间随使用量增长
- 支持快照功能
- 磁盘压缩效率更高
3.2 网络配置技巧
为了让虚拟机能够上网,需要配置网卡共享:
- 安装完tap-windows后,在网络连接中会看到新增的网卡
- 重命名这个网卡为"QEMU-TAP"方便识别
- 右键点击主机的物理网卡 → 属性 → 共享
- 勾选"允许其他网络用户通过此计算机的Internet连接来连接"
- 在下拉菜单中选择刚才创建的QEMU-TAP网卡
这个配置我调试了很久才成功,关键点是主机防火墙要放行相关网络连接。
4. 安装和运行ARM系统
4.1 启动安装命令
完整的安装命令如下(注意替换路径为你自己的实际路径):
qemu-system-aarch64 -m 4G -cpu cortex-a72 -smp 4 -M virt -bios QEMU_EFI.fd \ -net nic -net tap,ifname=QEMU-TAP \ -device nec-usb-xhci -device usb-kbd -device usb-mouse \ -device VGA \ -drive if=none,file=openEuler-20.03-LTS-SP3-aarch64-dvd.iso,id=cdrom,media=cdrom \ -device virtio-scsi-device -device scsi-cd,drive=cdrom \ -drive if=none,file=openEuler-arm64.img,id=hd0 \ -device virtio-blk-device,drive=hd0几个关键参数说明:
-m 4G:分配4GB内存,建议不低于2GB-cpu cortex-a72:模拟ARM Cortex-A72处理器-smp 4:使用4个CPU核心-net tap,ifname=QEMU-TAP:使用之前配置的虚拟网卡
4.2 安装过程注意事项
安装界面启动后,按照常规Linux安装流程操作即可。有几点需要特别注意:
- 分区时选择自动分区最省事
- 创建用户时建议勾选"将此用户设为管理员"
- 软件包选择建议包含开发工具集
- 安装过程确实比较慢,在我的i7笔记本上花了约40分钟
5. 日常使用与优化技巧
5.1 启动已安装的系统
安装完成后,去掉ISO相关的参数即可正常启动:
qemu-system-aarch64 -m 4G -cpu cortex-a72 -smp 4 -M virt -bios QEMU_EFI.fd \ -net nic -net tap,ifname=QEMU-TAP \ -device nec-usb-xhci -device usb-kbd -device usb-mouse \ -device VGA \ -drive if=none,file=openEuler-arm64.img,id=hd0 \ -device virtio-blk-device,drive=hd05.2 启用SSH远程连接
在虚拟机内编辑网络配置:
vi /etc/sysconfig/network-scripts/ifcfg-eth0将ONBOOT改为yes,保存后重启网络服务:
systemctl restart network然后就可以用Xshell等工具通过IP连接了。如果遇到网络问题,检查主机的网卡共享设置是否正确。
5.3 性能优化建议
经过多次测试,我发现这些优化措施效果明显:
- 使用KVM加速(需Windows11开启Hyper-V)
- 为虚拟机分配更多CPU核心
- 使用virtio磁盘和网络设备
- 调整QEMU的线程调度策略
具体优化命令示例:
qemu-system-aarch64 -accel whpx -cpu cortex-a72 -smp 8 ...6. 常见问题排查
6.1 启动卡在UEFI界面
如果启动时一直停留在UEFI shell界面,通常是-bios参数指定的路径不对,或者UEFI固件文件损坏。建议重新下载QEMU_EFI.fd文件。
6.2 网络连接失败
网络问题最常见的原因是:
- 主机网卡共享未正确配置
- 防火墙阻挡了连接
- 虚拟机内未启用网卡
可以依次检查:
- 主机网络连接中的共享状态
- 虚拟机内的IP地址是否获取成功
- 尝试ping主机和外部网络
6.3 图形界面卡顿
ARM模拟的图形性能确实有限,建议:
- 降低显示分辨率
- 使用SSH连接代替图形界面
- 增加虚拟机内存分配
- 尝试不同的显示设备参数
7. 进阶开发配置
7.1 交叉编译环境搭建
在x86主机上为ARM交叉编译程序,需要安装交叉编译工具链:
sudo yum install gcc-aarch64-linux-gnu编译时指定目标平台:
aarch64-linux-gnu-gcc -o hello hello.c7.2 容器开发支持
openEuler内置了docker支持,可以方便地构建ARM容器镜像:
docker run --rm -it arm64v8/ubuntu bash这对于测试多架构容器非常有用。
7.3 内核开发调试
QEMU支持内核调试,启动时添加-s -S参数:
qemu-system-aarch64 -s -S ...然后使用gdb-multiarch连接调试:
gdb-multiarch vmlinux target remote localhost:1234这套环境我用了大半年,从最初的简单测试到现在已经作为日常ARM开发的标配。虽然初期配置有些复杂,但一旦跑通就非常稳定。特别是对于需要同时开发x86和ARM程序的场景,省去了频繁切换设备的麻烦。
