1. 为什么要在Windows x86上跑ARM虚拟机最近两年ARM架构越来越火从苹果M系列芯片到各种国产化设备很多开发者突然发现自己手头的x86电脑和服务器环境不够用了。我去年接手一个国产化项目时就遇到过在x86环境编译的ARM程序跑不起来的问题。当时试过交叉编译、真机调试等各种方案最后发现用QEMU在本地搭建ARM虚拟机才是最省事的方案。QEMU这个开源虚拟化工具的神奇之处在于它能让你在x86电脑上模拟出完整的ARM环境。不同于简单的指令集模拟器QEMU提供了完整的系统级模拟包括CPU、内存、外设等所有硬件组件。这意味着你可以在Windows电脑上运行原生的ARM Linux发行版就像使用真机一样进行开发测试。2. 环境准备与工具安装2.1 获取QEMU安装包首先需要下载Windows版的QEMU安装程序。推荐从官网下载最新稳定版https://qemu.weilnetz.de/w64/2023/qemu-w64-setup-20231215.exe这个安装包约300MB包含了所有需要的组件。安装时建议选择自定义路径比如我习惯放在D:\Tools\qemu避免C盘空间被占用。安装过程中记得勾选Add QEMU to system PATH选项这样后续在命令行直接输入qemu命令就能运行。2.2 准备ARM系统镜像根据你的需求选择适合的ARM64镜像Ubuntu Server适合服务器环境测试Debian ARM64软件包丰富社区支持好国产系统如麒麟OS适配国产硬件我以Ubuntu 22.04为例从官网下载ARM64版本https://cdimage.ubuntu.com/releases/22.04/release/ubuntu-22.04.3-live-server-arm64.iso2.3 安装虚拟网卡驱动为了让虚拟机联网需要安装TAP-Windows驱动。这个驱动会在系统中创建一个虚拟网卡https://build.openvpn.net/downloads/releases/tap-windows-9.24.7-I601-Win10.exe安装完成后在网络连接里会看到新增的TAP-Windows Adapter V9网卡。记住它的名称比如以太网 2后面配置网络时会用到。3. 创建虚拟机磁盘与配置3.1 初始化虚拟磁盘在D盘创建专门存放虚拟机的目录比如D:\qemu_vms。然后使用qemu-img工具创建磁盘镜像qemu-img create -f qcow2 D:\qemu_vms\ubuntu_arm64.qcow2 40G这里有几个关键参数-f qcow2使用动态分配空间的磁盘格式40G最大磁盘容量实际占用空间会随使用增长我建议初次使用分配30-50GB空间足够qcow2格式支持后期扩容不用担心空间不够。3.2 准备UEFI固件ARM架构需要专门的UEFI固件来启动系统。从Linaro官网下载https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd把这个文件放在D:\qemu_vms\目录下。这个固件文件相当于ARM虚拟机的BIOS没有它系统无法启动。4. 启动安装ARM系统4.1 首次启动安装命令现在可以启动安装过程了运行这个超长命令qemu-system-aarch64.exe ^ -m 4096 -cpu cortex-a72 -smp 4 ^ -M virt -bios D:\qemu_vms\QEMU_EFI.fd ^ -device VGA -device nec-usb-xhci -device usb-mouse -device usb-kbd ^ -drive ifnone,fileD:\qemu_vms\ubuntu_arm64.qcow2,idhd0 ^ -device virtio-blk-device,drivehd0 ^ -drive ifnone,fileD:\qemu_vms\ubuntu-22.04.3-live-server-arm64.iso,idcdrom,mediacdrom ^ -device virtio-scsi-device -device scsi-cd,drivecdrom ^ -net nic -net tap,ifname以太网 2解释几个关键参数-m 4096分配4GB内存-cpu cortex-a72模拟ARM Cortex-A72处理器-M virt使用通用的virt机器类型ifname以太网 2要改成你实际的TAP网卡名称4.2 安装过程注意事项启动后会进入Ubuntu安装界面安装过程与真机无异。有几点需要注意分区时选择整个磁盘自动分区最简单用户名不要用中文避免终端显示问题安装OpenSSH服务方便后续远程连接安装完成后不要立即重启先关闭QEMU窗口因为下次启动要移除ISO引导。5. 配置网络与日常使用5.1 常规启动命令安装完成后使用这个简化版命令启动qemu-system-aarch64.exe ^ -m 4096 -cpu cortex-a72 -smp 4 ^ -M virt -bios D:\qemu_vms\QEMU_EFI.fd ^ -device VGA -device nec-usb-xhci -device usb-mouse -device usb-kbd ^ -drive ifnone,fileD:\qemu_vms\ubuntu_arm64.qcow2,idhd0 ^ -device virtio-blk-device,drivehd0 ^ -net nic -net tap,ifname以太网 25.2 解决网络共享问题要让虚拟机上网需要在宿主机上配置网络共享打开网络连接右键你的物理网卡WiFi或有线选择属性 → 共享选项卡勾选允许其他网络用户通过此计算机的Internet连接来连接在下拉菜单中选择TAP网卡这时候虚拟机应该能自动获取到192.168.137.x段的IP并能访问外网。如果遇到问题尝试禁用再重新启用宿主机的物理网卡。6. 性能优化与实用技巧6.1 启用KVM加速如果你的Windows系统支持Hyper-V可以启用WHPX加速提升性能。首先在PowerShell以管理员身份运行Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All然后在QEMU命令中加入加速参数-accel whpx实测启用后性能提升约30%特别是IO操作明显变快。6.2 使用SSH连接在虚拟机内安装openssh-server后可以通过宿主机SSH连接ssh username192.168.137.xxx这样就不用依赖QEMU的图形界面了操作更方便。还可以用VS Code的Remote-SSH插件直接连接开发。6.3 共享文件夹配置要实现宿主机和虚拟机之间的文件共享可以使用Samba或者SFTP。更简单的方法是使用virtio-fs但需要Linux内核5.4支持。在QEMU命令中添加-fsdev local,idshare1,pathD:\share,security_modelnone ^ -device virtio-9p-pci,fsdevshare1,mount_tagshare1然后在虚拟机内挂载mkdir /mnt/share mount -t 9p -o transvirtio share1 /mnt/share7. 常见问题排查7.1 启动卡在UEFI界面如果启动时一直停留在UEFI shell界面通常是磁盘或ISO镜像路径有问题。检查-bios参数指定的路径是否正确磁盘镜像是否创建成功ISO镜像是否完整7.2 网络连接不稳定网络时断时续的问题很常见可以尝试禁用再重新启用TAP网卡检查防火墙设置更新TAP-Windows驱动到最新版7.3 性能优化建议如果感觉虚拟机运行缓慢增加内存到8GB-m 8192增加CPU核心数-smp 8使用SSD存放磁盘镜像关闭不必要的图形界面用-nographic参数我在实际使用中发现对于编译类任务分配更多CPU核心比增加内存更有效。比如编译Redis时8核心比4核心快将近一倍。