老赵写字的地方

QEMU — 开源机器模拟器与虚拟化器

QEMU(Quick Emulator)是一个免费开源的项目,最初由 Fabrice Bellard 在 2003 年发布1), 官方定位是“一个通用的开源机器模拟器和虚拟化器”2). 它既可以做纯软件模拟,也可以配合硬件加速方案实现接近原生的性能。

QEMU 的组件采用 GNU General Public License (GPL)、BSD license、GNU Lesser General Public License (LGPL) 等多种许可证发布3), 项目目前由社区和 Software Freedom Conservancy 共同维护。

两种运行模式

QEMU 提供两种截然不同的运行模式,适用于不同场景4).

用户态模拟(User-mode emulation)

在用户态模式下,QEMU 直接运行针对不同指令集架构编译的单个 Linux 或 Darwin/macOS 程序。系统调用会被自动转换(thunked),处理字节序(endianness)和 32/64 位不匹配问题。这个模式主要用于快速交叉编译和交叉调试。

系统模拟(System emulation)

系统模拟模式模拟一台完整的计算机,包括 CPU、内存、主板芯片组、磁盘控制器、网卡、显卡、声卡等所有外设。它可以引导各种客户操作系统,包括 Linux、Windows、BSD、Solaris 乃至 DOS。支持的指令集架构涵盖:x86/x86-64、ARMv7/ARMv8 (AArch64)、MIPS、PowerPC、RISC-V、SPARC、MicroBlaze、OpenRISC 等5).

硬件加速方案

QEMU 的加速架构是其灵活性的核心。它通过插件式的加速器(accelerator)接口支持多种后端,让同一套设备模型在不同平台上获得最佳性能6).

TCG — Tiny Code Generator

从 0.10.0 版本起,QEMU 使用 TCG 替换了原有的 DynGen 系统7). TCG 是一个即时编译(JIT)二进制翻译器,工作原理:

1. 将目标 CPU 的基本块(basic block)翻译为与机器无关的中间表示(TCG ops)
2. 经过简单的优化通道
3. 后端将 TCG ops 翻译为主机架构的机器码

如果某个架构没有专属的 JIT 后端,TCG 会回退到解释器模式(TCI - TCG Interpreter),性能会显著下降。TCG 使得 QEMU 可以在任何主机上模拟任何支持的架构,即使主机 CPU 没有硬件虚拟化扩展。

KVM — Kernel-based Virtual Machine

KVM 是 Linux 内核模块,它利用 CPU 的硬件虚拟化扩展(Intel VT-x 或 AMD-V)将客户机代码直接运行在物理 CPU 上,QEMU 只需模拟设备层8). KVM 是目前 Linux 上最主流的 QEMU 加速方案,也支持 ARM 和 MIPS 等架构。

其他加速器

  • hvf — Apple 的 Hypervisor.framework,基于 Intel VT,用于 macOS9)
  • whpx — Microsoft 的 Windows Hypervisor Platform,基于 Intel VT 或 AMD-V,用于 Windows10)
  • HAXM — Intel 的 Hardware Accelerated Execution Manager,曾广泛用于 Android 模拟器11)

当不指定加速器时,QEMU 默认使用 TCG 纯软件模拟。

主要特性

QCOW2 磁盘镜像格式

QEMU 的磁盘镜像支持多种格式,其中 QCOW2(QEMU Copy-On-Write version 2)是原生的、功能最丰富的格式12).

  • 稀疏文件 — 只占用实际使用的空间。配置 120GB 磁盘可能只占用几百 MB 宿主存储
  • 快照 — 可以保存虚拟机在某个时间点的状态并随时回滚
  • Overlay 镜像 — 基于一个不变的“基础镜像”(base image)创建叠加层,只记录变更部分。如果客户系统被损坏,直接删除 overlay 就可以回到初始状态
  • 压缩和加密 — QCOW2 支持 zlib 压缩和 AES 加密

QEMU 也兼容其他格式:Raw (.img)、VirtualBox (.vdi)、VMware (.vmdk)、Hyper-V (.vhd/.vhdx),以及只读格式如 Bochs、DMG、Parallels 等13).

网络配置

QEMU 提供灵活的虚拟网络方案14):

  • 用户模式网络(User-mode,默认) — 通过 NAT 共享宿主网络连接,无需管理员权限
  • TAP/TUN 桥接 — 将虚拟机直接桥接到宿主物理网络,虚拟机获得独立的局域网 IP
  • 多虚拟机互联 — 多个 QEMU 实例可以通过虚拟网卡互连

QEMU 模拟多种网卡型号,包括 Realtek 8139C+、E1000(Intel 千兆)、E1000E(PCIe 千兆)、VirtIO 半虚拟化网卡等15).

VNC 与无头模式

QEMU 内置 VNC 服务器,允许远程访问虚拟机图形界面。它也可以完全在无图形界面下运行,仅通过串口或 VirtIO 控制台与客户系统交互16)——这对服务器场景和自动化部署非常有用。

多 CPU 与 SMP

QEMU 支持模拟多路 CPU 和对称多处理(SMP)17). 对于支持并行模拟的架构(ARM、x86、PowerPC、RISC-V、s390x 等),QEMU 可以为每个 vCPU 创建独立的宿主线程,充分利用多核处理器。

半虚拟化 VirtIO

VirtIO 是 QEMU/KVM 生态中的半虚拟化设备接口标准18). 客户机安装专用的 VirtIO 驱动后,可以获得比模拟传统硬件(如 IDE 磁盘、RTL8139 网卡)更低的延迟和更高的吞吐量。

VirtIO 设备包括:块设备(virtio-blk)、网络设备(virtio-net)、SCSI 控制器(virtio-scsi)、GPU(virtio-gpu)、文件系统(virtio-9p)等。

典型使用场景

开发与测试

QEMU 是内核开发和嵌入式开发的利器。开发者可以在单一主机上启动多个不同架构的虚拟机进行测试,无需采购实体硬件。Linux 内核的 CI 测试广泛使用 QEMU。

云基础设施

OpenStack、Proxmox VE 等云管理平台均以 QEMU/KVM 为核心虚拟化引擎。

跨架构应用运行

通过用户态模拟,可以在 x86 机器上直接运行 ARM 或 RISC-V 的 Linux 二进制文件。这对嵌入式开发、交叉编译调试、以及在新架构上测试软件兼容性非常实用。

桌面虚拟化

GNOME Boxes 和 Virtual Machine Manager (virt-manager) 等图形化工具基于 QEMU/KVM 提供简洁的桌面虚拟化体验。

QEMU 与同类方案

与 VirtualBox

VirtualBox(2007 年发布)早期借用了 QEMU 的虚拟硬件设备和动态重编译器19). 两者都支持 x86 虚拟化,但 VirtualBox 更关注桌面用户的易用性,提供完整的 GUI 和 USB 透传等便利功能;QEMU 则更底层和可脚本化,是云基础设施的基石。

与 VMware

VMware 提供企业级虚拟化方案,管理功能丰富但闭源且授权费用高昂。QEMU/KVM 在性能上已不逊于 VMware,且完全开源免费。

总结

QEMU 是一个兼具模拟器和虚拟化器双重身份的项目。作为模拟器,它能通过 TCG 在任意架构上模拟任意架构;作为虚拟化器,它能通过 KVM 等加速器提供接近原生的性能。从桌面开发到百万台服务器的云数据中心,QEMU 都是不可或缺的基础设施组件。

zh/qemu/qemu.txt · 最后更改: 由 dsbot