1、硬件虚拟化技术
1.1、CPU虚拟化
Intel 在处理器级别提供了对虚拟化技术的支持,被称为 VMX(virtual-machine extensions)。有两种 VMX 操作模式:VMX 根操作(root operation)与 VMX 非根操作(non-root operation)。作为虚拟机监控器中的 KVM 就是运行在根操作模式下,而虚拟机客户机的整个软件栈(包括操作系统和应用程序)则运行在非根操作模式下。进入 VMX 非根操作模式被称为 “VM Entry”;从非根操作模式退出,被称为 “VM Exit”
VMX 的非根操作模式是一个相对受限的执行环境,为了适应虚拟化而专门做了一定的修改;在客户机中执行的一 些特殊的敏感指令或者一些异常会触发 “VM Exit” 退到虚拟机监控器中,从而运行在 VMX 根模式。正是这样的限制,让虚拟机监控器保持了对处理器资源的控制
1.2、内存虚拟化
内存虚拟化的目的是给虚拟客户机操作系统提供一个从 0 地址开始的连续物理内存空间,同时在多个客户机之间实现隔离和调度。在虚拟化环境中,内存地址的访问会主要涉及以下4个基础概念:
-
客户机虚拟地址 GVA(Guest Virtual Address)
-
客户机物理地址 GPA(Guest Physical Address)
-
宿主机虚拟地址 HVA(Host Virtual Address)
-
宿主机物理地址 HPA(Host Physical Address)
内存虚拟化就是要将客户机虚拟地址(GVA)转化为最终能够访问的宿主机上的物理地址(HPA)
1.3、I/O虚拟化
在虚拟化的架构下,虚拟机监控器必须支持来自客户机的 I/O 请求。通常情况下有以下4种I/O虚拟化方式:
-
设备模拟: 在虚拟机监控器中模拟一个传统的 I/O 设备的特性,比如网卡
-
前后端驱动接口: 在虚拟机监控器与客户机之间定义一种全新的适合于虚拟化环境的交互接口,比如常见的 virtio 协议就是在客户机中暴露为 virtio-net、virtio-blk 等网络和磁盘设备,在 QEMU 中实现相应的 virtio 后端驱动
-
设备直接分配: 将一个物理设备,如一个网卡或硬盘驱动器直接分配给客户机使用,这种情况下 I/O 请求的链路中很少需要或基本不需要虚拟机监控器的参与,所以性能很好
-
设备共享分配: 其实是设备直接分配方式的一个扩展。在这种模式下,一个物理设备可以支持多个虚拟机功能接口,可以将虚拟功能接口独立地分配给不同的客户机使用
设备直接分配在 Intel 平台上就是 VT-d(Virtualization Technology For Directed I/O)特性,一般在系统 BIOS 中可以看到相关的参数设置。Intel VT-d 为虚拟机监控器提供了几个重要的能力:I/O 设备分配、DMA 重定向、中断重定向、中断投递等
VT-d 只能将单个设备分配给一个客户机,为了克服这个缺点,设备共享分配硬件技术就应运而生,其中 SR-IOV(Single Root I/O Virtualization and Sharing)就是这样的一个标准。实现了 SR-IOV 规范的设备,有一个功能 完整的 PCI-e 设备成为物理功能(Physical Function,PF)。在使能了 SR-IOV 之后,PF 就会派生出若干个虚拟功能(Virtual Function,VF)。
1.4、intel虚拟化技术
Intel 硬件虚拟化技术大致分为如下3个类别:
-
VT-x 技术:是指 Intel 处理器中进行的一些虚拟化技术支持,包括 CPU 中引入的最基础的 VMX 技术,使得 KVM 等硬件虚拟化基础的出现成为可能。同时也包括内存虚拟化的硬件支持 EPT、VPID 等技术
-
VT-d 技术:是指 Intel 的芯片组的虚拟化技术支持,通过 Intel IOMMU 可以实现对设备直接分配的支持
-
VT-c 技术:是指 Intel 的 I/O 设备相关的虚拟化技术支持,主要包含两个技术:一个是借助虚拟机设备队列(VMDq)最大限度提高 I/O 吞吐率,VMDq 由 Intel 网卡中的专用硬件来完成;另一个是借助虚拟机直接互连(VMDc)大幅提升虚拟化性能,VMDc 主要就是基于 SR-IOV 标准将单个 Intel 网卡产生多个 VF 设备,用来直接分配给客户机
2、KVM架构概述
KVM 虚拟化的核心主要由以下两个模块组成:
-
KVM 内核模块: 它属于标准 Linux 内核的一部分,是一个专门提供虚拟化功能的模块,主要负责 CPU 和内存的虚拟化,包括:客户机的创建、虚拟内存的分配、CPU 执行模式的切换、vCPU 寄存器的访问、vCPU 的执行
-
QEMU 用户态工具: 它是一个普通的 Linux 进程,为客户机提供设备模拟的功能,包括模拟 BIOS、PCI / PCIE 总线、磁盘、网卡、显卡、声卡、键盘、鼠标等。同时它通过 ioctl 系统调用与内核态的 KVM 模块进行交互
KVM 是在硬件虚拟化支持下的完全虚拟化技术,所以它能支持在相应硬件上能运行的几乎所有的操作系统。在 KVM 虚拟化架构下,每个客户机就是一个 QEMU 进程,在一个宿主机上有多少个虚拟机就会有多少个 QEMU 进程;客户机中的每一个虚拟 CPU 对应 QEMU 进程中的一个执行线程;一个宿主机中只有一个 KVM 内核模块,所有客户机都与这个内核模块进行交互
图:KVM 虚拟化基础架构
3、KVM内核模块
KVM 内核模块是标准 Linux 内核的一部分,由于 KVM 的存在让 Linux 本身就变成了一个 Hypervisor,可以原生地支持虚拟化功能
KVM 模块是 KVM 虚拟化的核心模块,它在内核中由两部分组成:一个是处理器架构无关的部分,用 lsmod
命令中可以看到,叫作 kvm 模块;另一个是处理器架构相关的部分,在 Intel 平台上就 是kvm_intel 这个内核模块。KVM 的主要功能是初始化 CPU 硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚拟客户机的运行提供一定的支持
4、QEMU用户态设备模拟
QEMU 不是 KVM 虚拟化软件的一部分,QEMU 最初实现的虚拟机是一个纯软件的实现,通过二进制翻译来实现虚拟化客户机中的 CPU 指令模拟,所以性能比较低。但是,其优点是跨平台,其可以支持客户机与宿主机并不是 同一个架构(比如在 x86 平台上运行 ARM 客户机)。QEMU 的代码中有完整的虚拟机实现,包括处理器虚化、内存虚拟化,以及 KVM 也会用到的虚拟设备模拟(比如网卡、显卡、存储控制器和硬盘等)。QEMU 通过与 KVM 的密切结合,让虚拟化的性能提升得非常高,在真实的企业级虚拟化场景中发挥重要作用
从 QEMU 角度来看,也可以说 QEMU 使用了 KVM 模块的虚拟化功能,为自己的虚拟机提供硬件虚拟化的加速,从而极大地提高了虚拟机的性能。除此之外,虚拟机的配置和创建,虚拟机运行依赖的虚拟设备,虚拟机运行时的用户操作环境和交互,以及一些针对虚拟机的特殊技术(如:动态迁移),都是由 QEMU 自己实现的。QEMU 除了提供完全模拟的设备以外,还支持 virtio 协议的设备模拟
5、与QEMU/KVM结合的组件
-
vhost-net
vhost-net 是 Linux 内核中的一个模块,它用于替代 QEMU 中的 virtio-net 用户态的 virtio 网络的后端实现。使用 vhost-net 时,还支持网卡的多队列,整体来说会让网络性能得到较大提高
-
Open vSwitch
Open vSwitch 是一个高质量的、多层虚拟交换机,它的目的是让大规模网络自动化可以通过编程扩展,同时
仍然支持标准的管理接口和协议。在KVM虚拟化中,要实现软件定义网络(SDN),Open vSwitch 是一个非常好的开源选择
-
DPDK
DPDK 全称是 Data Plane Development Kit,最初是由 Intel 公司维护的数据平面开发工具集,为 Intel x86 处理器架构下用户空间高效的数据包处理提供库函数和驱动的支持,它专注于网络应用中数据包的高性能处理。在 KVM 架构中,为了达到非常高的网络处理能力,可以选择 DPDK 与 QEMU 中的 vhost-user 结合起来使用
-
SPDK
SPDK 全称是 Storage Performance Development Kit,它可为编写高性能、可扩展的、用户模式的存储程序提供一系列工具及开发库。在 KVM 中需要非常高的存储 I/O 性能时,可以将 QEMU 与 SPDK 结合使用
-
Ceph
Ceph 是 Linux 上一个著名的分布式存储系统,能够在维护 POSIX 兼容性的同时加入复制和容错功能
-
libguestfs
libguestfs 是用于访问和修改虚拟机的磁盘镜像的一组工具集合。libguestfs 提供了访问和编辑客户机中的文件、脚本化修改客户机中的信息、监控磁盘使用和空闲的统计信息、P2V、V2V、创建客户机、克隆客户机、备份磁盘内容、格式化磁盘、调整磁盘大小等非常丰富的功能。
libguestfs 不需要启动 KVM 客户机就可以对磁盘镜像进行管理,功能强大且非常灵活,是管理 KVM 磁盘镜像的首选工具
6、KVM上层管理工具
-
libvirt
libvirt 是使用最广泛的对 KVM 虚拟化进行管理的工具和应用程序接口。作为通用的虚拟化 API,libvirt 不但能管理 KVM,还能管理 VMware、Hyper-V、Xen、VirtualBox 等其他虚拟化方案
-
virsh
virsh 是一个常用的管理 KVM 虚拟化的命令行工具,对于系统管理员在单个宿主机上进行运维操作,virsh 命令行可能是最佳选择
-
virt-manager
virt-manager 是专门针对虚拟机的图形化管理软件,底层与虚拟化交互的部分仍然是调用 libvirt API 来操作的。virt-manager 除了提供虚拟机生命周期(包括:创建、启动、停止、打快照、动态迁移等)管理的基本功能,还提供性能和资源使用率的监控,同时内置了 VNC 和 SPICE 客户端,方便图形化连接到虚拟客户机中。在管理的机器数量规模较小时,virt-manager 是很好的选择,因其图形化操作的易用性,成为新手入门学习虚拟化操作的首选管理软件
-
OpenStack
OpenStack 是一个开源的基础架构即服务(IaaS)云计算管理平台,可用于构建共有云和私有云服务的基础设施。它不仅提供了管理虚拟机的丰富功能,还有非常多其他重要管理功能,如:对象存储、块存储、网络、镜像、身份验证、编排服务、控制面板等。OpenStack 仍然使用 libvirt API 来完成对底层虚拟化的管理