1. 课程导入

在数据中心、云计算平台和桌面云场景中,KVM(Kernel-based Virtual Machine)已经成为 Linux 环境下最主流的开源虚拟化方案之一。它把 Linux 内核本身变成一个 Hypervisor,通过 /dev/kvm 字符设备向上层管理工具暴露硬件虚拟化能力,再由 QEMU 完成设备模拟与虚拟机生命周期管理。本课程关注的不是"如何装一台虚拟机"这么简单,而是围绕设备虚拟化与系统集成两条主线,讲清楚虚拟机里的网卡、磁盘、显卡、USB、中断控制器等设备究竟从哪里来、性能如何、怎样与宿主机和上层平台协同工作。

学习本课程后,你应当能够:独立规划一台 KVM 宿主机的虚拟化能力;为虚拟机选择并配置 virtio、VFIO 直通、SR-IOV 等不同层次的设备模型;使用 libvirt/QEMU 完成虚拟机的定义、启动、迁移与排障;并把 KVM 与存储、网络、监控、编排系统集成为一个可运维的虚拟化平台。

一、核心概念:从内核到设备的四层视角

理解 KVM 设备虚拟化,建议先建立"四层视角":最底层是 CPU 硬件虚拟化扩展(Intel VT-x、AMD-V)与 IOMMU;第二层是 Linux 内核中的 KVM 模块,负责 vCPU 调度与内存虚拟化;第三层是 QEMU 进程,负责设备模拟、I/O 路径和虚拟机形态;第四层是 libvirt、OpenStack、oVirt 等管理集成层。设备虚拟化的本质,就是决定"某个设备由哪一层来提供、以什么方式暴露给 Guest"。

围绕这个视角,有几个必须掌握的核心概念:

  • vCPU 与 vmentry/vmexit:Guest 执行敏感指令时陷入 KVM,由内核决定是模拟还是透传,这是虚拟化开销的主要来源。
  • 全虚拟化与半虚拟化:e1000、IDE 等属于全模拟设备,兼容性好但性能低;virtio 属于半虚拟化,Guest 需装驱动,但 I/O 路径短、性能高。
  • 设备直通(Passthrough):借助 VFIO 与 IOMMU,把物理 PCI 设备直接分配给虚拟机,接近原生性能。
  • SR-IOV:一块物理网卡虚拟出多个 VF,每个 VF 可独立直通给不同虚拟机,兼顾性能与密度。
  • 系统集成:把上述能力通过 libvirt XML、存储池、虚拟网络、监控指标统一编排,形成可交付的平台。

二、整体框架:一张图看清课程主线

下图给出本课程的整体知识框架:左侧是硬件与内核基础,中间是设备虚拟化的三条主要路径,右侧是系统集成与运维出口。后续章节将沿着这张图逐层展开。

KVM 设备虚拟化与系统集成 · 整体框架 硬件与内核基础 CPU 虚拟化扩展 VT-x / AMD-V IOMMU / VT-d DMA 重映射 KVM 内核模块 /dev/kvm QEMU 进程 设备模拟与生命周期 libvirt 管理接口 XML / API 设备虚拟化三条路径 ① 全模拟设备 e1000 / IDE / VGA · 兼容优先 无需 Guest 驱动,性能较低 ② virtio 半虚拟化 virtio-net / virtio-blk / virtio-gpu 共享环 + 通知机制,性能高 ③ 直通与 SR-IOV VFIO + IOMMU · 物理设备直通 VF 独立分配,接近原生性能 系统集成与运维出口 存储集成 本地 / NFS / Ceph / iSCSI 网络集成 bridge / OVS / VLAN / VXLAN 编排与迁移 OpenStack / oVirt / 热迁移 监控与排障 virsh / perf / trace / 日志 安全与隔离 SELinux / cgroup / sVirt 基础支撑 → 设备模型选择 → 平台集成,构成课程主线

三、方法流程:一次完整的设备虚拟化决策

面对一台需要虚拟化的设备,工程上通常按下面的流程做决策,而不是一上来就写 XML:

  1. 识别设备类型与性能诉求:是网卡、磁盘、GPU 还是 USB?吞吐、时延、是否需要独占?
  2. 确认硬件与内核条件:CPU 是否支持 VT-x/AMD-V,BIOS 是否开启 IOMMU,内核是否加载 vfio-pci。
  3. 选择设备模型:兼容优先选全模拟,性能优先选 virtio,极致性能或特殊设备选 VFIO 直通/SR-IOV。
  4. 编写并校验 libvirt XML:定义 <interface>、<disk>、<hostdev> 等节点。
  5. 启动验证与性能对比:用 virsh 启动,观察 dmesg、lspci、ethtool -S 等指标。
  6. 纳入集成与监控:接入存储池、虚拟网络、监控告警,形成可运维资产。

例如,查看宿主机是否具备直通条件,常用命令如下:

# 确认 IOMMU 是否开启
dmesg | grep -i -e DMAR -e IOMMU

# 查看 IOMMU 分组,判断设备能否安全直通
for d in /sys/kernel/iommu_groups/*/devices/*; do
  echo "IOMMU Group $(basename $(dirname $(dirname $d))): $(lspci -nns ${d##*/})"
done

# 将网卡绑定到 vfio-pci,准备直通
modprobe vfio-pci
echo 0000:3b:00.0 > /sys/bus/pci/drivers/vfio-pci/bind

四、案例场景:从"能跑"到"跑得好"

某企业需要在一台双路服务器上承载 20 台业务虚拟机,其中 2 台数据库虚拟机对磁盘 IOPS 要求极高,1 台需要 GPU 做推理。若全部使用默认的 IDE + e1000 全模拟设备,数据库虚拟机磁盘时延会明显偏高;正确做法是:数据库虚拟机使用 virtio-blk 或 virtio-scsi 并配合 cache=none、io=native,GPU 虚拟机通过 VFIO 直通整块显卡,其余普通业务虚拟机使用 virtio-net 接入 OVS 网络。这样既控制了成本,又让关键业务获得接近原生的性能。

五、常见误区与复盘要点

误区一:认为"装了 KVM 就等于虚拟化完成"。实际上 KVM 只提供 CPU 与内存虚拟化,设备虚拟化主要靠 QEMU 与 virtio/vfio 生态。
误区二:盲目追求直通。直通设备无法热迁移,且占用整块物理设备,密度和灵活性都会下降。
误区三:忽略 IOMMU 分组。同一分组内的设备必须一起直通,否则会破坏隔离性甚至导致宿主机异常。
误区四:只测功能不测性能。设备模型选错,功能正常但性能可能差数倍,必须用基准测试验证。

六、学习路径与章节清单

本课程共 30 章,建议按"基础 → 设备模型 → 集成 → 运维"的顺序推进。下表给出阶段划分与关键产出,便于你对照检查学习进度。

阶段 主要内容 关键产出
基础篇 KVM 架构、CPU/内存虚拟化、QEMU 与 libvirt 关系 能画出四层架构图,能启动第一台 KVM 虚拟机
设备篇 virtio 家族、VFIO 直通、SR-IOV、中断与 DMA 能为不同业务选择并配置合适的设备模型
集成篇 存储池、虚拟网络、OVS、镜像与模板、编排对接 能搭建一套可交付的虚拟化基础平台
运维篇 热迁移、性能调优、监控告警、故障排查 能定位并解决常见虚拟化性能与稳定性问题
学习建议:每学完一个设备模型,都在自己的实验环境里用 virsh dumpxml 对比配置差异,并用 fio、iperf3 做一次基准测试。把"配置—现象—数据"三者对应起来,是掌握 KVM 设备虚拟化最快的方式。

当你完成本课程后,应当具备把一台裸机 Linux 服务器,逐步构建为具备设备虚拟化能力、可集成、可监控、可迁移的虚拟化节点的完整能力。这正是"KVM 设备虚拟化与系统集成"这门课要交付的核心价值。