QEMU多架构虚拟化实战:从x86到ARM与RISC-V的完整指南
QEMU 这个开源虚拟化工具最近被我重新翻出来折腾了一遍。原因其实很实际我手头有 x86 的 Linux 镜像也有 ARM 的开发板镜像还希望在一台 Windows 机器上临时跑一下国产操作系统。QEMU 刚好能覆盖这些场景它不像商业虚拟化方案那样绑死某个平台既能靠软件动态翻译跨架构模拟也能借助 KVM、WHPX 等硬件虚拟化接口获得接近原生的速度。这篇文章不打算把 QEMU 的所有参数罗列一遍而是按我实际跑通的路子讲先确认宿主环境再创建磁盘启动第一个 x86 Linux 虚拟机之后延伸到 ARM、RISC-V、国产操作系统和 Windows Guest最后补网络、磁盘、排障和方案选型。第一次接触 QEMU 的读者走完这套流程后至少能完成“建盘—装系统—登录—配网络”的完整闭环。1. QEMU 到底是什么为什么多架构场景绕不开它1.1 一个工具覆盖四类典型场景QEMU 是一套开源虚拟机方案。它模拟 CPU、内存、磁盘、网卡、显卡等硬件设备让一个系统跑在另一个系统之上。最吸引人的地方是它能模拟 x86、ARM、RISC-V、MIPS、PowerPC、LoongArch 等多种架构。也就是说你完全可以在 x86 电脑上启动一个 ARM 虚拟机也可以在 ARM 电脑上启动一个 x86 虚拟机。这种跨架构能力是 VirtualBox、VMware 这类偏 x86 平台的方案很难替代的。我接触到 QEMU 的典型场景有四类第一类在一台 Windows 电脑上跑 Linux、Windows 或国产操作系统用于测试和演示。第二类做嵌入式 ARM、RISC-V 开发想先看某个发行版或内核能不能启动不必反复刷真实开发板。第三类把多架构系统测试写进脚本和自动化流程用 QEMU 批量验证镜像、内核或应用。第四类用快照做实验。今天装坏一个系统明天能立刻回到干净状态不用重装。很多人看到 QEMU 第一反应是“开源”“免费”“神器”但真正落地时更该关注的是它到底能不能在你的机器上稳定跑起来以及你要跑的系统有没有对应架构的镜像。1.2 先理解“模拟”和“虚拟化”的差别QEMU 同时具备两种能力纯软件模拟和硬件辅助虚拟化。纯软件模拟模式下QEMU 把客户机的每条指令动态翻译成宿主机指令。这种方式兼容性很强但在同一架构下性能一般比硬件虚拟化低不少。另一种方式是硬件辅助虚拟化例如 Linux 上常见的 KVMWindows 上的 WHPXmacOS 上的 Hypervisor.framework。QEMU 通过这类接口直接利用 CPU 的 VT-x、AMD-V 等能力让虚拟机以大比例接近宿主机原生性能运行。所以判断 QEMU 能不能用不能只问“有没有安装成功”还要问宿主机的 CPU 虚拟化是否开启对应加速接口是否可用当前用户是否有权限访问相关设备或服务。如果这三点没确认再多的 QEMU 参数都容易卡在启动阶段。先把这个基础打牢后面跑系统才会顺利。2. 安装 QEMU 前先确认宿主环境能不能开虚拟化2.1 Windows 安装与 WHPX 加速确认Windows 下安装 QEMU 比较简单去 QEMU 官方网站下载对应系统的安装包即可。装完后打开命令行运行qemu-system-x86_64 --version能输出版本就说明环境变量正常。如果提示“不是内部或外部命令”需要把 QEMU 安装目录加到 PATH 环境变量或者直接用完整路径运行。但这里有一个很常见的坑安装包已经装完启动系统时却提示“此平台不支持虚拟化的 AMD-V/RVI”或者“WSL2 无法启动因为此计算机上未启用虚拟化”。这类问题的根源通常不是 QEMU而是宿主机固件设置或 Windows 功能没有开启。建议按这个顺序检查检查项检查方式正常状态CPU 虚拟化任务管理器-性能-CPU查看“虚拟化”已启用Windows 虚拟化功能控制面板-启用或关闭 Windows 功能勾选“虚拟机平台”“Windows 虚拟机监控程序平台”已启用WHPX 是否可用用 QEMU 启动一条带-accel whpx的测试命令不报 WHPX not available如果 BIOS/UEFI 里没有打开 VT-x 或 AMD-VWindows 里看到虚拟化是“已禁用”此时需要重启进固件设置找到 Intel Virtualization Technology 或 SVM Mode开启后保存退出。这一步不做后面配置再完美也白搭。2.2 Linux 和 macOS 安装方式与内核加速确认Linux 发行版一般会把 QEMU 拆成多个包。常见包名是qemu-system-x86、qemu-system-arm、qemu-system-riscv也有一些发行版打包成qemu-system-x86_64。用系统自带的包管理器安装即可。比如 Debian/Ubuntu 系可以用 aptCentOS/RHEL 系可以用 dnf 或 yum。Linux 下使用 KVM 加速需要确认内核里已经加载了对应模块。最简单的检查命令是ls -l /dev/kvm如果看到/dev/kvm存在说明 KVM 可用。如果不存在先检查 CPU 虚拟化是否在 BIOS 里开启再确认宿主内核是否加载了 kvm 模块。部分发行版为了让普通用户使用 KVM还会把用户加入kvm组。权限不对时QEMU 会报Permission denied。macOS 上一般用 Homebrew 安装brew install qemu如果你用的是 Apple Silicon Mac宿主本身是 arm64用qemu-system-aarch64跑 ARM Linux 会更顺手。想跑 x86 镜像也不是不行但性能和兼容性要谨慎验证不能默认“所有系统都能流畅运行”。这一点在实际使用中很容易被忽视。3. 创建磁盘并启动第一个 x86 Linux 虚拟机3.1 先创建磁盘镜像别一上来就下载整个系统在启动 QEMU 之前通常要先准备一块虚拟磁盘。QEMU 默认支持qcow2、raw、vdi、vmdk等格式最常用的是qcow2。它的优势是稀疏分配你创建一个 20G 的磁盘宿主上并不会立刻占满 20G而是随着虚拟机里写入数据逐渐增长。创建一块大小为 20G 的 qcow2 磁盘命令是qemu-img create -f qcow2 linux-disk.qcow2 20Gqemu-img create很快一般几秒就完成。创建完之后可以用qemu-img info linux-disk.qcow2查看磁盘格式、大小、虚拟大小等信息。这一步别跳过因为后面排障时经常要先确认磁盘文件本身有没有问题。我一般习惯把磁盘文件单独放在一个目录里不跟 ISO 混在一起。批量测试时还会加日期和后缀避免覆盖。3.2 一条最简命令启动安装程序假设你已经下载了一个 x86_64 架构的 Linux 系统安装 ISO比如常见发行版的 Live CD 或 Server 安装镜像。可以用下面这条命令启动qemu-system-x86_64 \ -m 2048 \ -smp 2 \ -hda linux-disk.qcow2 \ -cdrom your-linux.iso \ -boot d含义逐项拆开参数作用-m 2048给虚拟机分配 2G 内存-smp 2分配 2 个虚拟 CPU-hda linux-disk.qcow2把 qcow2 文件当作第一块硬盘-cdrom your-linux.iso加载安装镜像到光驱-boot d优先从光驱启动如果 ISO 路径包含空格路径要加引号。启动后会出现 QEMU 图形窗口进入系统安装界面。安装过程跟在实体机上类似选择分区时直接使用整个虚拟磁盘即可。安装完成后重启前先杀掉当前 QEMU 进程再把-cdrom和-boot d去掉qemu-system-x86_64 \ -m 2048 \ -smp 2 \ -hda linux-disk.qcow2 \ -boot c这次会从磁盘启动进入安装好的 Linux 系统。3.3 加速参数加还是不加取决于宿主环境如果是在 Linux 宿主机上可以加-accel kvm让 QEMU 使用 KVM 加速qemu-system-x86_64 \ -m 2048 \ -smp 2 \ -hda linux-disk.qcow2 \ -cdrom your-linux.iso \ -boot d \ -accel kvm在 Windows 宿主机上则改为-accel whpx。前提是上一节提到的“Windows 虚拟机监控程序平台”已经开启。如果没加加速参数QEMU 会退回纯软件模拟。对于安装系统这种大量磁盘读写和 CPU 计算的场景纯软件模拟会比较慢所以能开加速就尽量开。注意第一次测试不要同时追求“能跑”和“性能最优”。先用默认显示和最小必要内存把系统装完再考虑加速、多核、显卡等优化这样排障范围更小。4. 模拟 ARM 和 RISC-V重点不是“能不能启动”而是“以什么方式启动”4.1 先弄清“机器类型、固件、内核、根文件系统”各自的角色在 x86 里用户通常只用关心 ISO 和磁盘因为 BIOS/UEFI 固件内置在机器里启动链路很成熟。到 ARM 和 RISC-V 场景情况就不一样了。QEMU 启动时需要指定机器型号machine、固件或引导程序、内核镜像、根文件系统有时还要额外传内核参数。机器类型用-M指定比如virt。它不是某一块真实开发板而是 QEMU 提供的通用虚拟平台适合快速跑 Linux 发行版。固件负责初始化硬件、加载内核。可能是 UEFI 文件比如QEMU_EFI.fd也可能是 U-Boot 或 OpenSBI。内核就是刚编译出来或发行版自带的Image文件。根文件系统可以是 ext2/ext4 格式的磁盘镜像也可以是 initramfs。这几个组件必须配套。比如一个为特定开发板编译的 ARM 内核不一定能在virt机器上直接启动。所以遇到“黑屏”先别怪 QEMU更可能是启动链条不完整。4.2 一条 ARM 虚拟启动命令示例在 x86 宿主机上模拟 ARM Linux可以使用qemu-system-aarch64。下面这条命令是一个常见示例qemu-system-aarch64 \ -M virt \ -cpu cortex-a57 \ -smp 2 \ -m 2048 \ -bios QEMU_EFI.fd \ -drive filedisk.img,formatraw,ifvirtio \ -netdev user,idnet0 \ -device virtio-net-pci,netdevnet0这里的QEMU_EFI.fd、disk.img都是示例实际使用时必须换成与你镜像配套的文件。很多 ARM 系统镜像会同时提供 UEFI 固件和根文件系统下载后放到同一目录会比较方便。如果你在 Apple Silicon Mac 上操作qemu-system-aarch64同样可用很多人问的“arm macos qemu”其实就是这一类场景。核心思路一致只是宿主机架构不同安装方式也不同。4.3 RISC-V 更多依赖串口输出图形界面不是默认重点RISC-V 模拟经常用qemu-system-riscv64。常见启动方式是指定一个 OpenSBI 固件、一个 Linux 内核和一个根文件系统然后给内核传consolettyS0让启动日志输出到串口。示例命令qemu-system-riscv64 \ -M virt \ -smp 2 \ -m 2048 \ -bios fw_jump.bin \ -kernel Image \ -drive filerootfs.ext4,formatraw \ -append root/dev/vda rw consolettyS0如果要用终端直接看日志可以再加-nographic。它会把串口和 QEMU monitor 都映射到当前终端。很多 RISC-V 嵌入式镜像没有图形界面跑起来之后只有一串字符输出这是正常现象。建议ARM/RISC-V 排障时优先开串口看日志不要只盯图形窗口。图形窗口黑屏时串口往往已经告诉了你原因。5. 把国产操作系统和 Windows 装进虚拟机5.1 安装国产系统之前先确认架构和引导方式国产操作系统里我实际接触比较多的是麒麟 V10、统信 UOS 这类。它们通常会同时提供 x86_64 和 arm64 的镜像下载时一定要注意架构。x86_64 镜像用qemu-system-x86_64 普通 UEFI/BIOS 启动即可。arm64 镜像用qemu-system-aarch64 对应 UEFI 固件或引导文件。很多人装国产系统失败不是虚拟化工具的问题而是镜像架构和虚拟架构不匹配。比如拿着 arm64 的 ISO却建了一个 x86_64 虚拟机自然会启动不了。下载完成后可以先看文件名一般会带x86_64、amd64、arm64、aarch64这类标识。如果还是不确定用file 镜像文件看一下能看到 ISO 的架构信息。安装过程中建议给虚拟机分配至少 2 核 4G 内存磁盘 20G 到 40G 都可以。网络先用 user 模式安装系统时只要能访问内网或本地源就行。桌面版系统进入后再根据实际需求调整磁盘和显存。5.2 安装 Windows 最容易踩的两个坑Windows 作为 Guest 系统大家用得很多但 QEMU 下有两个坑最明显。第一个坑是磁盘驱动。QEMU 默认给虚拟机提供 virtio 磁盘设备Windows 安装程序自带的驱动里不一定包含 virtio 驱动结果就是安装时看不到硬盘。解决办法是下载 virtio-win 驱动 ISO在 Windows 安装界面选择“加载驱动程序”手动指定驱动位置然后磁盘才会出现。如果你嫌麻烦也可以把磁盘接口改为 IDE 或 SATA 兼容模式比如-drive filewin-disk.qcow2,ifide这样安装阶段更省事但磁盘性能会弱一些。第二个坑是加速。Windows 宿主机如果没有启用“Windows 虚拟机监控程序平台”QEMU 就没法用 WHPXWindows Guest 只能纯软件模拟启动会明显变慢。安装系统和第一次开机时你会感觉每一步都有延迟。建议先确认 WHPX 可用再跑大任务。鼠标和显卡也是常见体验问题。QEMU 默认的显示设备在某些 Windows 驱动下会被识别成基础显示适配器桌面会比较卡。装上 virtio-win 里的显卡驱动或者使用 QEMU 支持的显示设备体验会好很多。6. 网络、磁盘和启动参数的更多细节6.1 qcow2、raw 和快照磁盘选型怎么定qcow2和raw是最常见的两种磁盘格式。它们没有绝对优劣看使用场景格式优点缺点常见场景qcow2支持稀疏分配、快照、加密读写时有格式开销日常测试、开发、快照回滚raw结构简单、性能更直接创建多大就实际占用多大不支持快照对磁盘性能敏感、后期做格式转换vmdkVMware 也支持格式兼容存在差异需要与 VMware/VirtualBox 混用qemu-img是磁盘管理的主要工具。常用命令qemu-img create -f qcow2 linux-disk.qcow2 20G qemu-img info linux-disk.qcow2 qemu-img resize linux-disk.qcow2 20G qemu-img snapshot -c before-test linux-disk.qcow2 qemu-img snapshot -a before-test linux-disk.qcow2快照很适合做实验在改动系统前拍一个before-test改坏了直接回到快照点。要注意的是raw 格式不支持qemu-img snapshot使用前先确认磁盘格式。6.2 四种网络模式别只会用默认 userQEMU 的网络玩法很多常见的四种user默认模式虚拟机通过宿主转发上网配置简单但外部主动连接虚拟机的功能受限。hostfwd在 user 模式基础上前置端口转发可以把宿主机的某个端口映射到虚拟机内部端口。tap创建虚拟网卡虚拟机可以和宿主局域网互通性能更好但通常需要 root 权限。bridge把虚拟机桥接到宿主物理网卡类似实体机接入网络生产环境常用配置也最复杂。如果只是普通上网和安装软件user 模式完全够用。想在宿主机上通过 SSH 连进虚拟机可以加端口转发qemu-system-x86_64 \ -m 2048 \ -smp 2 \ -hda linux-disk.qcow2 \ -netdev user,idnet0,hostfwdtcp::2222-:22 \ -device virtio-net-pci,netdevnet0启动后从宿主机执行ssh -p 2222 user127.0.0.1就能访问虚拟机里的 SSH 服务。这种模式很常用但要注意如果 Guest 里没有安装或启动 SSH端口转发不会生效。6.3 远程显示和自动化适合脚本化测试QEMU 默认会打开一个图形窗口。如果你在远程服务器上用 QEMU或者想让测试过程更省资源可以使用 VNCqemu-system-x86_64 \ -m 2048 \ -smp 2 \ -hda linux-disk.qcow2 \ -vnc :1这条命令会让 QEMU 监听 5901 端口然后用任意 VNC 客户端连接宿主机IP:5901就能看到界面。如果不需要界面只想看串口日志可以使用-display none配合-nographic。脚本化时我会把 QEMU 启动参数写成一个 shell 脚本把镜像路径、内存、磁盘、网络端口都做成变量。跑批量任务前先跑一条小样本确认输入路径、输出目录和日志格式都正常再开并发。批量任务不能只看“能跑”还要看失败时怎么重试、日志怎么归集、结果怎么判断。7. 常见报错排查从日志到输入逐层看7.1 启动阶段的报错启动 QEMU 时最常见的报错一般集中在命令、路径、权限和加速接口上。现象可能原因排查方向command not foundQEMU 没安装或 PATH 没配置确认安装路径配置 PATHCannot open ...磁盘或 ISO 路径错误、权限不足检查路径大小写、空格、文件是否存在KVM not available/dev/kvm 不存在或当前用户无权限开启 BIOS 虚拟化加载 kvm 模块加入 kvm 组WHPX not availableWindows 未启用虚拟机监控程序平台打开控制面板-Windows 功能勾选对应项unknown option参数写错或用了错误架构的 qemu 命令检查拼写确认使用qemu-system-x86_64还是qemu-system-aarch64这些报错和 QEMU 本身版本关系不大绝大多数是环境问题。7.2 运行阶段的报错启动进入系统后问题更容易出现在显示、网络、驱动、性能和输入设备上。如果虚拟机黑屏先看是不是 ARM/RISC-V 没有配置串口输出或者内核参数里没有指定 console。如果是 x86 图形界面先加-usb -device usb-tablet鼠标就不会飘。鼠标卡顿通常不是性能问题而是输入设备模式不对。网络不通时先确认使用的是 user 模式还是 tap 模式。user 模式默认支持大多数出网访问但端口映射需要单独配置。如果虚拟机内网卡没起来可能是 virtio 网卡驱动没装好这时可以把网卡改成 e1000 试试。Windows 安装时看不到硬盘基本就是缺少 virtio 驱动或者磁盘用了 IDE 接口仍然不识别。先用 IDE 接口排除问题再考虑加载 virtio 驱动。7.3 排查顺序建议减少瞎调参数遇到奇怪问题我一般按这个顺序排查先看启动输出。QEMU 在终端里打印的日志是最直接的线索。再看文件和镜像。确认 ISO、磁盘、固件路径没有写错架构与虚拟机匹配。查宿主虚拟化。/dev/kvm是否存在Windows 功能是否开启。查资源占用。内存是否足够磁盘空间是否满了QEMU 进程 CPU 占用是 100% 还是接近 0。最后才调参数。批量、显存、网络、内核选项逐个改不要一次改很多。很多人一遇到黑屏就疯狂加参数结果问题越改越复杂。实际上一次只改动一个变量才能判断到底哪一步生效。8. 什么时候用 QEMU什么时候换 VMware、VirtualBox 或云服务器8.1 没时间折腾图形界面时方案怎么选QEMU 功能很强但它不是所有场景的最优解。如果你只是想在 Windows 电脑上快速体验 Linux不关心自动化、多架构和底层细节VirtualBox 或 VMware Workstation 的图形界面更友好增强工具也齐全。相比之下QEMU 的配置是命令行式的新手一开始可能需要一点学习成本。如果你要做多架构验证、嵌入式内核调试、自动化测试或者想把系统构建过程写进流水线QEMU 就是更合理的方案。它没有图形界面依赖可以用命令行完全控制也适合在无桌面的 Linux 服务器上运行。如果业务已经稳定需要长期对外提供计算服务直接用 KVM 或云服务器更合适。QEMU 在开发测试阶段很顺但生产环境的运维重点会转向监控、备份、网络隔离这些不是 QEMU 单机命令能解决的事。8.2 给新手的最后建议先跑通一个最简单的系统再去碰复杂特性。不要一上来就想着模拟 ARM、RISC-V、Windows、国产系统全部同时跑。多架构不只是换一个二进制名这么简单系统镜像、固件、驱动、安装过程都要配套一个环节不对启动就会失败。如果只是学习默认配置通常够用如果要批量使用提前把日志、输出目录、失败重试这些基础设施整理好。虚拟机不是真机外设、中断、电源管理和性能特征都会有差异。通过 QEMU 能快速验证软件行为但最终硬件相关的问题还是要回到真实设备上去确认。踩过几次之后我发现很多问题不是 QEMU 能力不够而是前置环境和输入材料没有处理干净。

相关新闻

最新新闻

日新闻

周新闻

月新闻