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
2
3
4
5
6
7
8
9
# 查看 CPU 是否支持虚拟化(返回数字 > 0 表示支持)
egrep -c '(vmx|svm)' /proc/cpuinfo

# 检查 KVM 内核模块是否已加载
lsmod | grep kvm

# 如果没有加载,可以手动加载(Intel 用 kvm-intel,AMD 用 kvm-amd)
sudo modprobe kvm-intel # Intel CPU
# sudo modprobe kvm-amd # AMD CPU

安装必要的软件包:

1
2
sudo apt update
sudo apt install qemu-kvm qemu-utils

2. 创建虚拟磁盘

使用 qemu-img 创建一个 20GB 的 qcow2 格式虚拟磁盘,该格式支持动态增长,能有效节省宿主机空间。

1
qemu-img create -f qcow2 ubuntu-test.qcow2 20G

同时准备好 Ubuntu Server 的 ISO 镜像文件(假设已下载至当前目录,命名为 ubuntu.iso)。

3. 启动虚拟机并安装操作系统

下面这个命令会用 KVM 加速启动虚拟机,并挂载 ISO 作为光驱开始安装:

1
2
3
4
5
6
7
8
9
10
11
qemu-system-x86_64 \
-enable-kvm \
-m 2048 \
-cpu host \
-smp 2 \
-drive file=ubuntu-test.qcow2,format=qcow2 \
-cdrom ubuntu.iso \
-boot order=d \
-netdev user,id=net0 \
-device virtio-net,netdev=net0 \
-vga virtio

关键参数说明:

  • -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
2
3
4
5
6
7
8
qemu-system-x86_64 \
-enable-kvm \
-m 2048 \
-cpu host \
-smp 2 \
-drive file=ubuntu-test.qcow2,format=qcow2 \
-netdev user,id=net0 \
-device virtio-net,netdev=net0

提示:为了方便,你可以将这个命令保存为一个脚本,或者使用 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
2
3
4
5
qemu-system-x86_64 \
-m 2048 \
-drive file=ubuntu-test.qcow2,format=qcow2 \
-cdrom ubuntu.iso \
-boot order=d

你会发现系统启动极其缓慢,图形界面的操作一卡一卡,鼠标都能拖出残影。这就是纯软件模拟的真实表现——所有 x86 指令都在用户态逐条翻译,没有任何硬件加速。

纯 QEMU 模式虽然在性能上极其不堪,但在某些特定场合依然有价值,比如:

  • 在 x86 主机上调试 ARM 架构的内核;
  • 为嵌入式开发模拟不同的硬件平台;
  • 运行特殊的无硬件虚拟化支持的环境(例如嵌套虚拟化中的部分场景)。

结语

QEMU 和 KVM 的分工非常明确:一个负责设备模拟和虚拟机管理,另一个负责将 CPU 和内存的执行交给硬件加速。理解了这层关系,你在阅读各种虚拟化文档或排查性能问题时,思路就会清晰许多。

日常使用中,我们建议:

  • 始终带上 -enable-kvm,否则你为虚拟机分配再多的资源也是白搭。
  • 如果嫌命令行参数繁琐,可以选择 virt-managerlibvirt 生态工具(如 virsh),它们底层依然使用 QEMU + KVM,但配置和管理更加人性化。
  • 对于生产环境,还可以进一步使用桥接网络、virtio 驱动、巨页内存等优化技术,让虚拟机的性能更上一层楼。

希望这篇指南能帮你理顺概念,顺利跑通第一个 KVM 虚拟机。如果有更多高级需求(如 PCI 直通、NUMA 绑定),那就是另一个有意思的话题了。