☰
QEMU多架构模拟实战:从x86到ARM与国产系统适配
2026/10/26 10:42:10 网站建设 项目流程

这次我们来看一个老牌但至今仍非常能打的开源项目:QEMU。如果你做嵌入式开发、Linux 内核调试、跨架构程序测试,或者需要在一台 x86 电脑上临时跑 ARM、RISC-V 环境,甚至想安装麒麟、统信、鸿蒙这类国产操作系统做适配验证,QEMU 几乎是最快能上手的方案。

它最大的特点是“一套工具,多种架构”。QEMU 既能模拟 x86/x86_64,也能模拟 ARM/AArch64、RISC-V、MIPS、PowerPC 等常见硬件架构;宿主机可以跑在 Linux、Windows、macOS 上,虚拟机里可以跑 Linux、Windows、FreeBSD,以及基于这些内核衍生的国产操作系统。换句话说,你不用买 ARM 开发板,也能先在一台普通 x86 电脑上验证 ARM 程序能不能跑;不需要物理安装双系统,也能在 Windows 里启动一个麒麟 V10 的虚拟机做应用适配。

这篇文章会从零开始,带你完成 QEMU 的安装、虚拟机磁盘创建、x86 / ARM / RISC-V 三种架构的启动测试、国产操作系统镜像加载、QMP 接口调用和批量任务脚本。全文不写空话,直接给命令、给参数、给排查思路。适合正在学习 Linux 虚拟化、嵌入式 Linux、国产系统适配,或者想在自己的电脑上搭建多架构测试环境的开发者收藏阅读。

1. 核心能力速览

在动手之前,先把 QEMU 的能力边界和硬件门槛说清楚。下面是基于常见部署方式整理的能力速览,具体的性能和资源占用需要根据你本机的 CPU、内存以及虚拟化开关情况实测。

能力项说明
项目名称QEMU(Quick EMUlator)
开源协议GPLv2,部分组件为 LGPL / BSD
主要功能全系统模拟、用户态模拟、虚拟机监控、跨架构运行
支持硬件架构x86 / x86_64、ARM / AArch64、RISC-V、MIPS、PowerPC、S390X 等
支持宿主机Linux、Windows、macOS、BSD
支持客户机Linux、Windows、FreeBSD、国产操作系统(麒麟 / 统信 / 鸿蒙等,按 ISO 架构匹配)
加速方式KVM(Linux)、WHPX(Windows)、Hypervisor.framework(macOS)、TCG 纯软件模拟
启动方式命令行启动,或配合 libvirt / virt-manager 图形管理
图形输出VNC、SDL、GTK、SPICE
接口能力QMP(QEMU Machine Protocol)、QAPI、Monitor 控制台
批量任务支持命令行脚本批量创建、启动、暂停、销毁虚拟机
适合场景系统测试、内核调试、嵌入式开发、跨架构编译、国产化适配验证

如果你关心的只是“能不能在一台普通台式机上跑”,答案是可以。纯软件模拟(TCG)不需要特殊硬件,但速度较慢;如果宿主机支持 KVM、WHPX 或 Hypervisor.framework,虚拟机能获得接近原生的性能。下面会分别说明。

2. 适用场景与使用边界

QEMU 的适用场景很广,但也不是万能的。把它放入实际项目之前,先看几个典型用途。

第一个场景是嵌入式开发和内核调试。很多开发者没有 ARM 开发板,或者手头只有 x86 开发板,但又需要验证 ARM 指令集下的程序行为。QEMU 的qemu-system-aarch64可以模拟 virt 机器,配合 UEFI 或直接加载内核镜像,就能在本地跑一个 ARM64 Linux。RISC-V 同样如此,qemu-system-riscv64是 RISC-V 软件模拟器的事实标准,社区的大量 CI 测试都跑在它上面。

第二个场景是跨系统适配测试。比如你在 Windows 上写了一个软件,需要验证它在 Linux 下是否正常;或者你是运维,需要在麒麟 V10、统信 UOS 上测试 SVN、Nginx、Java 环境。物理安装多系统切换麻烦,用 QEMU 创建虚拟机,把 ISO 挂载进去,几分钟就能得到一个可复现的测试环境。

第三个场景是持续集成(CI)。QEMU 支持命令行启动、支持串口输出、支持 QMP 控制,可以在无图形环境下批量启动多个虚拟机,这对自动化测试很有价值。

不过也要说清楚边界。QEMU 的 TCG 纯软件模拟性能有限,不适合作为生产环境的计算虚拟化平台;如果需要大规模虚拟机集群,通常还是使用 KVM + libvirt + 云管平台,或者直接购买云服务器。另外,QEMU 默认的显卡驱动是模拟的 VGA 或 virtio-vga,3D 性能很弱,玩游戏、跑 GPU 计算不适合直接用 QEMU 默认配置,需要做 GPU 透传等特殊配置。日常的桌面系统办公、服务端程序测试、内核编译、嵌入式软件验证,QEMU 完全够用。

使用边界上必须强调:无论是安装 Linux、Windows 还是国产操作系统,镜像都必须来自官方渠道或已授权渠道;涉及公司内部系统、个人信息或受版权保护的素材时,不要随意分发或用于未授权场景。QEMU 本身是开源工具,但里面的操作系统、应用软件、字体等仍受各自许可约束。

3. 环境准备与前置条件

QEMU 的安装不复杂,但环境准备直接影响后续是否能硬件加速。先按宿主机系统检查三件事:CPU 虚拟化支持、KVM / WHPX 模块、磁盘空间。

Linux 宿主机建议先确认虚拟化扩展是否开启:

# 输出大于 0 表示 CPU 支持虚拟化扩展 egrep -c '(vmx|svm)' /proc/cpuinfo # 检查 KVM 设备是否存在 ls -l /dev/kvm

如果/proc/cpuinfo输出为 0,需要进 BIOS 开启 Intel VT-x 或 AMD-V;如果/dev/kvm不存在,需要安装 KVM 相关模块。Ubuntu / Debian 上通常是kvm-ok或/dev/kvm就能看到结果;CentOS / RHEL 需要确认内核模块kvm_intel或kvm_amd已加载。

Windows 宿主机需要开启 Windows 虚拟机监控程序平台(WHPX)或 Hyper-V。在“启用或关闭 Windows 功能”里勾选“虚拟机监控程序平台”和“Hyper-V”,重启生效。另外,QEMU 在 Windows 上依赖 Visual C++ 运行库,如果安装后启动报缺少 DLL 或提示 Microsoft Visual C++ 运行库问题,去微软官网安装最新的 Visual C++ 2015-2022 Redistributable(x64 和 x86 都装一份比较稳)即可。这个坑在较干净的 Windows 上很常见,尤其是装完 Node.js、Python 之后经常弹出 runtime 缺失,本质是 VC++ 库不完整。

macOS 宿主机使用 Hypervisor.framework,不需要额外开启虚拟化设置,但 QEMU 通常通过 Homebrew 安装,需要先装好 Homebrew。

磁盘空间方面,QEMU 本体很小,几百 MB 到 1GB 左右,但虚拟机磁盘镜像需要单独规划。一个最小化的 Linux 测试系统 10GB 够用;桌面版国产系统或 Windows 建议预留 40GB 以上。如果打算同时跑 3 个虚拟机做批量测试,磁盘空间按 3 份镜像预留。

网络方面,QEMU 默认的用户模式网络(slirp)使用10.0.2.0/24网段,虚拟机收到的通常就是10.0.2.15,网关是10.0.2.2,DNS 是10.0.2.3。这个模式不需要桥接配置,启动即可上网,但宿主机访问虚拟机里的服务要用端口映射。

4. 安装部署与启动方式

不同系统安装 QEMU 的方式不同,下面给出主流的安装命令。建议把常见的 QEMU 系统模拟器和工具一次装齐,省的后面缺哪个再补。

4.1 Linux(Debian / Ubuntu)

sudo apt update sudo apt install qemu-system-x86 qemu-system-arm qemu-system-riscv64 qemu-utils

如果只需要 x86 模拟,装qemu-system-x86就够了;要测 ARM 和 RISC-V,就把对应包也装上。

4.2 Linux(CentOS / RHEL / 麒麟等)

sudo yum install qemu-kvm qemu-img qemu-system-x86 sudo yum install qemu-system-arm qemu-system-riscv64

在国产操作系统的桌面版上,安装源里一般也有 QEMU,包名可能略有差异,安装前用yum search qemu或apt search qemu搜一下就行。

4.3 Windows

Windows 推荐用官方安装包或包管理器:

winget install QEMU.QEMU

也可以去 QEMU 官网下载 Windows 安装包,安装后把C:\Program Files\qemu加入 PATH,方便在命令行直接调用。

4.4 macOS

brew install qemu

macOS 上如果只跑 ARM 虚拟机,M 系列芯片可以直接用qemu-system-aarch64;如果要在 Apple Silicon 上模拟 x86,也能跑,但速度比原生虚拟化慢不少。

安装完成后,验证一下各个组件是否可用:

qemu-system-x86_64 --version qemu-system-aarch64 --version qemu-system-riscv64 --version qemu-img --version

只要版本号能打印出来,安装就成功了。

5. 功能测试与效果验证

这一节是重头戏。我们从 x86 开始,然后是 ARM、RISC-V,最后是国产操作系统加载验证。建议按顺序执行一次,你就能把 QEMU 的核心用法串起来。

5.1 x86 虚拟机启动 Linux

先创建一个虚拟磁盘镜像。QEMU 最常用的是 qcow2 格式,特点是按需分配空间,刚创建时很小,随着写入逐渐增长。

qemu-img create -f qcow2 disk.qcow2 20G

然后下载一个 Linux 发行版的安装 ISO,这里以 Ubuntu Server 为例(其他发行版流程一样):

qemu-system-x86_64 \ -m 2048 \ -smp 2 \ -accel kvm \ -hda disk.qcow2 \ -cdrom ubuntu-22.04-server-amd64.iso \ -boot d \ -vga virtio \ -netdev user,id=net0 \ -device virtio-net-pci,netdev=net0

参数含义:

  • -m 2048:分配 2GB 内存。
  • -smp 2:分配 2 个 vCPU。
  • -accel kvm:启用 KVM 硬件加速。如果/dev/kvm不可用,去掉这个参数会退回 TCG 纯模拟,但速度会明显变慢。
  • -hda disk.qcow2:指定第一块磁盘。
  • -cdrom ...:挂载 ISO。
  • -boot d:从光盘启动。
  • -vga virtio:使用 virtio 显卡,显示性能比默认 VGA 好。
  • -netdev user,id=net0:用户模式网络。
  • -device virtio-net-pci,netdev=net0:virtio 网卡。

启动后会出现一个图形窗口,进入安装界面。安装完成后重新启动,这次不再挂载 ISO:

qemu-system-x86_64 \ -m 2048 \ -smp 2 \ -accel kvm \ -hda disk.qcow2 \ -netdev user,id=net0,hostfwd=tcp::2222-:22 \ -device virtio-net-pci,netdev=net0

这里加了一个hostfwd=tcp::2222-:22,把宿主机的 2222 端口映射到虚拟机的 22 端口。这样你可以在宿主机上直接 SSH 进入虚拟机:

ssh user@127.0.0.1 -p 2222

判断成功的标准:虚拟机能正常进入系统;磁盘分区可见;SSH 能连上;网络能 ping 通外网。

常见失败原因:

  • 启动报kvm_init_vcpu failed:KVM 未开启,检查/dev/kvm和 BIOS 设置。
  • 图形窗口花屏或卡住:尝试换-vga std或去掉-vga virtio。
  • 网卡不识别:确认内核是否包含 virtio_net 模块。安装系统时如果用的是默认 VGA,网络驱动建议选择 e1000 或 virtio,视发行版支持情况而定。

5.2 ARM 环境模拟与嵌入式验证

ARM 模拟是 QEMU 的另一个强项。下面以qemu-system-aarch64为例,用 virt 机器模拟 ARM64 环境。你需要准备一个 ARM64 的可引导镜像或者 ARM64 的 cloud 镜像。

以 Ubuntu ARM64 cloud 镜像为例,先下载镜像并创建磁盘:

qemu-img create -f qcow2 arm-disk.qcow2 10G

然后启动:

qemu-system-aarch64 \ -machine virt \ -cpu cortex-a57 \ -smp 2 \ -m 2048 \ -kernel vmlinuz \ -initrd initrd.img \ -append "root=/dev/vda1 console=ttyAMA0" \ -drive file=arm-disk.qcow2,format=qcow2,if=virtio \ -netdev user,id=net0,hostfwd=tcp::2223-:22 \ -device virtio-net-pci,netdev=net0 \ -nographic

注意这里使用了-machine virt,这是 QEMU ARM 模拟最常用的虚拟机器型号。-cpu cortex-a57指定 CPU 型号,也可以换成cortex-a72、max等。-append里的console=ttyAMA0是 ARM 默认串口设备,配合-nographic可以把串口输出直接打印到当前终端,这对无图形环境的嵌入式调试非常有用。

如果你没有现成的 ARM64 内核和 initrd,也可以使用云镜像直接引导。部分发布版提供了可直接引导的 QEMU ARM64 镜像,下载后按格式加载-drive即可。实际操作时以镜像说明为准。

ARM 环境跑起来后,验证思路是这样的:在虚拟机内执行uname -a,能看到aarch64或arm64字样,说明当前是 ARM64 架构。如果你想验证一个 ARM 程序能否运行,可以在宿主机上交叉编译一个静态程序,再传到虚拟机里执行:

# 宿主机交叉编译,安装 aarch64-linux-gnu-gcc 后执行 aarch64-linux-gnu-gcc -static -o hello_arm hello.c scp -P 2223 hello_arm user@127.0.0.1:~/

然后在虚拟机里运行:

./hello_arm

能正常输出,说明你的 ARM64 程序逻辑没问题。这就是很多嵌入式开发者用 QEMU 做初步验证的方式。

5.3 RISC-V 环境模拟

RISC-V 是这几年很受关注的开源指令集架构。QEMU 对 RISC-V 的支持已经非常成熟,qemu-system-riscv64可以模拟 virt 机器,加载 OpenSBI 和 Linux 内核。

启动 RISC-V 虚拟机需要三样东西:OpenSBI 固件(fw_jump.bin)、RISC-V Linux 内核(Image)、根文件系统镜像。一般来说,buildroot 或发行版打包的 RISC-V 构建产物里可以直接获取。

启动命令示例:

qemu-system-riscv64 \ -machine virt \ -m 1024 \ -smp 2 \ -bios fw_jump.bin \ -kernel Image \ -append "root=/dev/vda rw console=ttyS0" \ -drive file=rootfs.img,format=raw,id=hd0 \ -device virtio-blk-device,drive=hd0 \ -netdev user,id=net0 \ -device virtio-net-device,netdev=net0 \ -nographic

RISC-V virt 机器默认串口是ttyS0,所以-append里写console=ttyS0。启动后能看到 OpenSBI 的 logo 和 Linux 内核启动日志,最后进入 shell。在虚拟机里执行:

uname -a

输出中会包含riscv64,这就证明你的 RISC-V 内核在 QEMU 里跑通了。

RISC-V 模拟最常见的坑是-bios和-kernel不匹配。比如 OpenSBI 版本太老,和内核不兼容,启动会卡在 OpenSBI 阶段没有任何输出。解决办法是换用配套版本,或者直接用发行版提供的 prebuilt 镜像,避免自己组合带来的兼容性问题。

5.4 国产操作系统安装验证

QEMU 在国产操作系统适配场景中非常常用。下面是麒麟 V10 的一个典型启动示例,统信 UOS 和鸿蒙桌面版的思路类似,不同之处在于 ISO 路径和安装时的硬件兼容性。

从官方渠道获取麒麟 V10 桌面版 x86_64 的 ISO 后,创建磁盘并启动:

qemu-img create -f qcow2 kylin.qcow2 40G qemu-system-x86_64 \ -m 4096 \ -smp 4 \ -accel kvm \ -hda kylin.qcow2 \ -cdrom Kylin-Desktop-V10-SP1-x86_64.iso \ -boot d \ -vga virtio \ -netdev user,id=net0,hostfwd=tcp::2224-:22 \ -device virtio-net-pci,netdev=net0 \ -device usb-tablet

这里建议加上-device usb-tablet,解决安装界面里鼠标指针乱飘或点不准的问题。

安装过程中关注这几个点:

  • 磁盘分区是否正常识别。
  • 是否能加载到安装界面。
  • 网络是否可用。
  • 安装完成后,桌面能否进入。

安装完成后,重启时不挂载 ISO:

qemu-system-x86_64 \ -m 4096 \ -smp 4 \ -accel kvm \ -hda kylin.qcow2 \ -vga virtio \ -netdev user,id=net0,hostfwd=tcp::2224-:22 \ -device virtio-net-pci,netdev=net0 \ -device usb-tablet

进入系统后,可以继续验证实际使用场景。比如在麒麟 V10 里配置 SVN 服务端或客户端,检查软件源是否可用,安装常用编译工具等。这里以安装 SVN 客户端为例:

sudo yum install subversion -y svn --version

这样就能在虚拟机里完成国产系统的应用适配验证。需要注意,不同版本的麒麟、统信 ISO 的包管理器可能不同,有些是基于 apt 的,有些是基于 yum/dnf 的,进入系统后先用cat /etc/os-release看一下发行版信息,再决定用哪个包管理器。

鸿蒙桌面版的启动方式类似,关键在于检查 ISO 的 CPU 架构是不是 x86_64。如果是 ARM 版镜像,就不要用qemu-system-x86_64,而要改用qemu-system-aarch64,并且宿主机需要能加载对应的 UEFI 固件。从网络搜索来看,鸿蒙桌面版 x86 镜像存在但驱动兼容性还需要实测,尤其注意显示驱动和网络驱动,必要时在 QEMU 里改用-vga std或者加-machine q35测试。

6. 接口 API 与批量任务

QEMU 不是只能手动敲命令行,它提供了 QMP(QEMU Machine Protocol)接口,允许外部程序以 JSON 格式控制虚拟机。这对批量任务和自动化非常有价值。

6.1 启动 QMP 服务

启动虚拟机时,通过-qmp参数开启 QMP 服务:

qemu-system-x86_64 \ -m 2048 \ -smp 2 \ -hda disk.qcow2 \ -qmp tcp:127.0.0.1:4444,server,nowait

这里监听在本地 4444 端口。server,nowait表示 QMP 服务立即监听,不阻塞启动过程。

6.2 使用 qmp-shell 交互调试

QEMU 自带qmp-shell工具,可以交互式执行 QMP 命令:

qmp-shell 127.0.0.1:4444

进入后先执行:

qmp_capabilities

然后可以查询虚拟机状态:

query-status

返回结果类似:

{"return": {"status": "running", "singlestep": false, "running": true}}

这说明虚拟机正在运行。

6.3 Python 脚本调用 QMP

如果要把 QMP 集成到自动化测试里,用 Python 写脚本更灵活。下面是一个最小示例,使用标准库 socket 直接发送 JSON 命令:

import socket import json def qmp_execute(host, port, cmd, args=None): s = socket.create_connection((host, port)) # 读取启动 greeting s.recv(4096) # 握手 s.sendall(b'{"execute": "qmp_capabilities"}\r\n') s.recv(4096) # 执行命令 payload = {"execute": cmd} if args: payload["arguments"] = args s.sendall((json.dumps(payload) + "\r\n").encode()) data = s.recv(4096) s.close() return json.loads(data.decode()) if __name__ == "__main__": result = qmp_execute("127.0.0.1", 4444, "query-status") print(result)

实际项目中更推荐使用 QEMU 官方提供的qmpPython 库,用法类似。脚本只是演示一个最小可用的调用链路。

6.4 批量创建与启动虚拟机

QEMU 的命令行设计很适合脚本化。假设你有一份基础磁盘镜像base.qcow2,想快速创建 3 个互相独立的虚拟机,可以用 qemu-img 的backing_file特性,这样新镜像只记录差异数据,能节省大量磁盘空间。

for i in 1 2 3; do qemu-img create -f qcow2 -b base.qcow2 -F qcow2 vm$i.qcow2 done

然后批量启动:

for i in 1 2 3; do qemu-system-x86_64 \ -m 1024 \ -smp 1 \ -hda vm$i.qcow2 \ -vnc :$i \ -daemonize \ -pidfile /tmp/qemu-$i.pid done

启动后可以查进程:

ps aux | grep qemu

需要批量关机时,可以通过 QMP 逐个发送system_powerdown:

for i in 1 2 3; do qmp-shell 127.0.0.1:$((4400 + i)) done

批量任务要注意三个资源:内存总量、CPU 总量、VNC 端口。3 个-m 1024的虚拟机至少需要 3GB 可用内存,CPU 核数也建议不超过物理核数总和。VNC 端口从:1开始对应5901,不要和本机已有服务冲突。

7. 资源占用与性能观察

QEMU 的资源占用和启动方式直接相关。纯软件模拟(TCG)和硬件加速(KVM / WHPX / Hypervisor.framework)之间有数量级的性能差距。下面把观察方法和影响因素说清楚。

观察资源占用的方法很简单。Linux 下用top或htop看进程 CPU 和内存:

top -p $(pgrep -d ',' qemu-system)

Windows 下用任务管理器看“详细信息”里的 qemu-system-x86_64.exe 进程。内存占用一般和启动时的-m参数、客户机实际负载有关;CPU 占用在 TCG 模式下会很高,因为 QEMU 需要把客户机指令翻译成宿主机指令。

影响性能的关键因素有这些:

  • 是否启用硬件加速。-accel kvm开启后,x86 虚拟机的 CPU 性能接近原生;去掉后使用 TCG,CPU 密集型的编译任务会明显变慢。
  • 磁盘和网卡设备类型。virtio 设备比 IDE 和 e1000 性能好很多。安装 Linux 时如果能选 virtio 驱动,尽量选 virtio。
  • 内存大小和 CPU 核数。-m 1024跑轻量服务可以,跑桌面系统建议至少 4GB;CPU 核数一般不超过宿主机物理核数。
  • 图形模式。带图形界面的虚拟机比-nographic模式占用更多宿主机资源。如果是无头测试,建议使用-display none或-nographic,能明显降低资源占用。
  • 批量任务数量。同时启动的虚拟机越多,内存和 CPU 竞争越明显。建议批量测试时先用 1 个虚拟机跑通,再逐步增加。

如果想降低资源占用,可以从这几个方向调:

# 无图形、单核、1G 内存、串口输出 qemu-system-x86_64 \ -m 1024 \ -smp 1 \ -hda disk.qcow2 \ -display none \ -serial mon:stdio

加了-display none之后,没有图形窗口,所有串口输出都显示在当前终端。这个模式对服务端测试很友好,占用的宿主机资源也比较少。

还有一个值得提的是快照功能。qcow2 格式支持快照,可以在测试前创建一个干净状态,测试后回滚:

qemu-img snapshot -c clean-state disk.qcow2 qemu-img snapshot -l disk.qcow2 qemu-img snapshot -a clean-state disk.qcow2

快照的好处是回滚快,不用重新安装系统,适合反复修改配置的验证场景。注意快照文件会占用额外空间,不要无限制创建。

8. 常见问题与排查方法

QEMU 使用中遇到的问题大多集中在 KVM 未开启、镜像格式不对、网络不通、串口无输出这几类。下面整理成表格,方便快速对照。

问题现象可能原因排查方式解决方案
启动报kvm_init_vcpu failed硬件虚拟化未开启或 KVM 模块未加载ls -l /dev/kvm;egrep -c '(vmx|svm)' /proc/cpuinfo进 BIOS 开启 VT-x/AMD-V;modprobe kvm_intel或modprobe kvm_amd
Windows 启动报缺少 MSVC 运行库系统缺少 Visual C++ 运行库查看弹窗对应的 DLL 名称安装 Visual C++ 2015-2022 Redistributable x64/x86
虚拟机网络不通用户模式网络 DNS 或映射错误虚拟机内ping 10.0.2.2;宿主机检查端口确认-netdev user参数;SSH 使用hostfwd=tcp::2222-:22
ARM 启动后串口无输出console=参数不匹配检查命令行-appendARM 用console=ttyAMA0;x86 用console=ttyS0
RISC-V 启动卡在 OpenSBI固件与内核版本不匹配观察最后一行输出下载配套 OpenSBI 和内核,或使用 prebuilt 镜像
VNC 连接被拒绝端口占用或监听地址不对`netstat -angrep 5901`
国产系统安装时鼠标点不准缺少绝对定位输入设备鼠标乱飘、点不到按钮加-device usb-tablet
qemu-img报镜像格式错误使用-hda加载了 raw 或 vdi 镜像qemu-img info 镜像文件确认格式后用-drive file=...,format=qcow2明确指定
多个虚拟机同时启动后宿主机卡顿内存或 CPU 超卖free -h;top观察减少-m和-smp;分批启动
macOS 上 ARM 虚拟机启动慢Apple Silicon 模拟 x86观察 CPU 占用改用qemu-system-aarch64跑 ARM 系统

排查的思路通常是先看错误日志,再看配置文件,最后看硬件资源。QEMU 启动时如果卡住,可以按Ctrl+Alt+G释放鼠标,按Ctrl+C中断当前进程,用-d参数增加调试日志:

qemu-system-x86_64 -d guest_errors -D qemu.log -hda disk.qcow2

日志会写到qemu.log,里面能看到客户机中的报错信息。这个方法在调试串口、磁盘、网络问题时很实用。

9. 最佳实践与使用建议

QEMU 功能多,参数组合也多,直接用容易踩坑。这里整理一套比较稳妥的使用建议,适合日常开发和测试。

第一,第一次使用先把配置降到最小。不要一上来就分配 8GB 内存、8 核 CPU、加载一堆设备。先用-m 1024 -smp 1加一个磁盘镜像,跑通一个最小 Linux,再逐步增加需求。最小可运行配置能帮你更快定位是系统问题还是 QEMU 参数问题。

第二,模板镜像和独立镜像分目录管理。建议这样组织目录:

qemu-project/ ├── images/ # 模板镜像,只读 ├── disks/ # 实际使用的磁盘 ├── isos/ # 操作系统 ISO ├── scripts/ # 启动脚本 ├── logs/ # QEMU 日志 └── snapshots/ # 快照相关文件

用模板镜像配合 backing file 创建新虚拟机,既能节省磁盘空间,又能保证每个测试环境从一开始是干净的。

第三,批量任务必须留痕。每个虚拟机的启动命令、日志、PID 文件分开放。启动时加-pidfile,方便后期批量清理。日志里记录启动时间和退出时间,测试失败时能快速回溯。

第四,接口服务只绑定本机。QMP 的-qmp tcp:127.0.0.1:4444,server,nowait已经绑定了本机回环地址,不要改成0.0.0.0,否则有被外部访问的风险。VNC 也一样,需要远程访问时建议通过 SSH 隧道,不要直接把 5900 端口暴露到公网。

第五,版权与授权问题要前置。安装 Windows、商用 Linux 发行版、国产操作系统时,确认你有权使用该镜像。对于企业内部测试,尽量使用本单位已采购并授权的镜像。涉及其他人肖像、声音、版权的素材不要在虚拟机里随意分发。

第六,镜像和快照不是垃圾桶。测试完成后及时清理不必要的磁盘镜像和快照,避免占满磁盘。qcow2 镜像删除后空间不会立即释放给宿主机,需要删除文件本身;如果使用了 backing file,还要注意归档时把 base 镜像一起保留。

10. 总结与下一步

QEMU 最值得尝试的点,是它用一套命令行工具就能覆盖 x86、ARM、RISC-V 三种主流架构,还能在同一个宿主机上安装 Linux、Windows、国产操作系统做交叉验证。对于嵌入式开发者、系统运维和做国产化适配的工程师来说,这几乎是本地测试环境里最通用的一个工具。

按照本文顺序,建议你先从 x86 + KVM 启动一个 Linux 虚拟机开始,确认 QEMU 的安装、磁盘创建、网络映射都能通;然后再试 ARM 模拟和 RISC-V 内核启动,这两步能让你理解不同架构之间的启动参数差异;最后再加载国产操作系统 ISO,验证实际应用和软件源可用性。最容易踩的坑集中在三处:硬件虚拟化没开启、console=参数和机器型号不匹配、ISO 架构与 QEMU 模拟器不匹配。

把基础流程跑通之后,可以继续往这些方向深入:用 libvirt 和 virt-manager 做图形化管理,用 cloud-init 做无人值守安装,用 virtiofs 实现宿主机和虚拟机之间的文件共享,用 GPU 透传把显卡直通给虚拟机。这些能力都能在 QEMU 的基础上扩展出来,但前提是先把这篇文章里的命令行基本功掌握扎实。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询