-半虚拟、全虚拟和硬件辅助虚拟化
从1998年开始,VMware创造性的将虚拟化引入x86平台,通过二进制翻译(BT,Binary Translation)和直接执行的模式,让x86芯片可以同时运行不同的几种操作系统,并且确保性能、稳定性和安全性。 从那时起,数以万计的企业已经从虚拟化中获得了极大的收益。但是,关于虚拟化的几种实现方式,引起了很多误解,为此,希望通过此文澄清几种虚拟化道路的优缺点,以及VMware公司对几种虚拟化之路的支持情况。图1总结了x86虚拟化技术的进展情况,从VMware的BT最近的内核部分虚拟化和硬件辅助虚拟化。
1. x86虚拟化概览
所谓x86服务器的虚拟化,就是在硬件和操作系统之间引入了虚拟化层,如图2所示。 虚拟化层允许多个操作系统实例同时运行在一台物理服务器上,动态分区和共享所有可用的物理资源,包括:CPU、内存、存储和I/O设备。
图2. x86架构上的虚拟化层
近年来,随着服务器和台式机的计算能力急剧增加,虚拟化技术应用广泛普及,很多用户已经在开发/测试、服务器整合、数据中心优化和业务连续性方面证实了虚拟化的效用。虚拟架构已经可以将操作系统和应用从硬件上分离出来,打包成独立的、可移动的虚拟机,从来带来了极大的灵活性。例如:现在可以通过虚拟架构,让服务器7x24x365运行,避免因为备份或服务器维护而带来的停机。已经有用户在VMware平台上运行3年而没有发生任何的停机事件。
对于x86虚拟化,有两种常见的架构:寄居架构和裸金属架构。寄居架构将虚拟化层运行在操作系统之上,当作一个应用来运行,对硬件的支持很广泛。相对的,裸金属架构直接将虚拟化层运行在x86的硬件系统上,可以直接访问硬件资源,无需通过操作系统来实现硬件访问,因此效率更高。VMware Player、ACE、Workstation和VMware Server都是基于寄居架构而实现的,而VMware ESX Server是业界第一个裸金属架构的虚拟化产品,目前已经发布了第四代产品。ESX Server需要运行在VMware认证的硬件平台上,可以提供出色的性能,完全可以满足大型数据中心对性能的要求。
为了更好的理解x86平台虚拟化,在此简要介绍一下部件虚拟化的背景。虚拟化层是运行在虚拟机监控器(VMM,Virtual Machine Monitor)上面、负责管理所有虚拟机的软件。如图3所示,虚拟化层就是hypervisor直接运行在硬件上,因此,hypervisor的功能极大地取决于虚拟化架构和实现。运行在hypervisor上的每个VMM进行了硬件抽取,负责运行传统的操作系统。每个VMM必须进行分区和CPU、内存和I/O设备的共享,从而实现系统的虚拟化。
3. Hypervisor通过VMM管理虚拟机
2. CPU虚拟化
根据原来的设计,x86上的操作系统需要直接运行在裸机上,因此默认拥有和控制所有的硬件。如图4所示,x86架构提供了四种特权级别Ring 0、1、2和3,通过这四种级别来控制和管理对硬件的访问。通常,用户级的应用一般运行在Ring 3级别,操作系统需要直接访问内存和硬件,需要在Ring 0执行它的特权指令。为了虚拟x86架构,需要在操作系统下面运行虚拟化层,由虚拟化层来创建和管理虚拟机,进行共享资源分配。而有些敏感指令不能很好的进行虚拟化,它们在Ring 0以外级别执行时,会出现不同的结果。如何在运行时捕获和翻译这些敏感指令成为x86虚拟化的一大挑战,使得x86架构虚拟化最初是不可能的。
图4. x86架构虚拟化前的特权级别
VMware在1998年成功克服了这个难点,开发出了BT技术,从而将操作系统移到Ring 3的用户模式运行,而VMM运行在Ring 0级别实现隔离和性能提升。尽管VMware通过BT技术实现的全虚拟化已经成为默认的业界标准,超过2万家的VMware用户都在这种技术的支持下可靠、高效运行,但整个业界还没有统一定义的行业标准,因此每家公司都在自由发挥,来试图解决这个技术难点,不同的方案都有自己的优势和劣势。
到今天为止,有三种典型的技术来解决x86虚拟化的难题:
通过BT实现的全虚拟化
操作系统帮助下的虚拟化,也叫半虚拟化
硬件帮助的虚拟化
a. 技术1 – 通过BT实现的全虚拟化
VMware可以通过BT和直接执行技术的结合来实现任何x86操作系统的虚拟化。如图5所示,BT可以翻译核心指令来代替那些不能虚拟化的指令,通过翻译后的指令直接访问虚拟硬件。同时,所有用户级指令还是可以直接在CPU上执行来确保虚拟化的性能。每个VMM为每个虚拟机提供完整的硬件支持服务,包括虚拟BIOS、虚拟设备和虚拟内存管理。
图5. BT实现x86架构虚拟化
BT和直接执行技术的结合实现了全虚拟化,此时客户操作系统可以通过虚拟化层从物理硬件上完全抽取出来,客户操作系统感知不到是否发生了虚拟化,完全不需要进行修改。全虚拟化是迄今为止唯一不需要硬件或操作系统协助来进行敏感和特权指令虚拟化的技术,Hypervisor可以翻译所有的操作系统特权指令,并保存在缓存里备用,而用户级的指令完全可以全速直接执行。
全虚拟化提供了最好的虚拟机隔离和安全性,简化了客户操作系统迁移和移植能力。VMware ESX Server就是通过全虚拟化技术来实现的最好案例。
b. 技术2 – 半虚拟化
该文中我们将Para-Virtualization翻译为半虚拟化。Para是来自希腊语的英语前缀,意指“和”、“在边上”、“一道”等。因此,“半虚拟化”指得是客户操作系统和hypervisor之间的通讯如何提高性能和有效性。如图6所示,半虚拟化需要修改操作系统内核,替换掉不能虚拟化的指令,通过超级调用(hypercall)直接和底层的虚拟化层hypervisor来通讯,hypervisor同时也提供了超级调用接口来满足其他关键内核操作,比如内存管理、中断和时间保持。
图6. 操作系统协助的x86架构虚拟化
半虚拟化和全虚拟化不同,全虚拟化不需要修改上面的操作系统,敏感的操作系统指令直接通过BT进行处理。半虚拟化的价值在于降低了虚拟化的损耗,但是半虚拟化的性能优势很大程度上依赖于运行的负载。由于半虚拟化不支持未修改的操作系统(例如: Windows 2000/XP),它的兼容性和可移植性差。在实际的生产环境中,半虚拟化也会导致操作系统支持和维护的艰难,因为半虚拟化往往要深入修改操作系统内核。开源的Xen项目是半虚拟化的代表,它可以通过修改Linux的内核来实现CPU和内存的虚拟化,通过定制的操作系统驱动来实现I/O的虚拟化。
为了实现全虚拟化,需要构建复杂的BT技术,这往往比直接修改客户操作系统来启用半虚拟化更艰难。VMware实际上已经在产品中使用了半虚拟化的一些技术,来构建VMware Tools和优化虚拟设备驱动。VMware tools服务为VMM Hypervisor提供了 一个后门服务,用来同步时间、记录日志和客户操作系统关机等。Vmxnet是半虚拟化的I/O设备驱动程序,它可以和hypervisor共享数据结构。这些半虚拟化技术的应用改善了设备的兼容能力,提高了数据吞吐速率,降低了CPU利用率。需要重点澄清的是:VMware tools 服务和vmxnet设备驱动并不是CPU半虚拟化解决方案,它们紧紧对客户操作系统进行了微小的、非关键的修改,并不需要修改客户操作系统内核。
面向未来,VMware也在帮助开发虚拟化版的Linux来支持半虚拟化技术的进步,更进一步的细节,我们将在后面进行探讨。
c. 技术3 – 硬件辅助虚拟化
硬件厂商面对虚拟化都相当热情,他们都投入了大量的精力来开发新的特性来简化虚拟化技术的应用。第一代的虚拟化增强包括Intel Virtualization Technology (VT-x)和AMD的AMD-V,这两种技术都为CPU增加了新的执行模式root模式,可以让VMM运行在root模式下,而root模式位于Ring 0的下面。如图7所示,特权和敏感指令自动在hypervisor上执行,从而无需BT或半虚拟化技术。客户操作系统的状态保存在VT-x(Virtual Machine Control Structure,虚拟机控制结构)中或AMD-v(Virtual Machine Control Block,虚拟机控制块)。支持Intel VT和AMD-V的CPU从2006年开始推向市场,因此只有新的系统包含了这些硬件辅助的虚拟化功能。
图7.硬件辅助的x86架构虚拟化
由于hypervisor到客户操作系统转换的损耗和严格的编程模式要求,第一代的硬件辅助虚拟化性能并不理想,VMware的BT技术很多时候性能更好。第一代硬件辅助虚拟化为编程留了很小的空间,降低了软件的灵活性,增加了hypervisor到客户操作系统转换的损耗,正式基于此,VMware仅仅在很少的情况下利用了第一代的硬件辅助虚拟化,比如,在Intel平台上支持64位操作系统的时候,VMware使用了Intel的VT-x。
3. 内存虚拟化
除了CPU虚拟化,下一个关键是内存虚拟化,通过内存虚拟化共享物理系统内存,动态分配给虚拟机。虚拟机的内存虚拟化很象现在的操作系统支持的虚拟内存方式,应用程序看到邻近的内存地址空间,这个地址空间无需和下面的物理机器内存直接对应,操作系统保持着虚拟页到物理页的映射。现在所有的x86 CPU都包括了一个称为内存管理的模块MMU(Memory Management Unit)和TLB(Translation Lookaside Buffer),通过MMU和TLB来优化虚拟内存的性能。
图8. 内存虚拟化 为了在一台机器上运行多个虚拟机,需要增加一个新的内存虚拟化层,也就是说,必须虚拟MMU来支持客户操作系统。客户操作系统继续控制虚拟地址到客户内存物理地址的映射,但是客户操作系统不能直接访问实际机器内存。VMM负责映射客户物理内存到实际机器内存,它通过影子页表来加速映射。如图8所示,VMM使用TLB硬件来映射虚拟内存直接到机器内存,从而避免了每次访问进行两次翻译。当客户操作系统更改了虚拟内存到物理内存的映射表,VMM也会更新影子页表来启动直接查询。MMU虚拟化引入了虚拟化损耗,第二代的硬件辅助虚拟化将支持内存的虚拟化辅助,从而大大降低因此而带来的虚拟化损耗,让内存虚拟化更高效。 4. 设备和I/O虚拟化 最后一个模块是设备和I/O虚拟化,也就是如何管理和路由物理设备和虚拟设备之间的I/O请求。 图9. 设备和I/O虚拟化 基于软件的I/O虚拟化和管理为设备管理带来了新的特性和功能,让设备的管理更容易。就拿网络为例,通过虚拟网卡和交换机可以在一台物理机上不同虚拟机之间建立虚拟网络,而这不会在物理网络上产生任何的流量;网卡teaming允许多个物理网卡绑定成一个虚拟机网卡,提供了很好的容错能力,同时保持了同一MAC地址。I/O虚拟化的关键是保持虚拟化优势的同时,尽量降低虚拟化给CPU造成的负担。 Hypervisor虚拟化物理硬件,为每台虚拟机提供一套标准的虚拟设备,如图9所示。这些虚拟设备高效模拟常见的物理硬件,将虚拟机的请求发送到物理硬件。该硬件标准化的过程也让虚拟机标准化,让虚拟机更容易在各种平台上自由移动,而无需关心下面实际的物理硬件类型。 5. 目前几种x86虚拟化技术对比总结 VMware目前利用了以上三种的虚拟化技术,或者用在生产上,或者用在开发实验室,在性能和功能之间找到平衡。下表是三种虚拟路线的总结比较,可以看到它们的优劣,从而可以取长补短,对三种虚拟化路线进行科学选择。 利用BT的全虚拟化 硬件辅助虚拟化 操作系统协助/半虚拟化 实现技术 BT和直接执行 遇到特权指令转到root模式执行 Hypercall 客户操作系统修改/兼容性 无需修改客户操作系统,最佳兼容性 无需修改客户操作系统,最佳兼容性 客户操作系统需要修改来支持hypercall,因此它不能运行在物理硬件本身或其他的hypervisor,兼容性差,不支持Windows 性能 好 一般 某些情况下好 应用厂商 VMware/Microsoft/ VMware/Microsoft/ VMware/Xen 客户操作系统独立于hypervisor? 是 是 XenLinux只能运行在Xen的hypervisor上
目前很多情况下比BT性能差,随着时间推移会逐步改善
Parallels
Parallels/Xen
VMI-Linux可以支持各种hypervisor