QEMU 与 KVM:黄金搭档的前世今生及快速上手指南
QEMU 与 KVM:黄金搭档的前世今生及快速上手指南
在 Linux 虚拟化领域,QEMU 和 KVM 是两个经常被一起提及的名字。很多人习惯说“用 KVM 跑了个虚拟机”,但实际上,这个操作背后往往是 QEMU 和 KVM 的联合工作。二者究竟是不是一个东西?如果不是,它们之间又是怎样配合的?本文不仅会把概念讲清楚,还会手把手带你完成一个可用的 KVM 加速虚拟机实例,让理论落到实践。
一、它们不是一个东西
简单粗暴的结论:QEMU 和 KVM 是完全不同的两个项目,但它们可以完美结合,成为一套高性能虚拟化方案。
QEMU:全能的“模拟大师”
QEMU(Quick EMUlator)本身是一个通用的机器模拟器。即便没有任何硬件辅助,它也能通过纯软件的方式模拟出一整台计算机——包括 CPU、内存、硬盘、网卡、显卡等,甚至能够在 x86 的机器上模拟出 ARM 或 RISC-V 的平台。这种纯软件模拟的代价是性能很低,因为每一条目标机指令都要经过软件“翻译”才能在宿主机上执行,通常只用于操作系统内核调试、交叉编译等场景,不适合生产环境。
KVM:专职的“加速引擎”
KVM(Kernel-based Virtual Machine)是集成在 Linux 内核中的一个模块,它的职责非常单一:把 CPU 的硬件虚拟化扩展(Intel VT-x / AMD-V)直接暴露给用户态程序使用。KVM 自身只能加速 CPU 和内存的虚拟化,不具备任何外部设备的模拟能力,连个 BIOS 都没有。它必须搭配一个用户态程序才能组成完整的虚拟机。
QEMU + KVM:最佳拍档
当这两者结合时,QEMU 依然负责模拟各种外设(网卡、磁盘、显卡、USB)、提供固件(SeaBIOS/OVMF)以及管理控制台,但在执行虚拟机 CPU 指令时,它不再用自己的慢速软件翻译,而是通过 /dev/kvm 接口将指令交给 KVM,由硬件直接加速执行。最终的效果是:CPU 和内存的访问速度几乎与物理机持平,而 I/O 设备又保持了 QEMU 配置灵活的优势。市面上绝大多数基于 KVM 的虚拟化管理平台(如 virt-manager、Proxmox、oVirt 等),底层都是 QEMU + KVM 的组合。
可以用一个汽车比喻来理解:
- QEMU 像一台汽车,自带的“小排量发动机”(软件模拟)什么路都能跑,但跑不快。
- KVM 是一台强劲的赛车引擎,但没车架、没轮子,自己动不了。
- QEMU + KVM 就是将赛车引擎装进 QEMU 的底盘,既快又舒适。
| QEMU | KVM | |
|---|---|---|
| 是什么 | 通用模拟器/虚拟器软件 | Linux 内核模块 |
| 独立能力 | 可纯软件模拟完整计算机 | 仅提供 CPU/内存硬件加速接口,无设备模拟 |
| 性能 | 纯软件模拟非常慢 | 直接调用 CPU 硬件特性,极快 |
| 典型用途 | 交叉架构模拟、设备模拟;配合 KVM 负责 I/O | 配合 QEMU 作为 KVM 虚拟化的加速核心 |
二、动手:搭建第一个 KVM 加速的虚拟机
下面以 Ubuntu/Debian 系统为例,演示从零开始用 QEMU + KVM 创建一个 Ubuntu Server 虚拟机。请确保你的 CPU 支持虚拟化(绝大多数现代的 Intel 和 AMD 处理器都支持)。
1. 检查环境
先在终端里确认 KVM 是否可用:
1 | # 查看 CPU 是否支持虚拟化(返回数字 > 0 表示支持) |
安装必要的软件包:
1 | sudo apt update |
2. 创建虚拟磁盘
使用 qemu-img 创建一个 20GB 的 qcow2 格式虚拟磁盘,该格式支持动态增长,能有效节省宿主机空间。
1 | qemu-img create -f qcow2 ubuntu-test.qcow2 20G |
同时准备好 Ubuntu Server 的 ISO 镜像文件(假设已下载至当前目录,命名为 ubuntu.iso)。
3. 启动虚拟机并安装操作系统
下面这个命令会用 KVM 加速启动虚拟机,并挂载 ISO 作为光驱开始安装:
1 | qemu-system-x86_64 \ |
关键参数说明:
-enable-kvm:启用 KVM 加速的核心开关。 没有它,整个虚拟机将退化为纯软件模拟,慢到无法忍受。-cpu host:让虚拟机直接使用宿主机 CPU 的特性,减少兼容损耗,性能最佳。-smp 2:分配 2 个虚拟 CPU 核心。-m 2048:分配 2GB 内存。-drive file=...:指定刚才创建的虚拟磁盘。-cdrom ... -boot order=d:从光驱启动以便安装系统。-netdev user:使用用户模式网络(NAT),虚拟机可上网,无需复杂网络配置。-vga virtio:使用 virtio 图形输出,性能较好;如果不需要图形,可以换成-nographic。
执行命令后,QEMU 会弹出一个图形窗口(或 VNC 窗口),按照普通的 Ubuntu 安装流程走完即可。安装结束后,虚拟机会提示重启,在重启前切换到 QEMU 监视器(Ctrl+Alt+2),输入 system_powerdown 关机,或者直接关闭窗口。
4. 启动已安装好的系统
以后日常启动虚拟机时,去掉 -cdrom 和 -boot order=d,直接使用:
1 | qemu-system-x86_64 \ |
提示:为了方便,你可以将这个命令保存为一个脚本,或者使用
virt-manager图形化工具来管理,底层同样是 QEMU + KVM。
5. 如何确认 KVM 加速已生效?
启动虚拟机后,在 QEMU 窗口按下 Ctrl+Alt+2 进入 QEMU 监视器(Monitor),输入:
1 | info kvm |
如果看到 kvm support: enabled,就说明 KVM 加速正在工作。按 Ctrl+Alt+1 可以切回虚拟机画面。
三、纯 QEMU 软件模拟(仅供对比)
为了加深理解,我们来看一下如果不加 -enable-kvm 会发生什么:
1 | qemu-system-x86_64 \ |
你会发现系统启动极其缓慢,图形界面的操作一卡一卡,鼠标都能拖出残影。这就是纯软件模拟的真实表现——所有 x86 指令都在用户态逐条翻译,没有任何硬件加速。
纯 QEMU 模式虽然在性能上极其不堪,但在某些特定场合依然有价值,比如:
- 在 x86 主机上调试 ARM 架构的内核;
- 为嵌入式开发模拟不同的硬件平台;
- 运行特殊的无硬件虚拟化支持的环境(例如嵌套虚拟化中的部分场景)。
结语
QEMU 和 KVM 的分工非常明确:一个负责设备模拟和虚拟机管理,另一个负责将 CPU 和内存的执行交给硬件加速。理解了这层关系,你在阅读各种虚拟化文档或排查性能问题时,思路就会清晰许多。
日常使用中,我们建议:
- 始终带上
-enable-kvm,否则你为虚拟机分配再多的资源也是白搭。 - 如果嫌命令行参数繁琐,可以选择
virt-manager或libvirt生态工具(如virsh),它们底层依然使用 QEMU + KVM,但配置和管理更加人性化。 - 对于生产环境,还可以进一步使用桥接网络、virtio 驱动、巨页内存等优化技术,让虚拟机的性能更上一层楼。
希望这篇指南能帮你理顺概念,顺利跑通第一个 KVM 虚拟机。如果有更多高级需求(如 PCI 直通、NUMA 绑定),那就是另一个有意思的话题了。


