2. 虚拟化基础

虚拟化是云计算与数据中心集成的地基。它通过软件抽象层,把物理服务器的 CPU、内存、存储、网络等资源“切分”或“聚合”成多个相互隔离的执行环境,让多个操作系统或应用共享同一套硬件,同时保持彼此独立。理解虚拟化的定义、分类与演进,是掌握 KVM 设备虚拟化与系统集成的前提。

一、虚拟化的核心定义与原理

虚拟化本质上是在硬件与操作系统之间插入一层 Hypervisor(虚拟机监控器),由它负责资源的抽象、调度与隔离。Hypervisor 运行在最高特权级,Guest OS 运行在较低特权级,当 Guest 执行敏感指令时,由 Hypervisor 截获并模拟或直接执行。

虚拟化要解决三个核心问题:

  • 资源抽象:把物理 CPU 抽象为 vCPU,把物理内存抽象为 Guest 可见的连续内存空间。
  • 隔离性:不同虚拟机之间互不可见、互不干扰,一个 VM 崩溃不影响其他 VM。
  • 调度与复用:Hypervisor 按时间片和策略把物理资源分配给多个 VM,提高利用率。
虚拟化的经典判据:Guest OS 中执行的特权指令,必须能被 Hypervisor 正确截获并处理,否则会出现“虚拟化漏洞”。

二、虚拟化的分类

按抽象层次和实现方式,虚拟化可分为多种类型。下表从“抽象对象、典型代表、适用场景”三个维度进行对比:

分类 抽象对象 典型代表 适用场景
全虚拟化 完整硬件 KVM、VMware ESXi 通用服务器整合
半虚拟化 改造后的硬件接口 Xen PV 对 I/O 性能敏感场景
硬件辅助虚拟化 CPU 扩展指令 Intel VT-x、AMD-V KVM 默认依赖
操作系统级虚拟化 内核命名空间 Docker、LXC 轻量应用隔离
桌面虚拟化 桌面会话 VDI、Citrix 远程办公
网络虚拟化 网络功能 OVS、NFV SDN/云网络

其中,Type 1(裸金属) Hypervisor 直接运行在硬件上,如 KVM、ESXi;Type 2(宿主型) 运行在宿主 OS 之上,如 VirtualBox、VMware Workstation。KVM 属于 Type 1,但以 Linux 内核模块形式存在,兼具裸金属性能与 Linux 生态优势。

三、发展历程:从大型机到云原生

虚拟化并非新概念,其演进大致经历四个阶段:

  1. 1960s—大型机时代:IBM CP-67/CMS 首次实现多用户共享大型机资源,奠定 Hypervisor 思想。
  2. 1990s—x86 虚拟化探索:VMware 通过二进制翻译实现 x86 全虚拟化,Xen 提出半虚拟化,性能与兼容性成为焦点。
  3. 2005—硬件辅助虚拟化:Intel VT-x 与 AMD-V 引入根模式/非根模式,KVM 于 2007 年并入 Linux 主线,虚拟化进入内核原生时代。
  4. 2010s 至今—云与云原生:OpenStack、Kubernetes 推动虚拟机与容器协同,KVM 成为公有云与私有云的主流底座。

四、KVM 在虚拟化技术栈中的定位与优势

KVM(Kernel-based Virtual Machine)是 Linux 内核的一个模块,加载后使 Linux 本身成为一个 Type 1 Hypervisor。它不重复实现调度器、内存管理,而是复用 Linux 内核的 CFS 调度、内存管理、网络协议栈与安全模块,因此代码量小、性能损耗低。

KVM 技术栈自下而上可概括为:

  • 硬件层:支持 VT-x/AMD-V 的 CPU、IOMMU、SR-IOV 网卡。
  • 内核层:KVM 模块 + Linux 内核(调度、内存、VFS、Netfilter)。
  • 用户态层:QEMU 负责设备模拟,libvirt 提供统一管理 API。
  • 管理层:virsh、virt-manager、OpenStack Nova、oVirt。

KVM 的主要优势包括:

  • 内核原生:随 Linux 主线发布,无需额外 Hypervisor,减少维护成本。
  • 性能接近物理机:借助硬件辅助虚拟化与 virtio 半虚拟化驱动,I/O 与 CPU 开销低。
  • 生态开放:与 QEMU、libvirt、OpenStack、Kubernetes 无缝集成。
  • 安全隔离:复用 SELinux、cgroups、命名空间,支持 sVirt 强化。
  • 可扩展:支持热迁移、CPU/内存热插拔、嵌套虚拟化、vGPU。
在系统集成项目中,KVM 常作为“计算虚拟化底座”,与 Ceph 存储、OVS 网络、OpenStack 管理平台组合,形成完整的私有云方案。

五、典型场景与常见误区

场景示例:某企业将 20 台物理服务器整合为 3 台 KVM 宿主机,每台运行 8~10 个 VM。通过 libvirt 统一管理,配合 virtio 磁盘与网卡,单 VM 网络吞吐可达物理网卡的 80% 以上。

# 查看 KVM 是否启用
lsmod | grep kvm
# 输出示例
kvm_intel             315392  0
kvm                   831488  1 kvm_intel

# 使用 virt-install 创建一台 VM
virt-install --name web01 --ram 4096 --vcpus 2 \
  --disk path=/var/lib/libvirt/images/web01.qcow2,size=40 \
  --network network=default,model=virtio \
  --cdrom /iso/CentOS-7.iso

常见误区:

  • 误以为“装了 KVM 就自动有虚拟机”——KVM 只提供内核加速,必须配合 QEMU 才能模拟完整设备。
  • 忽略硬件辅助虚拟化开关——BIOS 中未开启 VT-x/AMD-V 时,KVM 无法加载或性能骤降。
  • 把容器等同于虚拟机——容器共享内核,隔离级别与 VM 不同,不能替代强隔离场景。
  • 过度分配 vCPU——vCPU 总数远超物理核数会导致调度争抢,反而降低整体性能。
生产环境应预留至少 10%~20% 的物理资源余量,并监控 CPU Ready、内存 Ballooning、磁盘 IOPS 等指标,避免超分引发雪崩。

六、小结与复盘要点

虚拟化通过 Hypervisor 实现资源抽象、隔离与复用;按抽象层次可分为全虚拟化、半虚拟化、硬件辅助、OS 级等类型;其发展从大型机走向云原生。KVM 以内核模块形式实现 Type 1 虚拟化,凭借内核原生、性能优异、生态开放、安全可扩展等优势,成为当前 Linux 环境下设备虚拟化与系统集成的首选底座。掌握 KVM 与 QEMU、libvirt 的分工,是后续设备直通、virtio 优化与云平台集成的关键起点。

KVM 虚拟化技术栈分层定位 管理层 virsh · virt-manager · OpenStack Nova · oVirt · Kubernetes 用户态层 QEMU(设备模拟) · libvirt(统一 API) · virtio 后端 负责 I/O 模拟、设备模型、生命周期管理 Linux 内核层 KVM 模块 CFS 调度器 内存管理 网络 / VFS / cgroups 硬件层 CPU(Intel VT-x / AMD-V) · IOMMU · SR-IOV 网卡 · NVMe · GPU 硬件辅助虚拟化是 KVM 高性能的物理基础 Guest VM:vCPU · vMemory · virtio-blk · virtio-net · vGPU(运行于 KVM + QEMU 之上) 管理编排 设备模拟 内核加速 物理资源