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