KVM 就是在硬件辅助虚拟化技术之上构建起来的虚拟机监控器。当然,并非要所有这些硬件虚拟化都支持才能运行 KVM 虚拟化,KVM 对硬件最低的依赖是 CPU 的硬件虚拟化支持,比如:Intel 的 VT 技术和 AMD 的 AMD-V 技术,而其他的内存和 I/O 的硬件虚拟化支持,会让整个 KVM 虚拟化下的性能得到更多的提升。

KVM 虚拟化的核心主要由以下两个模块组成:

  • KVM 内核模块,它属于标准 Linux 内核的一部分,是一个专门提供虚拟化功能的模块,主要负责 CPU 和内存的虚拟化,包括:客户机的创建、虚拟内存的分配、CPU 执行模式的切换、vCPU 寄存器的访问、vCPU 的执行。

KVM 模块是 KVM 虚拟化的核心模块,它在内核中由两部分组成:一个是处理器架构无关的部分,      用 lsmod 命令中可以看到,叫作 kvm 模块;另一个是处理器架构相关的部分,在 Intel 平台上就是       kvm_intel 这个内核模块。KVM 的主要功能是初始化 CPU 硬件,打开虚拟化模式,然后将虚拟客户       机运行在虚拟机模式下,并对虚拟客户机的运行提供一定的支持。


  • QEMU 用户态工具,它是一个普通的 Linux 进程,为客户机提供设备模拟的功能,包括模拟 BIOS、PCI/PCIE 总线、磁盘、网卡、显卡、声卡、键盘、鼠标等。同时它通过 ioctl 系统调用与内核态的 KVM 模块进行交互。

QEMU 支持在 Linux、Windows、FreeBSD、Solaris、MacOS 等多种操作系统上运行,能支持在 QEMU 本身编译运行的平台上就实现虚拟机的功能,甚至可以支持客户机与宿主机并不是同一个架构(比如在 x86 平台上运行 ARM 客户机)。作为一个存在已久的虚拟机监控器软件,QEMU 的代码中有完整的虚拟机实现,包括处理器虚拟化、内存虚拟化,以及 KVM 也会用到的虚拟设备模拟(比如网卡、显卡、存储控制器和硬盘等)。

QEMU 除了提供完全模拟的设备(如:e1000 网卡、IDE 磁盘等)以外,还支持 virtio 协议的设备模拟。virtio 是一个沟通客户机前端设备与宿主机上设备后端模拟的比较高性能的协议,在前端客户机中需要安装相应的 virtio-blk、virtio-scsi、virtio-net 等驱动,而 QEMU 就实现了 virtio 的虚拟化后端。

KVM 是在硬件虚拟化支持下的完全虚拟化技术,所以它能支持在相应硬件上能运行的几乎所有的操作系统,如:Linux、Windows、FreeBSD、MacOS 等。在 KVM 虚拟化架构下,每个客户机就是一个 QEMU 进程,在一个宿主机上有多少个虚拟机就会有多少个 QEMU 进程;客户机中的每一个虚拟 CPU 对应 QEMU 进程中的一个执行线程;一个宿主机中只有一个 KVM 内核模块,所有客户机都与这个内核模块进行交互。

KVM 架构概述_KVM

在实际的云计算的虚拟化场景中,为了更高的性能或者管理的方便性,还有很多的软件可以作为 KVM 虚拟化实施中的组件:

  • vhost-net 是 Linux 内核中的一个模块,它用于替代 QEMU 中的 virtio-net 用户态的 virtio 网络的后端实现。使用 vhost-net 时,还支持网卡的多队列,整体来说会让网络性能得到较大提高。在 6.1.6 节中对 vhost-net 有更多的介绍。
  • Open vSwitch 是一个高质量的、多层虚拟交换机,使用开源 Apache2.0 许可协议,主要用可移植性强的 C 语言编写的。它的目的是让大规模网络自动化可以通过编程扩展,同时仍然支持标准的管理接口和协议(例如 NetFlow、sFlow、SPAN、RSPAN、CLI、LACP、802.1ag)。同时也提供了对 OpenFlow 协议的支持,用户可以使用任何支持 OpenFlow 协议的控制器对 OVS 进行远程管理控制。
  • DPDK 全称是 Data Plane Development Kit,最初是由 Intel 公司维护的数据平面开发工具集,为 Intel x86 处理器架构下用户空间高效的数据包处理提供库函数和驱动的支持,现在也是一个完全独立的开源项目,它还支持 POWER 和 ARM 处理器架构。不同于 Linux 系统以通用性设计为目的,它专注于网络应用中数据包的高性能处理。
  • Ceph 是 Linux 上一个著名的分布式存储系统,能够在维护 POSIX 兼容性的同时加入复制和容错功能。Ceph 由储存管理器(Object storage cluster 对象存储集群,即 OSD 守护进程)、集群监视器(Ceph Monitor)和元数据服务器(Metadataserver cluster,MDS)构成。
  • libguestfs 是用于访问和修改虚拟机的磁盘镜像的一组工具集合。libguestfs 提供了访问和编辑客户机中的文件、脚本化修改客户机中的信息、监控磁盘使用和空闲的统计信息、P2V、V2V、创建客户机、克隆客户机、备份磁盘内容、格式化磁盘、调整磁盘大小等非常丰富的功能。