====== QEMU — 开源机器模拟器与虚拟化器 ====== **QEMU**(Quick Emulator)是一个免费开源的项目,最初由 Fabrice Bellard 在 2003 年发布(([[https://en.wikipedia.org/wiki/Fabrice_Bellard|Fabrice Bellard - Wikipedia]])), 官方定位是"一个通用的开源机器模拟器和虚拟化器"(([[https://www.qemu.org/|QEMU Official Website]])). 它既可以做纯软件模拟,也可以配合硬件加速方案实现接近原生的性能。 QEMU 的组件采用 GNU General Public License (GPL)、BSD license、GNU Lesser General Public License (LGPL) 等多种许可证发布(([[https://en.wikipedia.org/wiki/QEMU#Licensing|QEMU Licensing - Wikipedia]])), 项目目前由社区和 Software Freedom Conservancy 共同维护。 ===== 两种运行模式 ===== QEMU 提供两种截然不同的运行模式,适用于不同场景(([[https://en.wikipedia.org/wiki/QEMU#Operating_modes|QEMU Operating Modes - Wikipedia]])). ===== 用户态模拟(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 等(([[https://en.wikipedia.org/wiki/QEMU#System_emulation|QEMU System Emulation - Wikipedia]])). ===== 硬件加速方案 ===== QEMU 的加速架构是其灵活性的核心。它通过插件式的加速器(accelerator)接口支持多种后端,让同一套设备模型在不同平台上获得最佳性能(([[https://www.qemu.org/docs/master/system/introduction.html|QEMU System Emulation]])). ===== TCG — Tiny Code Generator ===== 从 0.10.0 版本起,QEMU 使用 TCG 替换了原有的 DynGen 系统(([[https://www.qemu.org/docs/master/devel/index-tcg.html|TCG - QEMU Developer Documentation]])). 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 只需模拟设备层(([[https://www.qemu.org/docs/master/system/introduction.html#virtualisation-accelerators|KVM - QEMU Documentation]])). KVM 是目前 Linux 上最主流的 QEMU 加速方案,也支持 ARM 和 MIPS 等架构。 ===== 其他加速器 ===== * **hvf** — Apple 的 Hypervisor.framework,基于 Intel VT,用于 macOS(([[https://www.qemu.org/docs/master/system/introduction.html#virtualisation-accelerators|HVF - QEMU Documentation]])) * **whpx** — Microsoft 的 Windows Hypervisor Platform,基于 Intel VT 或 AMD-V,用于 Windows(([[https://www.qemu.org/docs/master/system/whpx.html|WHPX - QEMU Documentation]])) * **HAXM** — Intel 的 Hardware Accelerated Execution Manager,曾广泛用于 Android 模拟器(([[https://en.wikipedia.org/wiki/Intel_Hardware_Accelerated_Execution_Manager|Intel HAXM - Wikipedia]])) 当不指定加速器时,QEMU 默认使用 TCG 纯软件模拟。 ===== 主要特性 ===== ===== QCOW2 磁盘镜像格式 ===== QEMU 的磁盘镜像支持多种格式,其中 **QCOW2**(QEMU Copy-On-Write version 2)是原生的、功能最丰富的格式(([[https://www.qemu.org/docs/master/system/images.html|QEMU Disk Images - Documentation]])). * **稀疏文件** — 只占用实际使用的空间。配置 120GB 磁盘可能只占用几百 MB 宿主存储 * **快照** — 可以保存虚拟机在某个时间点的状态并随时回滚 * **Overlay 镜像** — 基于一个不变的"基础镜像"(base image)创建叠加层,只记录变更部分。如果客户系统被损坏,直接删除 overlay 就可以回到初始状态 * **压缩和加密** — QCOW2 支持 zlib 压缩和 AES 加密 QEMU 也兼容其他格式:Raw (.img)、VirtualBox (.vdi)、VMware (.vmdk)、Hyper-V (.vhd/.vhdx),以及只读格式如 Bochs、DMG、Parallels 等(([[https://en.wikipedia.org/wiki/QEMU#Supported_disk_image_formats|QEMU Supported Disk Image Formats - Wikipedia]])). ===== 网络配置 ===== QEMU 提供灵活的虚拟网络方案(([[https://www.qemu.org/docs/master/system/devices/net.html|QEMU Network Emulation - Documentation]])): * **用户模式网络(User-mode,默认)** — 通过 NAT 共享宿主网络连接,无需管理员权限 * **TAP/TUN 桥接** — 将虚拟机直接桥接到宿主物理网络,虚拟机获得独立的局域网 IP * **多虚拟机互联** — 多个 QEMU 实例可以通过虚拟网卡互连 QEMU 模拟多种网卡型号,包括 Realtek 8139C+、E1000(Intel 千兆)、E1000E(PCIe 千兆)、VirtIO 半虚拟化网卡等(([[https://en.wikipedia.org/wiki/QEMU#x86|QEMU Emulated x86 Hardware - Wikipedia]])). ===== VNC 与无头模式 ===== QEMU 内置 VNC 服务器,允许远程访问虚拟机图形界面。它也可以完全在**无图形界面**下运行,仅通过串口或 VirtIO 控制台与客户系统交互(([[https://www.qemu.org/docs/master/system/mux-chardev.html|QEMU Mux Chardev - Documentation]]))——这对服务器场景和自动化部署非常有用。 ===== 多 CPU 与 SMP ===== QEMU 支持模拟多路 CPU 和对称多处理(SMP)(([[https://en.wikipedia.org/wiki/QEMU#Parallel_emulation|QEMU Parallel Emulation - Wikipedia]])). 对于支持并行模拟的架构(ARM、x86、PowerPC、RISC-V、s390x 等),QEMU 可以为每个 vCPU 创建独立的宿主线程,充分利用多核处理器。 ===== 半虚拟化 VirtIO ===== VirtIO 是 QEMU/KVM 生态中的**半虚拟化设备接口**标准(([[https://www.qemu.org/docs/master/glossary.html#virtio|VirtIO - QEMU Glossary]])). 客户机安装专用的 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 的虚拟硬件设备和动态重编译器(([[https://en.wikipedia.org/wiki/QEMU#VirtualBox|QEMU and VirtualBox - Wikipedia]])). 两者都支持 x86 虚拟化,但 VirtualBox 更关注**桌面用户**的易用性,提供完整的 GUI 和 USB 透传等便利功能;QEMU 则更**底层和可脚本化**,是云基础设施的基石。 ==== 与 VMware ==== VMware 提供企业级虚拟化方案,管理功能丰富但闭源且授权费用高昂。QEMU/KVM 在性能上已不逊于 VMware,且完全开源免费。 ==== 总结 ==== QEMU 是一个兼具**模拟器**和**虚拟化器**双重身份的项目。作为模拟器,它能通过 TCG 在任意架构上模拟任意架构;作为虚拟化器,它能通过 KVM 等加速器提供接近原生的性能。从桌面开发到百万台服务器的云数据中心,QEMU 都是不可或缺的基础设施组件。 {{tag>qemu 虚拟化 开源}}