简介
备注
QEMU 支持多种目标 CPU 架构,以及各架构的多种机器。某种架构或机器适用的 选项、属性和命令行,未必适用于其他模型。本手册示例都针对所展示的架构 和机器类型。有疑问时,请查阅具体目标的文档。
虚拟化加速器
系统模拟提供机器的虚拟模型,包括 CPU、内存和设备,用于运行客户机操作系统。 它支持多种称为“加速器”的虚拟机监控程序,以及能模拟多种 CPU 的 JIT, 即 Tiny Code Generator(TCG)。
加速器 |
主机操作系统 |
主机架构 |
|---|---|---|
KVM |
Linux |
Arm、MIPS、PPC、RISC-V、s390x、x86 |
Xen |
Linux(作为 dom0) |
Arm、x86 |
MSHV |
Linux(作为 dom0) |
x86 |
Hypervisor Framework(hvf) |
MacOS |
x86、Arm |
Windows Hypervisor Platform(whpx) |
Windows |
Arm、x86 |
NetBSD Virtual Machine Monitor(nvmm) |
NetBSD |
x86 |
Tiny Code Generator(tcg) |
Linux、其他 POSIX 系统、Windows、MacOS |
Arm、x86、Loongarch64、MIPS、PPC、s390x、Sparc64 |
功能概览
系统模拟提供丰富设备模型,包括专为高效虚拟化设计的 VirtIO 设备。部分设备 可通过 vhost-user(VirtIO)或 多进程 QEMU 卸载到主进程之外。 平台支持时也可直通设备,消除模拟开销。详见 设备模拟。
功能完整的 块层 可构造复杂、多层堆叠的存储 拓扑,支持重定向、网络、快照和迁移。
灵活的 chardev 系统支持通过标准输入输出、文件、Unix 套接字和 TCP 处理 字符设备 I/O。
管理接口包括按行交互的 HMP,支持动态增删设备和检查 系统状态;QMP 则是定义明确、版本化、面向程序的 API, 供其他工具创建、控制和管理虚拟机。基于 libvirt 的 Virt Manager 等高级工具使用此接口。
常见加速器支持通过 gdbstub 连接 GDB,调试系统软件镜像。
运行
QEMU API 丰富且复杂,可能不易掌握。有些架构只给磁盘镜像就能启动,但这些 示例依赖大量默认值,未必适合现代系统。
非 x86 架构支持多种机器,命令行通常更明确地定义机器和启动行为。 QEMU 系统模拟目标 中常有示例。
项目并不反对直接用命令行启动,但也有许多项目提供更友好的体验。基于 libvirt 的工具可以探测功能,创建适合现有硬件的现代虚拟机。
QEMU 命令行的一般形式为:
$ qemu-system-x86_64 [machine opts] \
[cpu opts] \
[accelerator opts] \
[device opts] \
[backend opts] \
[interface opts] \
[boot opts]
多数选项支持帮助,例如:
$ qemu-system-x86_64 -M help
列出当前 QEMU 二进制支持的机器。help 也可作为其他选项参数,例如:
$ qemu-system-x86_64 -device scsi-hd,help
列出控制 scsi-hd 行为的额外参数及其默认值。
选项 |
|
|---|---|
机器 |
定义机器类型、内存大小等。 |
CPU |
定义 vCPU 类型、数量和拓扑。多数加速器提供 host 选项,直接传递主机 CPU 配置,不过滤功能。 |
加速器 |
取决于所用监控程序。默认 TCG 是纯模拟,要利用硬件虚拟化必须指定加速器。 |
设备 |
机器类型未默认提供的额外设备。 |
后端 |
QEMU 如何处理客户机数据,例如块设备如何存储、网卡如何连接网络、 串口如何连接外部。 |
接口 |
如何显示、管理、控制或调试系统。 |
启动 |
通过固件还是直接加载内核启动。 |
下面先定义用于 AArch64 客户机的通用 virt 平台,启用虚拟化,以便在模拟的 客户机中使用 KVM。为内置 pflash 命名,以便稍后覆盖默认配置。
$ qemu-system-aarch64 \
-machine type=virt,virtualization=on,pflash0=rom,pflash1=efivars \
-m 4096 \
接着用 max 选择 QEMU 能模拟的全部 Arm 功能,定义 4 个 vCPU,并显式指定 本来就是默认值的 TCG。
-cpu max \
-smp 4 \
-accel tcg \
virt 没有默认网络和存储设备,需要自行添加,并用 ID 为随后连接后端做准备。
-device virtio-net-pci,netdev=unet \
-device virtio-scsi-pci \
-device scsi-hd,drive=hd \
为网卡连接用户模式网络。外部无法直接访问该网络,因此把本机 2222 端口 转发到客户机 SSH 端口。
-netdev user,id=unet,hostfwd=tcp::2222-:22 \
将客户机块设备连接到预留的 LVM 分区。
-blockdev driver=raw,node-name=hd,file.driver=host_device,file.filename=/dev/lvm-disk/debian-bullseye-arm64 \
将 QEMU 监视器 与串口输出复用,通过 字符后端多路复用器按键 切换。没有默认图形设备, 且可完全在终端工作,因此禁用显示。
-serial mon:stdio \
-display none \
最后覆盖默认固件,提供持久保存 EFI 配置的存储。固件负责找到磁盘、启动 grub, 最终运行系统。
-blockdev node-name=rom,driver=file,filename=(pwd)/pc-bios/edk2-aarch64-code.fd,read-only=true \
-blockdev node-name=efivars,driver=file,filename=$HOME/images/qemu-arm64-efivars