| 2025-03-16
在云计算和数据中心领域,KVM(Kernel - based Virtual Machine)虚拟化技术是一项关键技术,它允许在单一物理服务器上创建和运行多个虚拟机(VM),实现硬件资源的高效利用和隔离。简单来说,KVM 利用 Linux 内核将物理服务器的资源进行抽象和分配,使得每个虚拟机都仿佛拥有独立的 CPU、内存、存储和网络等资源。
KVM 整体架构主要由两个核心模块组成:KVM 模块和 QEMU - KVM。KVM 模块被集成在 Linux 内核中,它的主要职责是提供 CPU 和内存的虚拟化功能。具体而言,KVM 借助硬件辅助虚拟化技术,如 Intel 的 VT(Virtualization Technology)和 AMD 的 AMD - V,实现对 CPU 的虚拟化。在内存虚拟化方面,采用类似 Intel 的 EPT(Extended Page Tables)和 AMD 的 RVI(Rapid Virtualization Indexing)技术,使得客户操作系统(Guest OS)的 CPU 指令无需经过复杂的转译,可直接运行,极大地提高了虚拟化的性能。KVM 通过向用户空间暴露/dev/kvm设备接口,用户态程序能够通过ioctl函数来对其进行操作,例如完成虚拟机的初始化、内存分配、指令加载等关键任务。
而 QEMU - KVM 运行在 Linux 的用户空间层,它的作用是为虚拟机模拟各种 I/O 设备,比如网卡、磁盘等。QEMU 本身是一个通用的模拟器,它向客户操作系统模拟出 CPU 以及其他硬件设备,让客户操作系统误以为自己是直接与真实硬件打交道,实际上客户操作系统执行的指令是由 QEMU 模拟出来的硬件来处理,然后 QEMU 再将这些指令转译给真正的物理硬件。当 KVM 和 QEMU - KVM 协同工作时,就能实现完整意义上的服务器虚拟化,所以通常将它们合称为 QEMU - KVM。QEMU 将 KVM 整合进来,通过ioctl调用/dev/kvm接口,把涉及 CPU 指令处理的部分交给内核模块 KVM 来执行 。
当客户机中的设备驱动程序发起 I/O 操作请求时,若采用 QEMU 模拟 I/O 的方式,KVM 模块中的 I/O 操作捕获代码会拦截该 I/O 请求。经过处理后,本次 I/O 请求的信息会被存放到 I/O 共享页,并且 KVM 会通知用户空间的 QEMU 程序。QEMU 模拟程序获取到 I/O 操作的详细信息后,由硬件模拟代码模拟出此次 I/O 操作。操作完成后,结果被放回到 I/O 共享页,并再次通知 KVM 模块中的 I/O 操作捕获代码。最后,KVM 模块中的捕获代码读取 I/O 共享页中的操作结果,并将其返回到客户机中。不过,当客户机通过 DMA(Direct Memory Access,直接内存访问)访问大块 I/O 时,QEMU 模拟程序不会把操作结果放到 I/O 共享页,而是通过内存映射的方式将结果直接写入客户机的内存中,随后通过 KVM 模块告知客户机 DMA 操作已完成 。
除了上述基础机制,KVM 还支持半虚拟化技术,如 virtio。在 virtio 机制中,前端驱动(如 virtio - blk 用于块设备、virtio - net 用于网络设备等)存在于客户机中,而后端处理程序在 QEMU 中实现。在前后端驱动之间,定义了两层来支撑客户机与 QEMU 之间的通信。“virtio” 层作为虚拟队列接口,从概念上把前端驱动程序连接到后端处理程序。一个前端驱动程序可根据需求使用 0 个或多个队列,例如,virtio - net 网络驱动程序使用两个虚拟队列(一个用于接收数据,另一个用于发送数据),而 virtio - blk 块驱动程序仅使用一个虚拟队列。虚拟队列实际上跨越客户机操作系统和 hypervisor 实现衔接,只要客户机操作系统和 virtio 后端程序遵循一定标准,以相互匹配的方式实现,就能正常工作。另外,virtio - ring 实现了环形缓冲区,用于保存前端驱动和后端处理程序执行的信息。它可以一次性保存前端驱动的多次 I/O 请求,并交由后端批量处理,最后实际调用宿主机中的设备驱动完成物理 I/O 操作,通过这种批量处理方式,提高了客户机与 hypervisor 之间信息交换的效率 。
还有一个重要组件是 libvirt,它提供了调用 KVM 虚拟化技术的接口,主要用于管理虚拟机的生命周期。通过 libvirt,管理员可以方便地创建、启动、停止、暂停、迁移虚拟机等,极大地简化了虚拟机管理的复杂性。
1、 KVM 动态迁移技术:KVM 支持虚拟机在不同物理主机之间的动态迁移,迁移过程中虚拟机的运行状态不会中断。这一技术依赖于共享存储和网络配置,通过实时同步内存和 CPU 状态等信息,实现虚拟机在不同主机间无缝切换,常用于服务器维护、负载均衡等场景。
2、 KVM 嵌套虚拟化:嵌套虚拟化允许在一个虚拟机内部再运行另一个虚拟机。例如,在一个 KVM 虚拟机中安装另一个支持虚拟化的操作系统,并再次启用 KVM。这一技术对于测试和开发环境非常有用,能为开发者提供更灵活的实验平台,但对硬件资源和配置要求较高 。
3、 KVM 与容器技术对比:容器技术(如 Docker)和 KVM 虚拟化技术都是实现资源隔离和应用部署的方式。KVM 创建的虚拟机包含完整的操作系统,资源隔离性强但开销大;容器则共享主机操作系统内核,启动快、资源占用少,但隔离性相对弱一些。在实际应用中,可根据业务需求选择合适的技术。