
你很可能遇到过这样的场景手头只有一台 x86 笔记本但目标程序必须在 ARM 板卡上跑或者你想学习 Linux 内核却不敢在自己的物理机上反复折腾再或者你想体验一下国产操作系统的界面和体验又不希望把主力电脑格式化重装。这些问题的共同点其实可以归结为一句话你缺的不是一台新电脑而是“另一种架构或者另一套系统”的运行环境。QEMU 就是解决这类问题最常用的开源方案。它不只是一个虚拟机软件更是一套支持 x86、ARM、RISC-V、MIPS、PowerPC 等多种硬件架构的模拟器。你可以在一台普通的 x86 电脑上模拟出 ARM 开发板也可以把 Linux、Windows 以及麒麟 V10、统信 UOS 等国产操作系统装进 QEMU 虚拟机里反复测试。这篇文章会从最基础的概念讲起逐步带你完成 QEMU 的安装、磁盘镜像创建、x86 虚拟机启动、ARM 与 RISC-V 架构模拟以及国产操作系统的安装流程。最后会给出常见问题排查方法和工程化使用建议。无论你是嵌入式开发者、运维工程师还是刚接触虚拟化的学生读完都能独立上手 QEMU。1. QEMU 到底能解决什么问题先抛开命令和参数认真想一个问题QEMU 和 VirtualBox、VMware 这类虚拟机软件有什么本质区别如果你只用过 VirtualBox可能对虚拟机的理解是“在 Windows 或 Linux 上再跑一个 Windows 或 Linux”。这确实是虚拟化但它有一个天然限制绝大多数桌面虚拟机软件只能在同架构下工作也就是 x86 宿主机上运行 x86 虚拟机。你让 VirtualBox 去模拟一个 ARM 手机系统它做不到。QEMU 解决的问题恰恰是“跨架构”。它的底层设计不是简单调用 CPU而是通过动态二进制翻译技术把目标架构的指令翻译成宿主机 CPU 能执行的指令。这意味着在一台 x86 机器上你可以运行 ARM 架构的 Linux 内核可以运行 RISC-V 架构的裸机程序可以运行 MIPS 架构的嵌入式系统。这在学习嵌入式、内核开发和操作系统原理时非常有价值。另一个典型场景是国产操作系统适配。很多软件在麒麟 V10、统信 UOS 上跑之前需要先在开发机上验证安装流程和兼容性。如果你没有对应的物理服务器用 QEMU 创建一台虚拟机是最快、最安全的验证方式。你可以通过快照随时回滚避免一次次重装系统。所以我的判断是QEMU 的真正核心价值不是“虚拟机”这三个字而是“跨架构模拟 灵活可组合”。它把虚拟化能力拆成一个个命令行工具灵活度远高于图形界面拖拽式配置。这也是为什么云原生、嵌入式、内核开发等领域到处都是 QEMU 的身影。2. QEMU 核心概念模拟器、翻译器与硬件加速要把 QEMU 用好第一步是搞清楚它内部的基本工作方式。这里有几个容易混淆的概念提前理清后面看命令就不会发懵。2.1 全系统模拟与用户态模拟QEMU 有两大类工作模式系统模式System Mode和用户态模式User Mode。系统模式是最常见的用法。输入命令通常是qemu-system-x86_64、qemu-system-arm这样的形式。它会模拟一整套完整机器包括 CPU、内存、磁盘控制器、网卡、串口、显卡等外设然后在上面安装和运行一个完整的操作系统。我们后面用来安装 Linux、Windows、国产系统用的都是系统模式。用户态模式则轻量得多。命令形式是qemu-arm、qemu-aarch64、qemu-riscv64等。它只模拟 CPU 和系统调用接口用来直接运行单个交叉编译后的可执行文件。比如你在 x86 电脑上交叉编译了一个 ARM 程序不想每次都拷到板子上跑就可以用qemu-arm ./hello直接执行。这种方式启动快、占资源少适合做单元测试和构建验证。2.2 TCG 动态翻译与硬件加速全系统模拟中QEMU 处理目标 CPU 指令有两种方式。第一种是纯软件模拟也叫 TCGTiny Code Generator模式。QEMU 会把目标架构的指令块翻译成宿主机指令并做缓存优化。这种方式的好处是不依赖硬件特性因此 ARM 模拟 x86、x86 模拟 RISC-V 都不在话下。代价是性能开销比较大CPU 密集型任务会明显变慢。第二种是硬件加速模式。在 x86 宿主机上KVMKernel-based Virtual Machine允许 QEMU 直接使用 CPU 的虚拟化扩展虚拟机里的指令大部分直接跑在物理 CPU 上性能非常接近原生。Windows 宿主机上可以用 WHPXmacOS 上可以用 HVF。值得注意的是硬件加速模式一般只能用于同架构虚拟化比如 x86 宿主上的 x86 虚拟机跨架构模拟仍然依赖 TCG。理解这两者的关系非常重要。很多人以为 QEMU 性能一定比 VirtualBox 差其实在同架构 KVM 的场景下QEMU 的性能表现并不差而在跨架构场景中TCG 几乎是不可替代的选择。2.3 QEMU 与 VirtualBox、VMware 的定位差异维度QEMUVirtualBox / VMware跨架构模拟支持 ARM、RISC-V、MIPS 等基本只支持 x86/AMD64硬件加速支持 KVM、WHPX、HVF支持自带加速模块界面命令行为主可接 virt-manager自带图形管理界面自动化命令参数丰富适合脚本编排也可以通过 API 实现应用场景数据中心、嵌入式、内核开发桌面用户、日常测试从架构设计上看QEMU 更像一个“虚拟化工具链”而不是一个开箱即用的纯 GUI 产品。这种定位决定了它在专业开发场景中更常用也决定了它的学习曲线比 VirtualBox 陡峭一些。3. 适用场景谁最需要 QEMU不是所有人都需要 QEMU。如果你是普通办公用户只是想在 Windows 里装个 Ubuntu 看看VirtualBox 可能更顺手。但如果你是下面这几类人QEMU 几乎是绕不开的工具第一类是嵌入式开发者。你写代码的目标平台是 ARM 或 RISC-V但开发板数量有限或者板卡不在手边。QEMU 可以模拟常见的开发板模型例如 ARM 的 vexpress-a9、virt 平台等让你在没有硬件的情况下也能验证内核启动、驱动初始化和根文件系统。第二类是系统运维和云平台工程师。QEMU 不是只有“模拟”这一面它也是云平台底层虚拟化的基石之一。很多基于 KVM 的云主机管理面工具可能不同但核心的虚拟化执行引擎仍然是 QEMU。理解 QEMU 的磁盘格式、快照和命令行参数对排查云上虚拟化问题很有帮助。第三类是国产操作系统适配和研发人员。如果你需要验证某个软件在麒麟 V10 或统信 UOS 上能不能装、能不能跑QEMU 能帮你快速创建干净环境。而且用 qcow2 镜像配合快照测试完一条命令就能回到干净状态效率远高于反复烧录物理机。第四类是操作系统和内核学习者。QEMU 调试内核非常方便可以用-s -S参数停在启动早期配合 GDB 远程调试内核这在真实物理机上几乎是不可能的。当然QEMU 也有不适合的场景如果你需要频繁使用 GPU 做图形渲染或者追求极致的单机 3D 性能QEMU 默认的图形虚拟化能力偏弱需要额外配置直通或 VirtIO-GPU并且对硬件有要求。如果只是玩游戏或跑大型图形软件商业化虚拟机可能更合适。4. 环境准备与 QEMU 安装QEMU 可以运行在 Linux、Windows、macOS 上。下面分别介绍最常见的安装方式。版本细节不用死记以官方发布为准通用命令基本稳定。4.1 Linux 环境安装在 Debian/Ubuntu 系列发行版中可以直接用 apt 安装sudo apt update sudo apt install qemu-system-x86 qemu-system-arm qemu-utils如果希望安装完整的架构支持可以安装qemu-system元包它会包含 x86、ARM、RISC-V、MIPS、PowerPC 等常见架构的系统模拟器。有些发行版还会把用户态模拟放在qemu-user包中。在 CentOS/RHEL 系列中常见的安装方式是通过 yum/dnf 安装sudo yum install qemu-kvm qemu-img libvirt virt-manager这里的qemu-kvm是和 KVM 绑定较紧密的 QEMU 发行版本。安装后可以查看可用的 qemu 命令ls /usr/bin/qemu-*4.2 Windows 环境安装Windows 下安装 QEMU 比较简单从 QEMU 官网下载 Windows 安装包一路 Next 即可。安装程序默认会把qemu-system-x86_64.exe、qemu-img.exe等命令放到安装目录并提示是否加入 PATH。如果没有加入 PATH可以在命令行中先切换目录再执行cd C:\Program Files\qemu qemu-img --version也可以手动把C:\Program Files\qemu添加到系统环境变量 Path 中然后重新打开命令行窗口直接执行qemu-img --version验证。4.3 验证安装结果无论在哪个平台安装完成后都建议执行下面的命令确认版本和工作状态qemu-img --version能看到版本信息说明 QEMU 工具链已经可用。接着查看系统模拟器是否完整qemu-system-x86_64 --version如果只是qemu-img有但qemu-system-x86_64找不到说明只安装了工具集没有安装完整的系统模拟器需要回到安装步骤补装。5. 磁盘镜像与 x86 虚拟机启动安装完成后最直接的上手方式是在 x86 架构下启动一台 Linux 虚拟机。这个过程可分为三部分创建磁盘、启动安装程序、配置网络。5.1 用 qemu-img 创建系统磁盘QEMU 默认使用 qcow2 格式的磁盘镜像。qcow2 的优点是按需分配空间创建时说 20G实际使用多少占多少还支持快照和压缩。创建命令如下qemu-img create -f qcow2 ubuntu.qcow2 20G执行后会产生一个ubuntu.qcow2文件。查看镜像信息可以使用qemu-img info ubuntu.qcow2这个命令会显示镜像格式、虚拟大小、磁盘大小等信息是后续排查磁盘问题时最常用的工具。5.2 用 ISO 安装 Linux 系统假设你已经下载了一个 Linux 发行版的 ISO 文件可以用下面这条命令启动安装程序qemu-system-x86_64 \ -m 2048 \ -smp 2 \ -hda ubuntu.qcow2 \ -cdrom ubuntu.iso \ -boot d \ -netdev user,idnet0 \ -device e1000,netdevnet0参数解释如下-m 2048分配 2GB 内存。-smp 2分配 2 个 vCPU。-hda ubuntu.qcow2指定第一块磁盘为刚才创建的 qcow2 镜像。-cdrom ubuntu.iso挂载安装光盘。-boot d优先从光盘启动。-netdev user和-device e1000为虚拟机提供用户态网络。启动后会弹出一个图形窗口正常进入系统安装流程。安装完成后重新启动时去掉-cdrom和-boot d参数即可qemu-system-x86_64 \ -m 2048 \ -smp 2 \ -hda ubuntu.qcow2 \ -netdev user,idnet0 \ -device e1000,netdevnet05.3 网络配置与端口转发QEMU 的user模式网络不需要宿主机额外配置默认就自带 NAT虚拟机可以访问外网但宿主机默认无法直接访问虚拟机。如果希望从宿主机 SSH 到虚拟机需要配置端口转发。假设虚拟机里的 SSH 端口是 22希望在宿主机上用localhost:2222访问可以这样启动qemu-system-x86_64 \ -m 2048 \ -smp 2 \ -hda ubuntu.qcow2 \ -netdev user,idnet0,hostfwdtcp::2222-:22 \ -device e1000,netdevnet0然后在宿主机执行ssh -p 2222 userlocalhost如果虚拟机里网络不通先检查虚拟机是否启用了 DHCP。user 模式网络默认内置了 DHCP 服务虚拟机网卡通过 DHCP 获取 10.0.2.15 这类 IP 地址。这也是为什么在很多资料里能看到qemu 10.0.2.15这样的地址它只是 QEMU user 模式的默认虚拟网段不代表真实网络。6. 多架构实战ARM 与 RISC-V 模拟跨架构模拟是 QEMU 区别于普通虚拟机软件的核心能力。这一节我来演示如何在 x86 宿主机上启动 ARM 和 RISC-V 系统。6.1 ARM 架构模拟实战QEMU 能模拟多块 ARM 开发板常见的是vexpress-a9和通用的virt平台。以vexpress-a9为例它模拟了一颗 Cortex-A9 双核处理器非常适合内核和嵌入式实验。启动 ARM Linux 的典型命令如下qemu-system-arm \ -M vexpress-a9 \ -m 1G \ -kernel vmlinuz \ -initrd initrd.img \ -append root/dev/mmcblk0 consolettyAMA0 \ -sd rootfs.ext4 \ -nographic参数说明-M vexpress-a9选择主板型号。-kernel vmlinuz指定 ARM 架构的 Linux 内核镜像。-initrd initrd.img指定初始内存盘。-append传给内核的启动参数root/dev/mmcblk0表示根文件系统在 SD 卡上。-sd rootfs.ext4把根文件系统镜像挂载为 SD 卡。-nographic不启动图形窗口把串口输出重定向到当前终端。在真实项目中vmlinuz、initrd.img、rootfs.ext4并不是随便找一个就能用它们必须是你自己编译或者从发行版获取的 ARM 版本。单独一个内核文件无法启动完整系统还要保证根文件系统里的应用和内核匹配。如果你想做更灵活的内核调试实验可以换成 QEMU 的virt平台它更通用也更接近云上 ARM 虚拟机的形态。6.2 RISC-V 架构模拟实战RISC-V 是近年来备受关注的开源指令集架构。QEMU 对 RISC-V 的支持相当成熟可以用virt平台跑一个完整的 Linux 系统。qemu-system-riscv64 \ -M virt \ -m 2G \ -kernel Image \ -append root/dev/vda rw consolettyS0 \ -drive filerootfs.img,formatraw,ifvirtio \ -nographic这里的Image是 RISC-V 架构的 Linux 内核镜像rootfs.img是根文件系统镜像。启动后如果看到内核日志和登录提示说明 RISC-V 模拟环境已经跑通。RISC-V 的启动流程和 ARM 类似但细节不同。ARM 常见用设备树和 U-BootRISC-V 的virt平台通常会直接从内核启动也可以加载 OpenSBI 固件。初次接触时建议直接用发行版提供的测试镜像先跑通流程再深入编译自定义内核。6.3 用户态模拟与程序运行除了启动完整系统QEMU 还能在用户态运行单个可执行文件。先在宿主机安装 ARM 交叉编译工具链然后编译一个简单程序#include stdio.h int main() { printf(Hello, ARM!\n); return 0; }编译和运行aarch64-linux-gnu-gcc hello.c -o hello qemu-aarch64 ./hello在 x86 机器上直接输出Hello, ARM!说明用户态模拟生效。这种模式非常适合 CI 流程中的跨架构单元测试不需要维护一堆真实硬件。7. 在 QEMU 中运行国产操作系统随着国产 Linux 发行版在各行各业的应用越来越广泛很多开发者在本地也需要一套用于兼容性验证的环境。麒麟 V10 和统信 UOS 是目前最常见的两种发行版都能在 QEMU 虚拟机中运行。安装国产操作系统和安装其他 Linux 发行版流程类似关键在于镜像和资源分配。建议从发行版官方网站获取 ISO 镜像不要随意下载来源不明的修改版。然后创建一块足够大的虚拟磁盘qemu-img create -f qcow2 kylin.qcow2 40G使用下面的命令启动安装程序qemu-system-x86_64 \ -m 4096 \ -smp 4 \ -hda kylin.qcow2 \ -cdrom KylinV10.iso \ -boot d \ -vga std \ -netdev user,idnet0 \ -device e1000,netdevnet0安装过程中注意几点第一内存不要给得太小。国产桌面系统默认会开启图形桌面内存低于 2GB 时会非常卡顿建议分配 4GB 以上。第二安装完成后启动系统使用-vga std或-vga virtio可以改善显示兼容性。不同版本的 QEMU 对显卡支持不完全一样如果图形界面花屏优先考虑更换显卡模型。第三如果想测试服务器版可以分配更小的内存和磁盘并使用-nographic模式通过串口操作减少图形桌面带来的性能开销。在 QEMU 中运行国产操作系统的核心价值是可以在不影响宿主机的情况下持续做软件兼容性验证。你可以把安装好的系统做成一个基础镜像复制多份分别测试不同软件包互不干扰。8. 运行验证与效果检查启动虚拟机只是第一步还需要验证系统是否真的正常运行。这里给出几个基本的检查方法。首先看 QEMU 窗口或串口输出。如果是图形界面能够看到桌面登录页说明系统基本启动成功。如果是-nographic模式串口会出现内核日志最终进入登录提示符。然后可以进入 QEMU monitor 查看虚拟机状态。在图形界面下按CtrlAlt2从虚拟机界面切换到 QEMU monitor 界面在-nographic模式下按CtrlA C切换。在 monitor 中执行info status输出running表示虚拟机处于运行状态。输入info block可以查看磁盘设备状态输入quit可以直接退出虚拟机。最后是网络验证。如果已经配置了端口转发在宿主机上执行ssh -p 2222 userlocalhost能够登录成功说明虚拟机网络和 SSH 都正常。如果 SSH 不通可以先在虚拟机里检查 IP 地址ip addr如果看到eth0没有 IP可能是 DHCP 未获取地址可以用dhclient eth0手动获取或者检查 QEMU 启动参数里的网卡模型是否被系统识别。9. 常见问题与排查方法以下表格整理了 QEMU 使用中最常见的几类问题按现象、原因、排查方式、解决方案展开。问题现象可能原因排查方式解决方案启动报错KVM is not available宿主机没有开启硬件虚拟化或 /dev/kvm 不存在执行ls -l /dev/kvm检查 BIOS 是否开启 VT-x/AMD-V在 BIOS 中打开虚拟化功能或去掉-enable-kvm改用 TCG 模式Windows 下提示“此平台不支持虚拟化的 AMD-V/RVI”Windows 虚拟化功能或 BIOS 未开启打开任务管理器查看“虚拟化”是否已启用到 BIOS 开启虚拟化关闭 Hyper-V 与 QEMU 的冲突虚拟机启动后黑屏显卡模型不兼容或内核没有输出到图形终端改用-vga std或加-nographic看串口日志根据发行版支持情况选择显卡优先用-vga std或virtio-gpu网络不通user 模式网络配置错误或虚拟机内未启用 DHCP在虚拟机里执行ip addr检查网卡状态检查启动参数中的网卡模型改用e1000或virtio-net磁盘空间增长过快qcow2 镜像未压缩日志文件占用大量空间执行qemu-img info查看实际大小定期清理虚拟机内日志使用qemu-img convert收缩镜像鼠标键盘无法操作未安装 QEMU Guest Agent 或对应驱动在虚拟机中安装 qemu-guest-agent安装驱动后重启图形体验会明显改善WSL2 无法启用宿主机 BIOS 未开启虚拟化检查 BIOS 和 Windows 功能开启 VT-x/AMD-V必要时关闭 Windows 虚拟机监控程序排查 QEMU 问题时最有效的思路是“分层看日志”。先看命令行输出有没有直接报错然后看虚拟机内部日志再看宿主机系统日志。不要一上来就重装系统很多问题都是参数拼写、镜像路径或 BIOS 开关引起的。10. 最佳实践与工程建议QEMU 用久了会发现它的坑并不在启动一条命令而在如何管理一堆镜像、快照和网络配置。这里分享几条我认为值得长期坚持的实践。第一镜像与数据分离。基础系统镜像保持干净安装和配置好的系统用于测试用户数据放在独立数据盘或者挂载共享目录中。这样系统镜像坏了可以直接删除重建数据不会丢失。第二用好快照。在安装关键软件或执行危险操作前先做一次快照qemu-img snapshot -c before_test ubuntu.qcow2查看快照列表qemu-img snapshot -l ubuntu.qcow2回滚到快照qemu-img snapshot -a before_test ubuntu.qcow2快照要确保虚拟机处于关闭状态或使用 QEMU 内部快照功能否则可能造成磁盘数据不一致。生产环境操作前务必在测试环境验证。第三优先使用 VirtIO 驱动。现代 Linux 发行版自带 VirtIO 驱动使用 virtio 网卡和 virtio 磁盘可以显著提升性能。例如创建磁盘时用ifvirtio参数网络设备用virtio-net-pci。Windows 虚拟机则需要额外安装 VirtIO 驱动通常可以从云镜像或发行版渠道获取。第四构建命令行模板。把频繁使用的命令保存为 shell 脚本按用途分成 install.sh、start.sh、debug.sh。调试内核时加上-s -SQEMU 会在启动时暂停并等待 GDB 连接这是内核调试最常用的方式。第五注意安全边界。QEMU 的user网络模式默认宿主机不会直接暴露端口比较安全但如果配置了hostfwd端口转发相当于把虚拟机内的服务暴露到宿主机网络要严格控制端口范围和访问来源。在生产环境中执行虚拟化操作也要遵循最小权限原则不要使用 root 进行日常操作。11. 总结与后续学习方向QEMU 是一个值得认真学习的虚拟化工具。它既能当普通虚拟机用也能模拟 ARM、RISC-V 等非本地架构还能结合 KVM 提供接近原生的 x86 虚拟化性能。对于嵌入式开发者、运维工程师和国产操作系统适配人员来说掌握 QEMU 意味着你可以在任何一台电脑上搭建出几乎任何架构的实验环境。这篇文章讲清楚了 QEMU 的核心概念、安装方法、x86 虚拟机启动、ARM/RISC-V 模拟、国产操作系统安装和常见问题排查。建议你真正动手实践一遍从创建一个 qcow2 磁盘镜像开始到成功启动第一台虚拟机再到试着模拟 ARM 环境这个过程比看十遍教程都有用。如果继续深入下一步可以学习 QEMU 的 GDB 调试接口、virtio 驱动原理、vhost 网络加速以及 QEMU 在云平台中的整体角色。你还可以尝试使用qemu-system-aarch64模拟 ARM 服务器虚拟机体验完整的 ARM64 Linux 环境。建议收藏本文作为入门参考遇到问题随时回来查阅。