尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

QEMU多架构模拟实战:从x86到ARM与国产系统适配

QEMU多架构模拟实战:从x86到ARM与国产系统适配 这次我们来看一个老牌但至今仍非常能打的开源项目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、内存以及虚拟化开关情况实测。能力项说明项目名称QEMUQuick EMUlator开源协议GPLv2部分组件为 LGPL / BSD主要功能全系统模拟、用户态模拟、虚拟机监控、跨架构运行支持硬件架构x86 / x86_64、ARM / AArch64、RISC-V、MIPS、PowerPC、S390X 等支持宿主机Linux、Windows、macOS、BSD支持客户机Linux、Windows、FreeBSD、国产操作系统麒麟 / 统信 / 鸿蒙等按 ISO 架构匹配加速方式KVMLinux、WHPXWindows、Hypervisor.frameworkmacOS、TCG 纯软件模拟启动方式命令行启动或配合 libvirt / virt-manager 图形管理图形输出VNC、SDL、GTK、SPICE接口能力QMPQEMU 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-vga3D 性能很弱玩游戏、跑 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 Redistributablex64 和 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.2DNS 是10.0.2.3。这个模式不需要桥接配置启动即可上网但宿主机访问虚拟机里的服务要用端口映射。4. 安装部署与启动方式不同系统安装 QEMU 的方式不同下面给出主流的安装命令。建议把常见的 QEMU 系统模拟器和工具一次装齐省的后面缺哪个再补。4.1 LinuxDebian / Ubuntusudo 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 LinuxCentOS / 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 WindowsWindows 推荐用官方安装包或包管理器winget install QEMU.QEMU也可以去 QEMU 官网下载 Windows 安装包安装后把C:\Program Files\qemu加入 PATH方便在命令行直接调用。4.4 macOSbrew install qemumacOS 上如果只跑 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,idnet0 \ -device virtio-net-pci,netdevnet0参数含义-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,idnet0用户模式网络。-device virtio-net-pci,netdevnet0virtio 网卡。启动后会出现一个图形窗口进入安装界面。安装完成后重新启动这次不再挂载 ISOqemu-system-x86_64 \ -m 2048 \ -smp 2 \ -accel kvm \ -hda disk.qcow2 \ -netdev user,idnet0,hostfwdtcp::2222-:22 \ -device virtio-net-pci,netdevnet0这里加了一个hostfwdtcp::2222-:22把宿主机的 2222 端口映射到虚拟机的 22 端口。这样你可以在宿主机上直接 SSH 进入虚拟机ssh user127.0.0.1 -p 2222判断成功的标准虚拟机能正常进入系统磁盘分区可见SSH 能连上网络能 ping 通外网。常见失败原因启动报kvm_init_vcpu failedKVM 未开启检查/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 consolettyAMA0 \ -drive filearm-disk.qcow2,formatqcow2,ifvirtio \ -netdev user,idnet0,hostfwdtcp::2223-:22 \ -device virtio-net-pci,netdevnet0 \ -nographic注意这里使用了-machine virt这是 QEMU ARM 模拟最常用的虚拟机器型号。-cpu cortex-a57指定 CPU 型号也可以换成cortex-a72、max等。-append里的consolettyAMA0是 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 user127.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 consolettyS0 \ -drive filerootfs.img,formatraw,idhd0 \ -device virtio-blk-device,drivehd0 \ -netdev user,idnet0 \ -device virtio-net-device,netdevnet0 \ -nographicRISC-V virt 机器默认串口是ttyS0所以-append里写consolettyS0。启动后能看到 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,idnet0,hostfwdtcp::2224-:22 \ -device virtio-net-pci,netdevnet0 \ -device usb-tablet这里建议加上-device usb-tablet解决安装界面里鼠标指针乱飘或点不准的问题。安装过程中关注这几个点磁盘分区是否正常识别。是否能加载到安装界面。网络是否可用。安装完成后桌面能否进入。安装完成后重启时不挂载 ISOqemu-system-x86_64 \ -m 4096 \ -smp 4 \ -accel kvm \ -hda kylin.qcow2 \ -vga virtio \ -netdev user,idnet0,hostfwdtcp::2224-:22 \ -device virtio-net-pci,netdevnet0 \ -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 不是只能手动敲命令行它提供了 QMPQEMU 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, argsNone): 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_powerdownfor 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 性能接近原生去掉后使用 TCGCPU 密集型的编译任务会明显变慢。磁盘和网卡设备类型。virtio 设备比 IDE 和 e1000 性能好很多。安装 Linux 时如果能选 virtio 驱动尽量选 virtio。内存大小和 CPU 核数。-m 1024跑轻量服务可以跑桌面系统建议至少 4GBCPU 核数一般不超过宿主机物理核数。图形模式。带图形界面的虚拟机比-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/kvmegrep -c (vmx|svm) /proc/cpuinfo进 BIOS 开启 VT-x/AMD-Vmodprobe kvm_intel或modprobe kvm_amdWindows 启动报缺少 MSVC 运行库系统缺少 Visual C 运行库查看弹窗对应的 DLL 名称安装 Visual C 2015-2022 Redistributable x64/x86虚拟机网络不通用户模式网络 DNS 或映射错误虚拟机内ping 10.0.2.2宿主机检查端口确认-netdev user参数SSH 使用hostfwdtcp::2222-:22ARM 启动后串口无输出console参数不匹配检查命令行-appendARM 用consolettyAMA0x86 用consolettyS0RISC-V 启动卡在 OpenSBI固件与内核版本不匹配观察最后一行输出下载配套 OpenSBI 和内核或使用 prebuilt 镜像VNC 连接被拒绝端口占用或监听地址不对netstat -angrep 5901国产系统安装时鼠标点不准缺少绝对定位输入设备鼠标乱飘、点不到按钮加-device usb-tabletqemu-img报镜像格式错误使用-hda加载了 raw 或 vdi 镜像qemu-img info 镜像文件确认格式后用-drive file...,formatqcow2明确指定多个虚拟机同时启动后宿主机卡顿内存或 CPU 超卖free -htop观察减少-m和-smp分批启动macOS 上 ARM 虚拟机启动慢Apple Silicon 模拟 x86观察 CPU 占用改用qemu-system-aarch64跑 ARM 系统排查的思路通常是先看错误日志再看配置文件最后看硬件资源。QEMU 启动时如果卡住可以按CtrlAltG释放鼠标按CtrlC中断当前进程用-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 的基础上扩展出来但前提是先把这篇文章里的命令行基本功掌握扎实。
返回列表