3. QEMU命令行基础:常用参数解析

QEMU系统级模拟的核心能力通过命令行参数暴露给用户。掌握这些参数是构建虚拟平台、调试内核启动、挂载根文件系统的基础。本章逐一解析最常用的七个参数:-M、-cpu、-smp、-m、-kernel、-initrd、-hda 和 -nographic,并给出典型组合示例。

学习提示: 建议在终端中跟随每个参数动手测试。QEMU 参数顺序不敏感,但 -kernel 和 -initrd 通常放在一起,-hda 放在最后。

3.1 机器类型(-M)

-M 或 -machine 指定模拟的目标硬件平台。不同机器类型决定了 CPU 型号、中断控制器、总线拓扑、外设集合等底层差异。

机器类型 适用架构 典型用途
virt ARM / AArch64 通用虚拟平台,无固定外设,适合内核调试
pc / q35 x86 / x86_64 传统 PC 与现代化 Q35 芯片组
raspi3b AArch64 树莓派 3B 模拟
sifive_u RISC-V SiFive Unleashed 开发板模拟
# 查看所有支持的机器类型
qemu-system-aarch64 -M help

# 使用 virt 机器
qemu-system-aarch64 -M virt -cpu cortex-a57 ...
-M 参数:机器类型选择流程 -M 参数输入 架构匹配 ARM: virt / raspi x86: pc / q35 RISC-V: sifive_u

3.2 CPU 类型(-cpu)

-cpu 指定模拟的 CPU 核心微架构。QEMU 支持通过 -cpu help 列出所有可用 CPU 模型。对于 ARM 平台,常用 cortex-a57、cortex-a72、max(支持所有特性);对于 x86,常用 host(KVM 加速时直通主机 CPU 特性)或 qemu64(基础兼容模型)。

# 查看支持的 CPU 模型
qemu-system-aarch64 -cpu help

# 使用 max CPU 启用所有特性
qemu-system-aarch64 -M virt -cpu max ...
调试建议: 内核崩溃时,尝试将 -cpu max 改为具体型号(如 cortex-a57),排除 CPU 特性不兼容问题。

3.3 SMP 与内存(-smp, -m)

-smp 设置模拟的 CPU 核心数与拓扑结构;-m 设置物理内存大小。这两个参数直接影响内核调度器、内存管理单元(MMU)的初始化行为。

参数 语法示例 说明
-smp -smp 4 4 个 CPU 核心,默认单 socket
-smp -smp 4,sockets=2,cores=2 2 个 socket,每个 2 核心
-m -m 2G 2 GiB 物理内存
-m -m 512M 512 MiB 物理内存
# 4 核 2G 内存典型配置
qemu-system-aarch64 -M virt -cpu max -smp 4 -m 2G ...
-smp 与 -m:虚拟硬件资源分配 CPU 拓扑 (-smp 4) Core 0 Core 1 Core 2 Core 3 物理内存 (-m 2G) 2 GiB RAM 共享

3.4 内核与初始 RAM 磁盘(-kernel, -initrd)

-kernel 指定内核镜像文件路径(通常为 vmlinuz 或 Image);-initrd 指定初始 RAM 磁盘(initramfs/initrd)文件。这两个参数配合使用,实现“直接内核启动”模式,无需 BIOS 或 bootloader。

# 典型直接内核启动命令
qemu-system-aarch64 -M virt -cpu max -smp 2 -m 1G \
  -kernel arch/arm64/boot/Image \
  -initrd rootfs.cpio.gz \
  -append "console=ttyAMA0 root=/dev/ram0"
常见错误: 忘记传递 -append 内核命令行参数,导致内核无法找到根文件系统。ARM64 平台控制台参数通常为 console=ttyAMA0,x86 为 console=ttyS0。

3.5 磁盘镜像(-hda)

-hda 将文件作为第一块 IDE 或 virtio 磁盘挂载到虚拟机。QEMU 支持 -hda、-hdb、-hdc、-hdd 四个传统 IDE 磁盘槽位。现代用法更推荐 -drive file=...,format=raw,if=virtio 以获得更好性能。

参数 等价现代写法 说明
-hda disk.img -drive file=disk.img,format=raw,if=ide IDE 接口第一磁盘
-hdb disk2.img -drive file=disk2.img,format=raw,if=ide IDE 接口第二磁盘
— -drive file=disk.img,format=qcow2,if=virtio virtio 接口(推荐)
# 使用 -hda 挂载根文件系统磁盘
qemu-system-aarch64 -M virt -cpu max -smp 2 -m 1G \
  -kernel arch/arm64/boot/Image \
  -hda rootfs.ext4 \
  -append "console=ttyAMA0 root=/dev/vda"

3.6 无图形界面模式(-nographic)

-nographic 禁用 QEMU 图形窗口,将串口重定向到当前终端。这是服务器环境、CI/CD 流水线、SSH 远程调试的首选模式。配合 -append "console=ttyAMA0" 即可在终端直接与内核交互。

# 完整无图形启动示例
qemu-system-aarch64 -M virt -cpu max -smp 2 -m 1G \
  -kernel arch/arm64/boot/Image \
  -initrd rootfs.cpio.gz \
  -append "console=ttyAMA0" \
  -nographic
退出技巧: 在 -nographic 模式下,按 Ctrl+A 然后按 X 可退出 QEMU;按 Ctrl+A 然后按 C 可切换到 QEMU monitor 控制台。

3.7 参数组合实战

以下是一个完整的 QEMU 命令行,用于启动 ARM64 内核并挂载 ext4 根文件系统镜像:

qemu-system-aarch64 \
  -M virt \
  -cpu max \
  -smp 4 \
  -m 2G \
  -kernel Image \
  -initrd initramfs.cpio.gz \
  -hda rootfs.ext4 \
  -append "console=ttyAMA0 root=/dev/vda rw" \
  -nographic
QEMU 命令行参数全景图 qemu-system-aarch64 -M virt -cpu max -smp 4 -m 2G -nographic -kernel Image -initrd initramfs.cpio.gz -hda rootfs.ext4 -append "console=ttyAMA0 root=/dev/vda rw"

3.8 参数调试速查表

参数 常用值 调试作用
-M virt, pc, q35 切换平台排查外设兼容性
-cpu max, host, cortex-a57 降级 CPU 模型定位特性缺失
-smp 1, 2, 4 单核启动排除并发问题
-m 512M, 1G, 2G 增大内存避免 OOM
-kernel 内核镜像路径 确认内核镜像格式正确
-initrd initramfs 路径 验证 initramfs 是否包含驱动
-hda 磁盘镜像路径 检查磁盘分区表与文件系统
-nographic 无参数 确认串口输出是否正常
核心原则: 每次只修改一个参数,观察内核启动日志变化。使用 -d in_asm,int 可输出指令级跟踪,配合参数调整定位根因。