15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
10.11.2023

KVM 虚拟化技术:架构、优势与实际应用

基于内核的虚拟机(KVM)是一种完整的虚拟化解决方案,作为可加载模块直接内置于 Linux 内核中。它通过利用 CPU 硬件扩展——Intel VT-x 或 AMD-V——将 Linux 内核本身转变为 Type-1(裸机)虚拟机监控程序,以接近原生的性能和严格的硬件级隔离执行客户机工作负载。

与作为应用程序运行在操作系统之上的托管型虚拟机监控程序不同,KVM 在内核级别运行,这意味着虚拟机通过内核的调度器、内存管理器和 I/O 子系统与物理硬件交互。这一架构上的区别是 KVM 在吞吐量、延迟和资源效率方面始终优于基于软件的虚拟化的主要原因。

KVM 的工作原理:核心架构

作为虚拟机监控程序的 Linux 内核

kvm.ko 模块(以及特定于 CPU 的模块——kvm-intel.kokvm-amd.ko)被加载后,Linux 内核无需替换或绕过操作系统即可获得虚拟机监控程序功能。内核继续处理调度、内存管理和设备驱动程序,同时还获得了运行称为虚拟机(VM)的隔离客户机环境的能力。

每个 VM 在受保护的执行上下文中运行。CPU 硬件扩展在主机内核(ring 0)和客户机代码之间强制执行权限分离,防止任何客户机直接访问或破坏主机内存或硬件状态。

QEMU:设备仿真层

KVM 负责 CPU 和内存虚拟化,但它本身不模拟外围硬件。这就是 QEMU(快速仿真器)进入架构的地方。KVM 和 QEMU 作为紧密耦合的一对运行:

  • KVM 通过硬件扩展管理 CPU 虚拟化,并通过扩展页表(Intel 上的 EPT)或嵌套页表(AMD 上的 NPT)管理内存虚拟化。
  • QEMU 模拟虚拟硬件设备——网卡、存储控制器、USB 总线、显示适配器——并为每个 VM 提供用户空间管理接口。

这种组合通常被称为 QEMU/KVM。每个 VM 在主机的进程表中显示为标准的 QEMU 进程,这意味着 Linux 的原生进程隔离、cgroups 和命名空间直接适用于 VM 资源控制。

VirtIO:用于最大吞吐量的半虚拟化 I/O

许多入门文章忽略的一个关键性能层是 VirtIO。VirtIO 不是完全模拟传统硬件(例如 Intel e1000 网卡或 IDE 磁盘控制器),而是提供标准化的半虚拟化接口。安装了 VirtIO 驱动程序的客户机操作系统通过共享内存环形缓冲区与虚拟机监控程序通信,从而大幅降低 I/O 开销。

在实践中,使用 VirtIO 网络接口(virtio-net)的 VM 与模拟的 e1000 适配器相比,将实现显著更高的每秒数据包速率和更低的延迟。同样的原则适用于块存储(virtio-blkvirtio-scsi)和内存气球(virtio-balloon)。

现代 Linux 发行版默认包含 VirtIO 驱动程序。Windows 客户机需要 VirtIO Win 驱动程序包,该包由 Red Hat 维护并可免费获取。

内存管理:KSM 和大页

KVM 与两个重要的 Linux 内核内存功能集成:

  • 内核同页合并(KSM):内核扫描 VM 内存页并将相同的页合并为单个写时复制页。在运行许多相似 VM(例如相同基础操作系统)的主机上,KSM 可以将总物理内存消耗减少 20–40%,从而允许更高的 VM 密度。
  • 透明大页(THP)和 Hugetlbfs:使用 2 MB 或 1 GB 大页分配客户机内存可减少 CPU 中的 TLB 压力,从而提高内存密集型工作负载的性能。生产部署通常将客户机内存固定到 hugetlbfs 以获得可预测的延迟。

KVM 与其他虚拟机监控程序:技术比较

功能KVMVMware ESXiHyper-VXen
虚拟机监控程序类型Type-1(通过 Linux 内核)Type-1(裸机)Type-1(裸机)Type-1(裸机)
许可证开源(GPL)专有(提供免费版本)专有(与 Windows Server 捆绑)开源(GPL)
CPU 虚拟化Intel VT-x / AMD-VIntel VT-x / AMD-VIntel VT-x / AMD-VIntel VT-x / AMD-V
半虚拟化 I/OVirtIOVMware PVSCSI / VMXNET3Hyper-V 合成适配器Xen PV 驱动程序
热迁移是(通过 virsh migrate是(vMotion)是(实时迁移)
内存超额分配是(KSM、气球)是(TPS、气球)是(动态内存)
管理工具libvirt、virt-manager、Proxmox、oVirtvCenterSCVMM、Hyper-V ManagerXenCenter、XCP-ng
客户机操作系统支持Linux、Windows、BSD、macOS(有限)Linux、Windows、BSDLinux、WindowsLinux、Windows、BSD
云集成原生(OpenStack、oVirt)VMware CloudAzure有限
开销极低

KVM 虚拟化的主要优势

原生 Linux 集成与工具链兼容性

由于 KVM 是内核模块而非独立的软件栈,它继承了整个 Linux 生态系统。标准工具——systemdcgroups v2perfftraceiptables/nftablestc——直接作用于 KVM 进程及其关联资源。这意味着已精通 Linux 的系统管理员只需极少的额外培训即可管理基于 KVM 的基础设施。

管理通常通过 libvirt 处理,这是一个抽象 KVM/QEMU 复杂性的稳定 API 层。virshvirt-managervirt-install 等工具提供 CLI 和 GUI 界面。Proxmox VEoVirt 等平台在 libvirt 和 KVM 之上构建了完整的数据中心级管理。

性能特性

KVM 的性能优势源于几个架构决策:

  • 硬件辅助 CPU 执行:客户机代码直接在 VMX 非根模式下的物理 CPU 上运行。虚拟机监控程序仅拦截特权指令(VM 退出),而非每条指令。
  • 直接内存访问:客户机物理内存使用 EPT/NPT 映射,消除了旧版虚拟化方法中基于软件的影子页表开销。
  • VirtIO I/O 路径:如上所述,半虚拟化驱动程序消除了网络和存储的设备仿真开销。

独立基准测试一致显示,对于计算密集型工作负载,KVM 可提供裸机 CPU 性能的 95–99%,当使用 VirtIO 和适当的存储后端(例如带 io_uring 的 NVMe)时,I/O 性能接近裸机水平。

安全隔离模型

KVM 依赖多个隔离层:

  • 硬件权限环:CPU 在硅片级别强制执行客户机/主机分离。
  • SELinux/AppArmor sVirt:每个 VM 进程都标记有唯一的 SELinux 上下文,即使利用了进程级漏洞,也能防止一个 VM 的 QEMU 进程访问另一个 VM 的内存文件。
  • Seccomp 过滤:QEMU 进程可以使用 seccomp 进行沙箱化,以限制可用的系统调用集,从而减少虚拟机监控程序进程本身的攻击面。

这种分层安全模型使 KVM 成为多租户托管环境的坚实基础。

热迁移与高可用性

KVM 支持热迁移——将正在运行的 VM 从一台物理主机迁移到另一台,零停机时间。该过程通过在 VM 继续运行的同时迭代地将脏内存页复制到目标主机,然后执行简短的最终同步和切换来实现。结合共享存储(Ceph、NFS、iSCSI)或存储迁移,这可以实现:

  • 不中断服务的滚动硬件维护
  • 跨物理主机的负载均衡
  • 高可用集群中的自动故障转移(使用 Pacemaker/Corosync 或 Proxmox HA)

客户机操作系统的灵活性

KVM 支持任何可在 x86-64 硬件上运行的操作系统,包括所有 Linux 发行版、Windows Server 和桌面版、FreeBSD、OpenBSD 等。通过添加 OVMF UEFI 固件,KVM 客户机可以在支持安全启动的 UEFI 模式下启动,这是某些 Windows 11 部署和安全加固 Linux 配置的要求。

实际使用案例与边缘情况

云基础设施

KVM 是 OpenStack(主流开源云平台)的虚拟机监控程序基础,并被主要云提供商使用。当您配置 VPS 托管实例时,鉴于 KVM 在 Linux 托管行业的主导地位,它很可能运行在基于 KVM 的技术栈上。

高性能工作负载的 GPU 直通

一个技术上先进但日益普遍的使用案例是 PCI 直通(使用 VFIO——虚拟功能 I/O)。这允许将物理 GPU 专门分配给单个 VM,使该 VM 直接、无中介地访问 GPU 硬件。结果是 VM 内部接近原生的 GPU 性能,这对以下场景至关重要:

  • 机器学习和 AI 模型训练
  • GPU 加速渲染
  • 科学计算工作负载

这是 GPU 托管服务的底层架构,其中专用 GPU 资源通过带 VFIO 直通的 KVM 而非软件仿真交付给租户。

嵌套虚拟化

KVM 支持嵌套虚拟化——在 KVM 客户机内运行 KVM 虚拟机监控程序。这通过向客户机公开 vmx(Intel)或 svm(AMD)CPU 标志来启用。嵌套虚拟化对以下场景很有价值:

  • 需要启动 VM 进行测试的 CI/CD 流水线
  • 虚拟化管理员的培训环境
  • 运行具有基于 VM 的节点隔离的 Kubernetes(例如 Kata Containers)

嵌套虚拟化的性能开销不可忽视,但对于开发和测试工作负载来说完全可以接受。

专用服务器虚拟化

运营专用服务器的组织通常部署 KVM 将物理硬件划分为多个隔离环境——在同一台物理机器上分离生产、预发布和开发工作负载,同时通过 CPU 固定和内存预留维持严格的资源保证。

KVM 上的 Web 托管控制面板

KVM VPS 实例是基于控制面板的托管的标准基础。带 cPanel 的 VPS 运行在 KVM 客户机上,该客户机提供 cPanel 安全模型所需的操作系统级隔离,而虚拟机监控程序层确保资源限制(CPU、RAM、磁盘 I/O)在硬件级别强制执行,而不仅仅依赖于操作系统级控制。

常见陷阱与运营注意事项

CPU 超额分配限制:KVM 允许 vCPU 数量超过物理 CPU 线程数(超额分配)。虽然这对于同时 CPU 需求较低的混合工作负载效果良好,但在 CPU 密集型工作负载上激进的超额分配比例(超过 4:1)会导致严重的调度争用和延迟峰值。监控客户机操作系统指标中的 steal time 作为指示器。

NUMA 拓扑感知:在多插槽服务器上,未能将 VM 内存和 vCPU 分配对齐到单个 NUMA 节点会导致跨 NUMA 内存访问惩罚。使用 numactl 和 libvirt 的 <numatune> 配置将 VM 固定到特定 NUMA 节点。

存储后端选择:存储后端的选择对 VM I/O 性能有重大影响。NVMe 上带 io_uringcache=none 的原始磁盘镜像提供最佳性能。使用默认设置的 QCOW2 镜像会引入写时复制开销;对于延迟敏感的工作负载,请使用 preallocation=metadatapreallocation=full

网络桥接与 macvtap:对于简单设置,Linux 桥接网络简单直接。对于高吞吐量场景,VEPA 或桥接模式下的 macvtap,或带 VF 分配的 SR-IOV,可以显著提高网络吞吐量并降低主机上的 CPU 开销。

快照一致性:QCOW2 内部快照不保证应用程序一致状态。对于数据库和其他有状态应用程序,在拍摄快照之前通过 QEMU 客户机代理(qemu-guest-agent)使用客户机级静默,以确保文件系统和应用程序一致性。

托管托管环境中的 KVM

对于需要 KVM 功能但不想直接管理虚拟机监控程序层的团队,托管托管提供商可以抽象这种复杂性。建立在 KVM 上的 VPS 控制面板环境为用户提供对完全隔离客户机的 root 级访问,而提供商透明地处理虚拟机监控程序维护、硬件故障和热迁移。

对于还需要在 VPS 资源旁边管理电子邮件基础设施的项目,将 KVM VPS 与电子邮件托管配对可使邮件投递与应用程序工作负载分离——这是防止受损应用程序影响邮件服务器声誉的最佳实践。

技术决策清单

使用此清单确定 KVM 是否是适合您环境的虚拟化层:

  • 工作负载类型:KVM 最适合通用服务器工作负载、数据库、Web 应用程序和容器化环境。对于大规模桌面虚拟化,评估 VDI 专用平台是否能增加价值。
  • 主机操作系统:KVM 需要 Linux 主机。如果您的基础设施以 Windows 为中心,Hyper-V 可能会减少运营摩擦。
  • 性能要求:如果您需要超过裸机 CPU 性能的 95%,请确保在客户机中安装了 VirtIO 驱动程序,并配置了 CPU 固定和 NUMA 对齐。
  • GPU 工作负载:如果租户需要专用 GPU 访问,请确认 BIOS/UEFI 中已启用 IOMMU,并且您的硬件支持 VFIO 直通。
  • 管理工具:对于单主机或小型部署,带 Machines 插件的 virt-manager 或 Cockpit 就足够了。对于多主机集群,评估 Proxmox VE 或 oVirt。
  • 存储后端:对于延迟敏感的工作负载,优先选择 NVMe 上带 preallocation=full 的原始镜像或 QCOW2。对于分布式高可用存储,使用 Ceph RBD。
  • 安全态势:在任何多租户环境中,对 QEMU 进程启用 sVirt(SELinux/AppArmor)和 seccomp 沙箱化。
  • 嵌套虚拟化:仅在需要时启用;它会增加开销并扩大攻击面。

常见问题

KVM 与 Docker 等容器有什么区别?

KVM 虚拟化完整硬件,为每个 VM 提供自己的内核、内存空间和虚拟设备。Docker 容器共享主机内核,并使用 Linux 命名空间和 cgroups 进行隔离。KVM 提供更强的隔离并支持任何客户机操作系统;容器为可以共享内核的工作负载提供更低的开销和更快的启动速度。

KVM 是否需要特定的 CPU 功能才能运行?

是的。KVM 需要在系统 BIOS/UEFI 中启用硬件虚拟化扩展——Intel VT-x 或 AMD-V。没有这些扩展,KVM 将无法加载。您可以通过检查 /proc/cpuinfo 中的 vmx(Intel)或 svm(AMD)标志来验证支持。

KVM 可以运行 Windows 虚拟机吗?

可以。KVM 完全支持从 Windows XP 到 Windows Server 2022 和 Windows 11 的 Windows 客户机。为获得最佳性能,请在 Windows 客户机内安装 VirtIO Win 驱动程序包以启用半虚拟化网络和存储驱动程序。Windows 11 需要使用 OVMF 的 UEFI 启动。

与裸机相比,KVM 的性能开销是多少?

对于 CPU 密集型工作负载,当硬件虚拟化扩展处于活动状态且 VirtIO 驱动程序正在使用时,KVM 开销通常为 1–5%。I/O 密集型工作负载可能会根据存储后端配置看到略高的开销,但经过适当调优的 KVM 环境通常可以实现裸机吞吐量的 95–99%。

KVM 如何在多租户环境中处理 VM 隔离?

KVM 在三个层面强制执行隔离:硬件层(CPU 权限环和用于设备隔离的 IOMMU)、内核层(每个 VM 是具有自己内存映射的独立进程)和安全框架层(sVirt 为每个 VM 进程及其关联的磁盘镜像分配唯一的 SELinux 标签,即使在 QEMU 进程受损的情况下也能防止跨 VM 访问)。

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用