1. KVM架构设计

一、KVM 核心设计思想:Linux 内核本身就是一个 Hypervisor

当前的主流虚拟化实现技术分为两种:
VMM(虚拟化监控器)运行在硬件平台上,控制所有硬件并管理guest os。guest os运行在比VMM更高的级别。例如xen和VMware ESXi。
VMM运行在宿主操作系统上,宿主操作系统作为第一软件层,VMM作为第二软件层,guest os作为第三软件层。例如kvm和virtual box。

kvm
在这里插入图片描述
KVM是集成到Linux内核的Hypervisor,是X86架构且硬件支持虚拟化技术(Intel VT或AMD-V)的Linux的全虚拟化解决方案。它是Linux的一个很小的模块,利用Linux做大量的事,如任务调度、内存管理与硬件设备交互等。

我们把KVM和传统的虚拟化方案对比一下:

  • 传统虚拟化(如 VMware ESXi, Xen): 它们是一套独立的、专门为虚拟化打造的操作系统(或内核)。你需要先安装这个“虚拟化操作系统”,然后再在上面创建虚拟机。它管理着所有硬件资源,并直接分配给虚拟机。

    • 比喻: 这就像盖楼。传统方案是自己先造一个全新的、坚固的地基和框架(Hypervisor),然后在这个框架里砌墙隔出一个个房间(虚拟机)。
  • KVM(Kernel-based Virtual Machine): 它的想法非常巧妙——为什么不把 Linux 内核本身变成一个 Hypervisor 呢? Linux 内核已经是一个非常成熟、稳定、能高效管理硬件(CPU、内存、磁盘、网络)的操作系统核心了。KVM 的工作就是给这个内核打一个“虚拟化”的补丁,让它具备虚拟化的超能力。

    • 比喻: 这就像你本来已经有一栋功能齐全的大楼(Linux 系统)。KVM 的作用是给这栋大楼加装一套神奇的“空间折叠”系统。大楼本身的管理、安保、水电系统(Linux 内核的功能)照常运行,但同时它现在能创造出多个独立的、互不干扰的“平行空间”(虚拟机)。

这个设计带来了巨大优势:

  1. 无需重复造轮子: 直接利用 Linux 内核已有的进程调度、内存管理、设备驱动等强大功能,代码量少,稳定可靠。
  2. 天然融入生态: 既然是内核的一部分,它就能直接使用 Linux 内核的所有优化和新特性,享受整个Linux生态的红利。
  3. 简单: 在大多数 Linux 发行版中,KVM 几乎就是“开箱即用”的。

二、整体实现架构:KVM + QEMU 的黄金搭档

光有内核能力还不够,还需要有工具来创建和管理虚拟机。

  1. KVM 内核模块 (/dev/kvm)

    • 角色: 核心引擎。它是 Linux 内核的一个模块,一旦加载,内核就变成了一个 Hypervisor。
    • 职责: 负责CPU 虚拟化内存虚拟化的核心工作。它直接调用 CPU 的硬件虚拟化功能来创建和管理虚拟机的执行环境(vCPU)。它提供了了一个叫做 /dev/kvm 的字符设备,这个设备是用户空间(QEMU)和内核空间(KVM模块)通信的接口。
  2. QEMU(用户空间工具)

    • 角色: 管家和设备模拟大师。它是一个运行在用户空间的普通进程。
    • 职责:
      • 虚拟机生命周期管理: 启动、停止、暂停虚拟机。
      • IO 虚拟化: 模拟虚拟机的硬件设备,如硬盘、网卡、键盘、鼠标、BIOS 等。虚拟机以为自己在使用真实的硬件,实际上是 QEMU 在“演戏”。
      • 调用 KVM: 通过 /dev/kvm 接口,向 KVM 模块发出指令,比如“创建一个 vCPU”或“运行这个 vCPU”。

两者如何协作?
当启动一个 KVM 虚拟机时,发生的是:

  • QEMU 进程启动。
  • QEMU 通过 /dev/kvm 接口告诉 KVM 模块:“我要创建一个虚拟机!” 并为此虚拟机分配资源(内存、虚拟CPU等)。
  • 对于每个虚拟CPU(vCPU),QEMU 会创建一个普通的 Linux 线程
  • 当这个线程需要执行客户机(Guest)的指令时,它就会通过 ioctl 系统调用陷入内核,由 KVM 模块接管。
  • KVM 模块利用硬件辅助虚拟化功能,让这个线程直接在物理 CPU 上以“非根模式”执行客户机代码,速度极快,近乎原生
  • 当客户机需要操作模拟设备(比如读写磁盘)或发生中断时,它会退出(VM-Exit)到 KVM 模块,KVM 模块再通知 QEMU 进程。QEMU 就来模拟这个设备操作,完成后再次通过 KVM 进入客户机。

简单说:KVM 管执行和内存,QEMU 管设备和模拟。


三、三大虚拟化技术详解

1. CPU 虚拟化(KVM 的核心)
  • 问题: 虚拟机里的操作系统(Guest OS)认为自己运行在最高权限级别(Ring 0),但它实际上只是一个被 Host OS 管理的进程,运行在用户权限级别(Ring 3)。如果它直接执行特权指令(如操作硬件),会失败或导致系统崩溃。

  • 解决方案(硬件辅助虚拟化):

    • Intel VT-x / AMD-V: 现代 CPU 提供了这些功能,为虚拟化开了“后门”。
    • 两种模式:
      • 根模式 (Root Mode): Hypervisor(KVM)运行的模式,拥有最高控制权。
      • 非根模式 (Non-Root Mode): 虚拟机(Guest)运行的模式。当Guest尝试执行特权指令时,CPU 会自动陷入(VM-Exit) 到根模式的 Hypervisor 中。Hypervisor 处理完这个请求(比如由QEMU模拟)后,再通过 VM-Entry 让 Guest 继续执行。
    • 在 KVM 中: 每个虚拟 CPU(vCPU)在宿主机中就是一个普通的 Linux 线程。Linux 的调度器(CFS)负责调度这些 vCPU 线程,让它们在物理 CPU 核心上运行。当线程运行时,CPU 就处于“非根模式”,直接执行客户机代码。
2. 内存虚拟化
  • 问题: Guest OS 有自己的内存视图,它认为自己的物理地址是从 0 开始的连续空间。但实际上,它的“物理内存”是宿主机分配给它的一块不连续的真实物理内存。

  • 解决方案(硬件辅助虚拟化 - Intel EPT / AMD RVI/NPT):

    • 影子页表 (Shadow Page Table,旧方法): Hypervisor 需要为每个Guest维护一套非常复杂的“影子页表”,将Guest的虚拟地址直接映射到Host的物理地址。效率低下,开销大。
    • 扩展页表 (EPT) / 嵌套页表 (NPT): CPU 硬件提供了两级地址翻译功能。
      1. 第一级: Guest OS 负责将 Guest 的虚拟地址 (GVA) 翻译成 Guest 认为的物理地址 (GPA)。(由Guest OS管理)
      2. 第二级: Hypervisor (KVM) 负责将 Guest 物理地址 (GPA) 翻译成 Host 的物理地址 (HPA)。(由KVM管理,通过EPT/NPT硬件实现)
    • 在 KVM 中: KVM 使用 EPT/NPT 功能。CPU 的 MMU(内存管理单元)硬件会自动完成这两级翻译,几乎没有任何性能开销。Guest 的内存访问性能因此接近原生。
3. I/O 虚拟化(QEMU 的核心)

这是性能开销最大的一环,因此演化出了多种技术:

  • 全虚拟化 (Full Virtualization) - QEMU 模拟:

    • 方式: QEMU 模拟一整套标准硬件(如 IDE 硬盘、e1000 网卡)。Guest OS 使用自带的通用驱动就能工作。当Guest进行I/O操作时,会发生多次 VM-Exit,陷入到QEMU,由QEMU软件模拟设备行为。
    • 优点: 兼容性极好,无需修改Guest OS。
    • 缺点: 性能差,延迟高,因为每次I/O操作都要在用户空间(QEMU)和内核空间(KVM)之间来回切换。
  • 半虚拟化 (Paravirtualization) - VirtIO:

    • 方式: 这是一种“合作”模式。Hypervisor 提供一套高效的、虚拟化感知的设备接口(VirtIO)。需要在 Guest OS 中安装特殊的 VirtIO 驱动。这套驱动知道自己是运行在虚拟机里,它会通过一个高效的前端(Frontend)和后端(Backend)通信机制,直接与宿主机中的VirtIO后端驱动(通常在内核中)通信,避免了复杂的硬件模拟和多次上下文切换。
    • 优点: 性能大幅提升,接近原生。
    • 缺点: 需要在Guest OS中安装特定驱动(但现代Linux和Windows都已内置)。
  • 设备直通 (Device Passthrough - VFIO/IoT):

    • 方式: 直接将一个物理硬件设备(如网卡、GPU)划拨给某个虚拟机独占使用。虚拟机可以直接和这个硬件通信,几乎零开销
    • 技术: 依赖 IOMMU 硬件(Intel VT-d/AMD-Vi)。IOMMU 为 DMA 操作提供地址翻译和隔离,防止虚拟机直接访问宿主机内存,保证安全。
    • 优点: 性能极致,适用于对性能要求极高的场景(如高性能网卡、GPU计算)。
    • 缺点: 一个设备只能给一个虚拟机使用,无法共享。

kvm架构总结

KVM 的成功在于其巧妙的设计哲学和与硬件技术的完美结合:

  1. 思想: 化整为零。将复杂的虚拟化功能拆解,核心的CPU和内存虚拟化由强化后的Linux内核(KVM模块) 通过硬件辅助高效完成;繁杂的设备模拟则由用户空间的QEMU处理。
  2. 架构: 分工明确。KVM(内核) + QEMU(用户空间)各司其职,通过 /dev/kvm 接口高效通信。
  3. 技术: 软硬结合
    • CPU: 依靠 Intel VT-x/AMD-V 实现高效模式切换。
    • 内存: 依靠 EPT/NPT 实现近乎无损的内存虚拟化。
    • I/O: 从性能最低的全虚拟化,到广泛使用的半虚拟化(VirtIO),再到极致的设备直通(VFIO),提供了灵活的方案。

2. KVM 在云数据中心的主要应用场景

现代云计算中心,如阿里云和腾讯云,大量且深度地依赖 KVM 作为其最核心的虚拟化基石。可以说,没有 KVM,就没有今天如此高效、弹性和低成本的公有云服务。

1. 弹性计算服务(ECS/云服务器)的绝对核心

这是 KVM 最直接、最广泛的应用。当你购买一台阿里云 ECS 或腾讯云 CVM 实例时,你得到的本质上是一台在物理服务器上通过 KVM 虚拟化出来的虚拟机

  • 底层支撑: 云数据中心的每一台物理服务器(称为宿主机 Host)都运行着一个高度定制化的 Linux 操作系统,并加载了 KVM 内核模块。这套系统负责在单台物理机上创建和管理数十台甚至上百台虚拟机实例。
  • 资源分配: KVM 负责将物理的 CPU、内存、磁盘 I/O、网络带宽等资源进行切割、隔离和分配,确保你的云服务器能独占所购买的 vCPU 和内存资源,且不会受到同一台物理机上其他邻居实例的干扰(通过一系列技术保障)。
  • 快速发放: 基于 KVM 的虚拟机可以毫秒级创建和启动,这是云服务“弹性”特性的技术前提。云厂商的自动化系统通过调用 KVM(通常通过 libvirt 等管理库)来批量、快速地完成实例的发放。

2. 高性能网络虚拟化的基石

云服务器的网络性能至关重要。KVM 提供了实现高性能虚拟网络的基础。

  • VirtIO 驱动: 云厂商绝不会使用模拟的、性能低下的网卡(如 e1000)。而是为 Windows 和 Linux 镜像预装优化过的 VirtIO 半虚拟化驱动,使得虚拟机能够以近乎原生的效率与虚拟交换机进行数据交换,极大降低网络延迟,提升带宽。
  • 用户态网络加速(vHost-User): 这是更极致的优化。传统上,虚拟机的网络数据包需要经过宿主机内核的 KVM 模块处理。而 vHost-User 技术允许将网络数据路径完全卸载到用户空间,让云厂商自研的高性能虚拟交换机(如基于 DPDK)直接与虚拟机通信,完全绕过内核协议栈,从而实现极高的网络性能。这是实现云上万兆甚至更高网络能力的关键。

3. 云硬盘与存储虚拟化的引擎

你为云服务器购买的云硬盘(如阿里云 ESSD、腾讯云 CBS),其底层也离不开 KVM 的支撑。

  • 虚拟块设备: KVM 配合 QEMU 可以将远程分布式存储集群(如 Ceph,阿里云盘古系统)提供的存储空间,以虚拟块设备(如 VirtIO-BLK)的形式挂载给虚拟机。
  • 高性能访问: 同样,通过 VirtIO-SCSI 等半虚拟化驱动,虚拟机可以高效、低延迟地访问这些远程存储,使其感觉像是在使用一块本地 SSD 硬盘。
  • 快照与备份: 虚拟机磁盘的快照功能高度依赖于 KVM/QEMU 提供的底层能力来冻结磁盘状态并创建指针。

4. 实现关键云计算特性的基础

许多我们习以为常的云服务特性,其底层实现都基于 KVM 提供的机制:

  • 热迁移(Live Migration): 这是云平台进行硬件维护、负载均衡而不影响用户业务的核心功能。KVM 原生支持动态内存迁移,它可以在虚拟机不停机的情况下,将其从一个物理宿主机完整地迁移到另一台宿主机上。用户对此过程完全无感知。
  • 弹性伸缩: 正因为基于 KVM 的虚拟机可以快速创建和销毁,云平台才能实现“秒级”开通和释放资源,从而支撑你根据业务流量自动增加或减少 ECS 实例数量。
  • 安全隔离: KVM 配合硬件虚拟化技术(如 Intel VT-d/AMD-Vi)提供了强大的硬件级隔离性,确保你的 ECS 实例与其他用户的实例在硬件层面是隔离的,无法互相窃取数据。这是多租户公有云安全的基石。

KVM应用总结

在阿里云、腾讯云这样的现代云计算中心,KVM 远不止是一个可选的虚拟化组件,而是已经成为了整个基础设施的“操作系统内核”

它被应用于:

  1. 计算资源池化(ECS/CVM 实例)。
  2. 软件定义网络(SDN)的加速。
  3. 软件定义存储(SDS)的接入。
  4. 实现高级功能(热迁移、弹性伸缩)。
  5. 保障多租户安全隔离

云计算厂商在开源 KVM 的基础上,进行了深度的定制化、优化和加固,使其能够胜任超大规模、高性能、高可用的严苛生产环境。因此,KVM 是名副其实的现代云计算基石。

3. 云计算KVM虚拟机操作系统

云计算平台管理成千上万的 KVM 宿主机和虚拟机,绝不是靠手动敲命令,而是依靠一套极其复杂、高度自动化的管理平台和编排系统

这些系统就像云数据中心的“大脑”和“神经中枢”,指挥着每一个物理部件和虚拟实例。

核心管理思想:分层与抽象

云计算的管理模式是典型的分层架构,其核心思想是将物理硬件资源“池化”,然后通过软件定义的方式,按需分配和回收。

  1. 资源池化 (Resource Pooling): 将数据中心里所有服务器的 CPU、内存、硬盘、网络交换机等资源打碎,整合成一个巨大的统一资源池。用户不再关心某台虚拟机具体运行在哪一台物理机上。
  2. 软件定义 (Software-Defined): 通过软件来控制这些资源池,实现计算虚拟化(KVM)、软件定义网络(SDN)、软件定义存储(SDS)。这使得网络策略和存储分配都可以通过 API 动态、灵活地调整。
  3. 自动化与编排 (Automation & Orchestration): 所有操作,从虚拟机的创建、迁移到网络的配置和故障恢复,都不是手动完成的,而是由管理平台根据预设策略自动执行。

开源管理方案

对于想要自建私有云或理解公有云背后原理的人来说,以下开源方案是至关重要的。它们常常被组合使用,而不是单一部署。

1. OpenStack - 云操作系统 (IaaS)

OpenStack 是目前最知名、最全面的开源云计算管理平台,堪称云数据中心的“操作系统”。 阿里云和腾讯云的早期版本都基于 OpenStack 构建,后来逐步发展出了自己的闭源独家技术。

OpenStack 由许多独立的项目(组件)组成,每个项目负责管理不同的资源:

核心组件 功能描述 相当于云厂商的什么服务
Nova 计算服务。是 OpenStack 的核心,负责虚拟机生命周期的管理。它通过驱动(如 Libvirt)来与底层的 KVM Hypervisor 交互,完成虚拟机的创建、删除、启动、停止等操作。 弹性计算服务 (ECS/CVM)
Neutron 网络服务。提供软件定义网络(SDN) 能力。负责管理虚拟网络、子网、路由器、防火墙、负载均衡器等,为虚拟机提供复杂的网络拓扑和隔离。 虚拟私有云 (VPC)
Cinder 块存储服务。为虚拟机提供持久化的块存储(即云硬盘)。它通过驱动后端存储系统(如 Ceph, LVM, 商业存储)来分配和管理存储卷。 云硬盘服务 (EBS/CBS)
Glance 镜像服务。存储和管理虚拟机镜像模板(如 Ubuntu, CentOS, Windows 的预装模板)。创建新虚拟机时,Nova 会从 Glance 拉取镜像。 镜像市场
Keystone 身份认证服务。所有操作的“守门人”,负责用户认证、授权和服务目录。 访问控制 (RAM/CAM)
Horizon 仪表板服务。提供基于 Web 的图形化操作界面。 云控制台

工作原理: 用户通过 Horizon 界面或 API 发起“创建一台 4核8G 的虚拟机”的请求。Keystone 先验证用户权限,然后 Nova 调度器从资源池中选择最合适的 KVM 宿主机,通知该主机上的 Nova 计算服务通过 Libvirt 启动虚拟机,同时 Cinder 分配一块云硬盘,Neutron 配置好网络。所有过程自动完成。

2. Kubernetes + KubeVirt - 云原生时代的玩法

这是面向未来的趋势,旨在用管理容器的方式统一管理虚拟机。

  • Kubernetes (K8s): 是容器编排领域的事实标准,擅长管理无状态的、轻量级的容器应用。

  • KubeVirt: 是一个运行在 Kubernetes 之上的扩展。它的思路是:“既然 Kubernetes 能如此出色地调度和管理 Pod(容器组),那为什么不把虚拟机也当作一个特殊的 Pod 呢?”

    • KubeVirt 在 Kubernetes 集群中创建一种新的资源类型 VirtualMachine
    • 当你定义一个 VM 的规格后,KubeVirt 会创建一个 Pod,这个 Pod 里运行的容器包含了运行 KVM 虚拟机所需的所有组件。
    • 巨大优势: 这样,虚拟机和容器就可以由同一个平台(Kubernetes) 统一管理,共享同样的网络(CNI)、存储(CSI)和调度策略。这对于现代化应用(同时包含微服务容器和传统虚拟机组件)的混合部署非常有吸引力。
3. 底层工具链:Libvirt

Libvirt 是所有这些上层平台(OpenStack)与 KVM 交互的底层通用库和工具集。它本身不是一个管理平台,而是一个重要的“桥梁”。

  • 它提供了一套稳定的 API,用来管理单台主机上的 KVM、Xen、LXC 等多种虚拟化技术。
  • virsh(命令行工具)、virt-manager(图形化工具)这些都是 Libvirt 的客户端。
  • 上层平台(如 OpenStack Nova)最终都是通过调用 Libvirt 的 API 来操作底层 KVM 的。

总结与类比

方案 定位 优点 适用场景
OpenStack 完整的 IaaS 云操作系统 功能全面,生态庞大,标准化的云API 大型私有云/公有云,需要提供类似AWS的完整服务
Kubernetes + KubeVirt 云原生统一平台 统一管理容器和虚拟机,拥抱云原生生态 现代化应用混合部署, DevOps和云原生转型
Libvirt 底层管理工具库 稳定、通用,是上层平台的基础 单机或小规模集群的手动管理,开发测试

总而言之,云计算中心通过像 OpenStack 这样的编排系统,将成千上万的 KVM 宿主机组织起来,通过软件定义网络和存储实现资源池化,并最终通过自动化API 向用户提供按需取用的计算资源。这些开源方案正是构建这一切的蓝图和基石。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐