深信服超融合架构技术白皮书文档密级:内部
用硬件资源时需要经过:VM内核->Hypervisor->主机内核,导致性能是三种虚拟化技术中最差的。主机虚拟化技术代表是VMware Server(GSX)、Workstation和Microsoft Virtual PC、Virtual Server等。
由于主机型Hypervisor的效率问题,深信服的aSV采用了裸机型Hypervisor中的Linux KVM虚拟化,即为Type-I(裸金属型)。
KVM(Kenerl-based Virtual Machine)是基于linux内核虚拟化技术,自linux2.6.20之后就集成在linux的各个主要发行版本中。它使用linux自身的调度器进行管理,所以相对于xen,其核心源码很少。
KVM是基于硬件虚拟化扩展(Intel VT- X 和 AMD-V)和 QEMU 的修改版,KVM属于Linux kernel的一个模块,可以用命令modprobe去加载KVM模块。加载了该模块后,才能进一步通过工具创建虚拟机。但是仅有KVM模块是不够的。因为用户无法直接控制内核去做事情,还必须有一个运行在用户空间的工具才行。这个用户空间的工具,我们选择了已经成型的开源虚拟化软件QEMU。
QEMU也是一个虚拟化软件,它的特点是可虚拟不同的CPU,比如说在x86的CPU上可虚拟一个power的CPU,并可利用它编译出可运行在power上的CPU,并可利用它编译出可运行在power上的程序。KVM使用了QEMU的一部分,并稍加改造,就成了可控制KVM的用户空间工具了。这就是KVM和QEMU 的关系。如下图:
深信服超融合架构技术白皮书文档密级:内部
KVM 的实现模块有两个,分别是: kvm.ko是提供核心虚拟化的基础架构;特定于处理器的模块 kvm-intel.ko 和 kvm-amd.ko 。其设计目标是在需要引导多个未改动的 PC 操作系统时支持完整的硬件模拟。
一个普通的linux进程有两种运行模式:内核和用户。而KVM增加了第三种模式:客户模式(有自己的内核和用户模式)。在kvm模型中,每一个虚拟机都是由linux调度程序管理的标准进程。
总体来说,kvm由两个部分组成:一个是管理虚拟硬件的设备驱动,该驱动使用字符设备/dev/kvm作为管理接口;另一个是模拟PC硬件的用户空间组件,这是一个稍作修改的qemu进程。
同时,aSV采用KVM优势有:
? 嵌入到Linux正式Kernel(提高兼容性) ? 代码级资源调用(提高性能) ? 虚拟机就是一个进程(内存易于管理) ? 直接支持NUMA技术(提高扩展性) ? 保持开源发展模式(强大的社区支持)
1.2.1.2.2.2 Hypervisor虚拟化实现
VMM (Virtual Machine Monitor)对物理资源的虚拟可以划分为三个部分:CPU 虚拟化、内存虚拟化和 I/O 设备虚拟化,其中以 CPU 的虚拟化最为关键。
经典的虚拟化方法:现代计算机体系结构一般至少有两个特权级(即用户态和核心态,x86 有四个特权级Ring0~ Ring3)用来分隔系统软件和应用软件。那些只能在处
深信服超融合架构技术白皮书文档密级:内部
理器的最高特权级(内核态)执行的指令称之为特权指令,一般可读写系统关键资源的指令(即敏感指令)决大多数都是特权指令(X86 存在若干敏感指令是非特权指令的情况)。如果执行特权指令时处理器的状态不在内核态,通常会引发一个异常而交由系统软件来处理这个非法访问(陷入)。经典的虚拟化方法就是使用“特权解除”和“陷入-模拟”的方式,即将 GuestOS 运行在非特权级,而将 VMM 运行于最高特权级(完全控制系统资源)。解除了 GuestOS 的特权级后,Guest OS 的大部分指令仍可以在硬件上直接运行,只有执行到特权指令时,才会陷入到 VMM 模拟执行(陷入-模拟)。“陷入-模拟” 的本质是保证可能影响VMM 正确运行的指令由 VMM 模拟执行,大部分的非敏感指令还是照常运行。
因为 X86 指令集中有若干条指令是需要被 VMM 捕获的敏感指令,但是却不是特权指令(称为临界指令),因此“特权解除”并不能导致他们发生陷入模拟,执行它们不会发生自动的“陷入”而被 VMM 捕获,从而阻碍了指令的虚拟化,这也称之为X86 的虚拟化漏洞。
X86架构虚拟化的实现方式可分为:
1、X86“全虚拟化”(指所抽象的 VM 具有完全的物理机特性,OS 在其上运行不需要任何修改)Full 派秉承无需修改直接运行的理念,对“运行时监测,捕捉后模拟”的过程进行优化。该派内部之实现又有些差别,其中以 VMWare 为代表的基于二进制翻译 (BT) 的全虚拟化为代表, 其主要思想是在执行时将 VM 上执行的 Guest OS 指令,翻译成 x86 指令集的一个子集,其中的敏感指令被替换成陷入指令。翻译过程与指令执行交叉进行,不含敏感指令的用户态程序可以不经翻译直接执行。
2、X86“半虚拟化”(指需 OS 协助的虚拟化,在其上运行的 OS 需要修改) Para 派的基本思想是通过修改 Guest OS 的代码,将含有敏感指令的操作,替换为对
深信服超融合架构技术白皮书文档密级:内部
VMM的超调用 Hypercall,类似 OS 的系统调用,将控制权转移到 VMM,该技术因 VMM 项目而广为人知。该技术的优势在于 VM 的性能能接近于物理机,缺点在于需要修改 GuestOS(如:Windows 不支持修改)及增加的维护成本,关键修改 Guest OS 会导致操作系统对特定 hypervisor 的依赖性,因此很多虚拟化厂商基于 VMM 开发的虚拟化产品部分已经放弃了 Linux 半虚拟化,而专注基于硬件辅助的全虚拟化开发,来支持未经修改的操作系统。
3、X86“硬件辅助虚拟化”:
其基本思想就是引入新的处理器运行模式和新的指令,使得 VMM 和 Guest OS 运行于不同的模式下,Guest OS 运行于受控模式,原来的一些敏感指令在受控模式下全部会陷入 VMM,这样就解决了部分非特权的敏感指令的“陷入-模拟”难题,而且模式切换时上下文的保存恢复由硬件来完成,这样就大大提高了“陷入-模拟”时上下文切换的效率。
以 Intel VT-x 硬件辅助虚拟化技术为例,该技术增加了在虚拟状态下的两种处理器工作模式:根(Root)操作模式和非根(Non-root)操作模式。VMM 运作在 Root 操作模式下,而 Guest OS 运行在 Non-root 操作模式下。这两个操作模式分别拥有自己的特权级环,VMM 和虚拟机的 Guest OS 分别运行在这两个操作模式的 0 环。这样,既能使 VMM运行在 0 环,也能使 Guest OS 运行在 0 环,避免了修改 Guest OS。Root 操作模式和Non-root 操作模式的切换是通过新增的 CPU 指令(VMXON,VMXOFF 等)来完成。
硬件辅助虚拟化技术消除了操作系统的 ring 转换问题,降低了虚拟化门槛,支持任何操作系统的虚拟化而无须修改 OS 内核,得到了虚拟化软件厂商的支持。硬件辅助虚拟化技术已经逐渐消除软件虚拟化技术之间的差别,并成为未来的发展趋势。
深信服超融合架构技术白皮书文档密级:内部
1.2.1.2.2.2.1 vCPU 机制
vCPU 调度机制
对虚拟机来说,不直接感知物理 CPU,虚拟机的计算单元通过 vCPU 对象来呈现。虚拟机只看到 VMM 呈现给它的 vCPU。在 VMM 中,每个 vCPU 对应一个 VMCS(Virtual-MachineControl Structure)结构,当 vcpu 被从物理 CPU 上切换下来的时候,其运行上下文会被保存在其对应的 VMCS 结构中;当 vcpu 被切换到 pcpu 上运行时,其运行上下文会从对应的 VMCS 结构中导入到物理 CPU 上。通过这种方式,实现各 vCPU 之间的独立运行。
从虚拟机系统的结构与功能划分可以看出,客户操作系统与虚拟机监视器共同构成了虚拟机系统的两级调度框架,如图所示是一个多核环境下虚拟机系统的两级调度框架。客户操作系统负责第 2 级调度,即线程或进程在 vCPU 上的调度(将核心线程映射到相应的虚拟 CPU 上)。虚拟机监视器负责第 1 级调度, 即 vCPU 在物理处理单元上