
1. 为什么需要ARM64仿真环境最近几年国产化替代浪潮席卷各行各业很多单位开始将业务系统迁移到国产操作系统和国产芯片平台上。银河麒麟Kylin V10作为国产操作系统的代表之一支持x86和ARM64两种架构。但现实情况是很多开发者手头只有x86架构的电脑想要测试ARM64环境下的软件兼容性就成了难题。这时候QEMU就派上用场了。作为一款开源的硬件虚拟化工具QEMU可以模拟包括ARM64在内的多种CPU架构。我在实际项目中就经常用它来搭建跨架构的测试环境特别是在进行国产化软件适配时特别有用。比如最近要给某单位开发一个政务系统需要在Kylin V10 ARM64上测试但团队里没有ARM服务器就是靠QEMU搭建的仿真环境完成的测试。相比直接购买ARM服务器使用QEMU仿真有几个明显优势成本低不需要额外购置硬件灵活可以随时创建不同配置的虚拟机可复用环境配置可以保存为镜像文件不过要注意的是仿真环境毕竟是通过软件模拟的性能会比真机差一些。根据我的经验在i7-10700的机器上仿真ARM64性能大约是真机的30%-40%。但对于大多数功能测试来说已经够用了。2. 环境准备2.1 宿主机配置建议我推荐使用Kylin V10 SP2 x86_64作为宿主机系统这个版本对QEMU的支持比较完善。硬件配置方面CPU建议4核以上支持虚拟化技术Intel VT-x或AMD-V内存至少8GB建议16GB存储需要50GB以上可用空间在开始前先更新系统sudo yum update -y2.2 安装必要依赖QEMU编译需要一堆开发工具和库我整理了一个完整的依赖列表sudo yum install -y gcc gcc-c make ninja-build pixman pixman-devel \ libmount libmount-devel glib2 glib2-devel libtool flex bison \ clang zlib-devel libffi-devel python3-devel特别注意麒麟系统自带的GCC版本可能比较旧建议升级到7.4.0以上。我之前写过一篇详细的GCC升级指南可以参考sudo yum install -y devtoolset-9 scl enable devtoolset-9 bash3. 编译安装QEMU 8.0.43.1 获取源码直接从官网下载QEMU 8.0.4源码包wget https://download.qemu.org/qemu-8.0.4.tar.xz tar -xf qemu-8.0.4.tar.xz cd qemu-8.0.43.2 配置编译选项创建一个单独的构建目录是个好习惯mkdir build cd build配置编译参数时我通常会启用这些选项../configure --prefix/usr/local/qemu \ --target-listaarch64-softmmu \ --enable-virtfs \ --enable-kvm \ --enable-sdl \ --enable-gtk解释几个关键参数--target-listaarch64-softmmu只编译ARM64仿真需要的组件--enable-kvm启用KVM加速需要CPU支持--prefix指定安装目录3.3 编译和安装开始编译前建议先确认下CPU核心数nproc然后用make并行编译我一般用核心数*1.5的线程数make -j12编译完成后安装sudo make install最后把QEMU添加到PATHecho export PATH/usr/local/qemu/bin:$PATH ~/.bashrc source ~/.bashrc4. 创建ARM64虚拟机4.1 准备安装镜像从麒麟官网下载ARM64版本的ISO镜像我测试过Kylin-Server-V10-SP2-Release-Build09-20210524-aarch64.iso这个版本兼容性最好。还需要准备UEFI固件文件wget https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd4.2 配置虚拟网络创建一个TAP设备实现网络连接sudo ip tuntap add tap0 mode tap sudo ip link set tap0 up sudo ip addr add 192.168.100.1/24 dev tap0设置NAT转发sudo iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE sudo iptables -I FORWARD -i tap0 -o ens33 -j ACCEPT sudo iptables -I FORWARD -i ens33 -o tap0 -m state --state RELATED,ESTABLISHED -j ACCEPT4.3 创建虚拟磁盘使用qcow2格式可以节省空间qemu-img create -f qcow2 kylin_arm64.qcow2 120G4.4 启动安装程序完整的启动命令如下qemu-system-aarch64 \ -m 4096 \ -cpu cortex-a72 \ -smp 4 \ -M virt \ -bios QEMU_EFI.fd \ -device virtio-net-device,netdevnet0 \ -netdev tap,idnet0,ifnametap0,scriptno \ -device nec-usb-xhci \ -device usb-kbd \ -device usb-mouse \ -device VGA \ -drive fileKylin-Server-V10-SP2-Release-Build09-20210524-aarch64.iso,idcdrom,mediacdrom \ -drive filekylin_arm64.qcow2,idhd0 \ -boot ordercd安装完成后去掉CDROM参数即可从硬盘启动qemu-system-aarch64 \ -m 4096 \ -cpu cortex-a72 \ -smp 4 \ -M virt \ -bios QEMU_EFI.fd \ -device virtio-net-device,netdevnet0 \ -netdev tap,idnet0,ifnametap0,scriptno \ -device nec-usb-xhci \ -device usb-kbd \ -device usb-mouse \ -device VGA \ -drive filekylin_arm64.qcow2,idhd0 \ -boot orderc5. 常见问题解决5.1 图形界面卡顿如果发现图形界面响应慢可以尝试增加内存到4GB以上使用-display gtk代替默认的VGA添加-accel kvm参数需要宿主机支持5.2 网络连接问题我遇到过虚拟机无法上网的情况通常是因为TAP设备没有正确配置iptables规则有误虚拟机内没有配置静态IP解决方法# 在虚拟机内配置静态IP ip addr add 192.168.100.2/24 dev eth0 ip route add default via 192.168.100.15.3 安装麒麟V10 SP3失败有用户反馈安装SP3版本时会卡住这是已知问题。建议使用SP2版本尝试添加-machine virt,gic-version3参数检查ISO文件的MD5值是否完整6. 性能优化技巧经过多次实践我总结出几个提升QEMU性能的方法启用KVM加速qemu-system-aarch64 -accel kvm ...使用多核CPU-smp 4,cores4,threads1,sockets1调整内存分配-m 4096,slots2,maxmem8G使用virtio设备-device virtio-blk-device,drivehd0 \ -device virtio-net-device,netdevnet0启用大页内存-object memory-backend-file,idmem,size4G,mem-path/dev/hugepages,shareon \ -numa node,memdevmem在实际项目中通过这些优化可以让ARM64虚拟机的性能提升2-3倍。特别是KVM加速在我的i9-10900K上测试性能提升能达到300%以上。