OpenStack设计与实现(第3版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.1 概述

对于虚拟化,每个人都可能会有自己的认识。但其实所谓的虚拟化已经存在了40多年的时间。比如,在计算机发展的“上古时代”,有一段时间开发者会担心是否有足够的可用内存来存放自己的程序指令和数据,于是在操作系统里引入了虚拟内存的概念,即为了满足应用程序对操作系统的需求,对内存进行的虚拟和扩展。

再比如,因为购买大型机系统的价格十分昂贵,系统管理员又不希望各部门的用户独占资源,所以出现了所谓的虚拟服务器,能够让用户更好地分时段共享(Time-sharing)昂贵的大型机系统。

当然,虚拟化的内涵远远不止虚拟内存和虚拟服务器这么简单。如果我们在一个更广泛的环境中,或者从更高级的抽象中,如任务负载虚拟化和信息虚拟化,来思考虚拟化,虚拟化就变成了一个非常强大的概念,可以为最终用户、上层应用和企业带来很多好处。

现代计算机系统是一个庞大的整体,整个系统的复杂性是不言而喻的。因此,计算机系统自下而上地被分成了多个层次,如图3-1所示,该图展现了一种常见的计算机系统层次结构。

img

图3-1 计算机系统层次结构

每个层次都向上一层次呈现一个抽象,并且每个层次只需要知道下一层次抽象的接口,并不需要了解其内部运作机制。比如,操作系统所看到的硬件是一个硬件抽象层,它并不需要理解硬件的布线或电气特性。

这种层次抽象的好处是,每个层次只需要考虑本层的设计,以及与相邻层次间的交互接口,从而大大降低了系统设计的复杂性,提高了软件的可移植性。从另一个方面来说,这样的设计还给下一层次的软件模块为上一层次的软件模块创造“虚拟世界”提供了条件。

本质上,虚拟化就是由位于下一层次的软件模块,根据上一层次的软件模块的期待,抽象出一个虚拟的软件或硬件接口,使上一层次的软件模块可以直接运行在与自己所期待的运行环境完全一致的虚拟环境上。

虚拟化可以发生在如图3-1所示的各个层次上,不同层次的虚拟化会带来不同的虚拟化概念。在学术界和工业界,也先后出现了形形色色的虚拟化概念,这也是我们前面为什么会说“对于虚拟化,每个人都可能会有自己的认识”。有人认为虚拟内存和虚拟服务器都是虚拟化,有人认为硬件抽象层上的虚拟化是一种虚拟化,也有人认为类似Java虚拟机这种软件是一种虚拟化。

对于云计算而言,特别是提供“基础架构即服务”的云计算,更关心的是硬件抽象层上的虚拟化。因为,只有把物理计算机系统虚拟化为多台虚拟计算机系统,并通过网络将这些虚拟计算机系统互联互通,才能够形成现代意义上的“基础架构即服务”的云计算系统。

如图3-2所示,硬件抽象层上的虚拟化是指通过虚拟硬件抽象层来实现虚拟机,为客户机操作系统呈现与物理硬件相同或相近的硬件抽象层。由于客户机操作系统所能看到的只是硬件抽象层,因此客户机操作系统的行为和其在物理平台上的行为并没有什么区别。

img

图3-2 硬件抽象层上的虚拟化

这种硬件抽象层上的虚拟化又被称为系统虚拟化,即将一台物理计算机系统虚拟化为一台或多台虚拟计算机系统。每台虚拟计算机系统(简称为虚拟机,也就是上面所称的客户机)都拥有自己的虚拟硬件,如CPU、内存和设备等,并提供一个独立的虚拟机执行环境。通过虚拟机监控器(Virtual Machine Monitor,简称为VMM,也可以称为Hypervisor)的模拟,虚拟机中的操作系统(Guest OS,客户机操作系统)会认为自己仍然是独占一个系统来运行的。在一台物理计算机上运行的每台虚拟机中的操作系统可以是完全不同的,并且它们的执行环境是完全独立的。

3.1.1 虚拟化的实现方式

按照实现方式,当前主流的虚拟化可以分为以下两种。

· VMM直接运行在硬件平台上,控制所有硬件并管理客户机操作系统。客户机操作系统运行在比VMM更高级别的硬件平台上。这个模型也是虚拟化历史里的经典模型,很多著名虚拟机都是根据这个模型来实现的,如Xen。

· VMM运行在一个传统的操作系统里(第一软件层),可以被看作第二软件层,而客户机操作系统则是第三软件层。KVM和VirtualBox就采用这种实现方式。

虚拟化的两种实现方式的具体区别如图3-3所示。

img

图3-3 虚拟化的两种实现方式的具体区别

按照VMM所提供的虚拟平台类型又可以将VMM分为两类。

1.完全虚拟化(Full Virtualization)

VMM虚拟的是现实中存在的平台,并且在客户机操作系统看来,虚拟平台和现实平台是一样的,客户机操作系统感觉不到自己运行在一个虚拟平台上,现有的操作系统无须进行任何修改就可以运行在这样的虚拟平台上,因此这种方式被称为完全虚拟化。

在完全虚拟化中,VMM需要正确处理客户机操作系统所有可能的行为,或者说正确处理所有可能的指令,因为客户机操作系统会像正常的操作系统一样去操作虚拟处理器、虚拟内存和虚拟外设。从实现方式来说,完全虚拟化经历了两个阶段:软件辅助的完全虚拟化与硬件辅助的完全虚拟化。

在x86虚拟化技术的早期,x86体系并没有在硬件层次上对虚拟化提供支持,因此完全虚拟化只能通过软件实现。一种典型的做法是优先级压缩(Ring Compression)和二进制代码翻译(Binary Translation)相结合。

优先级压缩的原理是:将VMM和客户机的优先级放到同一个CPU中运行,对应于x86架构,通常是VMM在Ring 0,客户机操作系统内核在Ring 1,客户机操作系统应用程序在Ring 3。当客户机操作系统的内核执行特权指令时,由于VMM处在非特权的Ring 1,这些特权指令通常会触发异常,VMM在截获后就可以进行特权指令的虚拟化。但是x86指令体系在设计之初并没有考虑到虚拟化,一小部分特权指令在Ring 1中并没有触发异常,VMM也就不能截获这些特权指令来进行虚拟化。所以这些特权指令不能通过优先级压缩来进行虚拟化。

因此,二进制代码翻译被引入,用来处理这些虚拟化不友好的指令,即通过扫描并修改客户机的二进制代码,将难以虚拟化的指令转化为支持虚拟化的指令。VMM通常会对操作系统的二进制代码进行扫描,一旦发现虚拟化不友好的指令,就将其替换成支持虚拟化的指令块(Cache Block)。这些指令块可以与VMM合作访问受限的虚拟资源,或者显式地触发异常,让VMM进一步处理。

虽然优先级压缩和二进制代码翻译能够实现完全虚拟化,但是这种打补丁的方式很难在架构上保证其完整性。因此,x86厂商在硬件上加入了对虚拟化的支持,从而在硬件架构上实现了虚拟化。

对于很多问题而言,如果在本身的层次上难以解决,就可以增加一个层次,使其在下面一个层次变得容易解决。硬件辅助的完全虚拟化就是这样一种方式,既然操作系统已经是硬件之上的底层系统软件,则如果在硬件本身加入足够的虚拟化功能,就可以截获操作系统对敏感指令的执行或者对敏感资源的访问,从而通过异常的方式报告给VMM,这样就解决了虚拟化的问题。

英特尔的VTx技术是这一方式的代表。VTx技术在处理器上引入了一个新的执行模式用于运行虚拟机。当虚拟机运行在这个特殊模式下时,它仍然面对一套完整的处理器、寄存器和执行环境,只是任何特权操作都会被处理器截获并报告给VMM。而VMM本身运行在正常模式下,在接收到处理器的报告后,就会通过对目标指令的解码,找到相应的虚拟化模块进行模拟,并把最终的效果反映在特殊模式的环境中。

硬件辅助的虚拟化是一种完备的虚拟化方式,因为内存和外设的访问本身是由指令来承载的,对处理器指令级别的截获就意味着VMM可以模拟一个与真实主机完全一样的环境。在这个环境中,任何操作系统只要可以在现实中的等同主机上运行,就可以在这个虚拟机环境中运行。

2.类虚拟化(Para-Virtualization)

第二类VMM虚拟出的平台是现实中不存在的,是经过VMM重新定义的。这样的虚拟平台需要对所运行的客户机操作系统进行或多或少的修改,使之适应虚拟环境,客户机操作系统知道自己运行在虚拟平台上,并且会主动适应。这种方式被称为类虚拟化。

类虚拟化通过在源码级别修改指令,以回避虚拟化漏洞的方式使VMM能够对物理资源实现虚拟化。对于x86中难以虚拟化的指令,完全虚拟化通过Binary Translation在二进制代码级别上避免虚拟化漏洞,类虚拟化采取的是另一种思路,即修改操作系统内核的代码,使得操作系统内核完全避免这些难以虚拟化的指令。既然内核代码已经需要修改,类虚拟化就可以进一步优化I/O。也就是说,类虚拟化不会去模拟真实世界中的设备,因为太多的寄存器模拟会降低性能。相反,类虚拟化可以自定义高度优化的I/O协议。这种I/O协议完全基于事务,可以达到近似于物理机的性能。

3.1.2 虚拟化的现状和未来

虚拟化自20世纪60年代诞生以来,一直飞速发展。尤其是近年来,IT管理技术和云计算的大规模应用对虚拟化提出了更高的要求,也促使硬件厂商、软件提供商使用更新的技术来提高虚拟化的安全、性能,从而产生了更多的应用场景。

1.虚拟化技术的发展

虚拟化中的核心技术,如CPU虚拟化、内存虚拟化、I/O虚拟化和网络虚拟化都经历了前面所提到的革新:由基于软件的虚拟化全面转向硬件辅助虚拟化。

1)CPU虚拟化

早先的CPU虚拟化由于硬件的限制,必须将客户机操作系统中的特权指令替换成可以嵌入VMM的指令,从而让VMM接管并进行相应的模拟工作,最后返回到客户机操作系统中。这种做法性能差,工作量大,容易引起Bug。英特尔的VTx技术对现有的CPU进行了扩展,引入了特权级别和非特权级别,从而极大地简化了VMM的实现。

2)内存虚拟化

内存虚拟化的目的是给客户机操作系统提供一个从零开始的、连续的物理内存空间,并且在各个虚拟机之间进行有效的隔离。

客户机物理地址空间并不是真正的物理地址空间,它和宿主机的物理地址空间还有一层映射关系。内存虚拟化需要通过两次地址转换来实现,即GVA(Guest Virtual Address,客户机虚拟地址)到GPA(Guest Physical Address,客户机物理地址)再到HPA(Host Physical Address,宿主机物理地址)的转换。

其中,GVA到GPA的转换是由客户机软件决定的,通常由客户机看到的CR3指向的页表来指定;GPA到HPA的转换则是由VMM决定的。VMM在将物理内存分配给客户机时就确定了GPA到HPA的转换,并将这个映射关系记录到内部数据结构中。

原有的x86架构只支持一次地址转换,即通过CR3指定的页表来实现客户机虚拟地址到客户机物理地址的转换,这无法满足虚拟化对两次地址转换的要求。因此原先的内存虚拟化就必须将两次转换合并为一次转换来解决这个问题,即VMM根据GVA到GPA再到HPA的映射关系,得到GVA到HPA的映射关系,并将其写入所谓的“影子页表”(Shadow Page Table)。尽管影子页表实现了传统的内存虚拟化,但是其实现非常复杂,内存开销很大,性能也会受到影响。

为了解决影子页表的局限性,英特尔的VTx技术提供了EPT(Extended Page Table)技术,直接在硬件上支持GVA/GPA/HPA的两次地址转换,大大降低了内存虚拟化的难度,提高了相关性能。此外,为了进一步提高TLB的使用效率,VTx技术还引入了VPID(Virtual Processor ID)技术,进一步优化了内存虚拟化的性能。

3)I/O虚拟化

传统的I/O虚拟化方法主要有“设备模拟”和“类虚拟化”。前者通用性强,但性能不理想;后者性能不错,但缺乏通用性。如果要兼顾通用性和高性能,最好的方法就是让客户机直接使用真实的硬件设备。这样客户机的I/O操作路径几乎和没有虚拟机的环境下的相同,从而可以获得几乎相同的性能。因为这些是真实存在的设备,客户机可以使用自带的驱动程序去发现并使用它们,通用性的问题也就得以解决。但是客户机直接操作硬件设备需要解决以下两个问题。

· 如何让客户机直接访问设备真实的I/O地址空间(包括I/O端口和MMIO)。

· 如何让设备的DMA操作直接访问客户机的内存空间。因为无论当前运行的是虚拟机还是真实操作系统,设备都会用驱动提供给它的物理地址进行DMA操作。

VTx技术已经解决了第一个问题,允许客户机直接访问物理的I/O空间。英特尔的VTd技术则解决了第二个问题,它提供了DMA重映射(Remapping)技术,以帮助VMM的实现者达到目的。

VTd技术通过在北桥引入DMA重映射硬件来提供设备重映射和设备直接分配的功能。在启用VTd技术的平台上,设备的所有DMA传输都会被DMA重映射硬件截获,然后根据设备对应的I/O页表,对DMA中的地址进行转换,使设备只能访问限定的内存。这样,设备就可以被直接分配给客户机使用,并且驱动提供给设备的GPA经过重映射会变为HPA,使得DMA操作可以顺利完成。

4)网络虚拟化

早期的网络虚拟化都是通过重新配置宿主机的网络拓扑结构来实现的,比如,将宿主机的网络接口和代表客户机的网络接口配置在一个桥接(Bridge)下面,可以使客户机拥有独立的MAC地址,并且在网络中就像一个真正的物理机一样。但是这种方法增加了宿主机网络驱动的负担,降低了系统性能。

VTd技术可以将一个网卡直接分配给客户机使用,从而达到和物理机一样的性能。但是它的可扩展性比较差,因为一个物理网卡只能被分配给一个客户机,而且服务器能够支持的PCI设备数是有限的,远远不能满足越来越多的客户机数量。因此,SRIOV(Single Root I/O Virtualization)被引入,用来解决上述问题。

SRIOV是PCIe(PCI Express)规范的一个扩展,定义了本质上可以共享的新型设备。它允许一个PCIe设备,通常是网卡,可以为每个与其连接的客户机复制一份资源(如内存空间,中断和DMA数据流),使得数据处理可以不再依赖VMM。SRIOV定义了以下两种Function的类别。

· PF(Physical Function):完整的PCIe Function,定义了SRIOV的能力,用于配置和管理SRIOV。

· VF(Virtual Function):轻量级的PCIe Function,只包括了进行数据处理(Data Movement)的必要资源,会与PF或其他VF共享另外的物理资源,可以被看作设备的一个虚拟化实例。

在虚拟化的环境下,一个VF会被当作一个虚拟网卡分配给客户机操作系统,所有的VF和PF会被连接在SRIOV网卡内部的一个桥接(Bridge)中,这样各个VF的通信可以互不干扰,网络数据流也绕开了原先的VMM中的软件交换机实现,并且直接在VF和客户机操作系统间传递。因此,这种方式消除了原来的软件模拟层,达到了几乎和非虚拟化环境一样的网络性能。具体的使用可以参考如图3-4所示的VTd实现。

img

图3-4 VTd实现

5)GPU虚拟化

GPU虚拟化的常用方法如图3-5所示。

img

图3-5 GPU虚拟化的常用方法

设备模拟(Device Emulation)是最传统的方法,QEMU就是典型代表。它模拟了一个比较简单的VGA设备模型,可以截获客户机操作系统对VGA设备的操作,然后利用宿主机上的图形库绘制最终的显示结果。即使绘制最简单的图形,也要经过多次客户机、宿主机间的通信,而且没有硬件帮助进行加速,所以性能很差。

分离驱动模型(Split Driver Model)类似于前面提到的“类虚拟化”驱动,只是它工作在API的层面。前端驱动(Front End Driver)将客户机操作系统的DirectX/OpenGL调用转发到宿主机的后端驱动(Back End Driver)。后端驱动就像一个在宿主机上运行的3D程序一样,可以进行绘制工作。这种方法可以利用宿主机的DirectX/OpenGL实现硬件加速,但是只能针对特定的API加速,对宿主机、客户机和运行其中的3D程序会有各种限制。

直接分配(Direct Pass-Through)基于前面提到的VTd或SRIOV等技术,直接将一个硬件分配给客户机操作系统使用。VTd技术可以将整个PCI显卡分配给客户机使用,性能很好,但是可扩展性较差。SRIOV标准使得PCI设备在本质上可以在各个客户机之间共享,但是由于显示硬件过于复杂,众多厂商不愿意在显卡中实现SRIOV的扩展。

中介分配(Mediated Pass-Through)是对直接分配的一种改进形式,允许每台虚拟机访问部分的显示设备资源,而无须经过VMM的任何干涉。但对于特权操作,需要引入新的软件模块作为中介(Mediator)来进行相关模拟工作。中介分配保留了直接分配的高性能,并且避免了SRIOV实现的硬件复杂性,是一种比较成熟的解决方案。英特尔的GVT-g(Graphics Virtualization Technology)就是这种方法的典型代表。

(1)Intel XenGT。

XenGT是由Intel GVT-g的Xen实现的,架构如图3-6所示。

img

图3-6 XenGT架构

客户机操作系统不需要进行任何改动,原有的图形驱动就可以直接工作,并且达到很好的性能。对于部分关乎性能的重要资源,客户机可以不经过VMM而直接访问。但特权操作会被Xen截获,并且转发到中介(Mediator)。中介会为每台客户机创建一个虚拟的GPU上下文(Context),并在其中模拟特权操作。当VM发生切换时,中介也会切换GPU上下文。XenGT会将中介的实现放在Dom0中,这样就可以避免在VMM里面增加复杂的设备逻辑,从而减轻了发布时的工作量。

目前XenGT已经开始了对Xen的集成,相信在不久的将来,Xen的用户就可以享受到使用一台客户机进行3D运算,使用另一台客户机运行3D游戏的乐趣。

(2)Intel KVMGT。

KVMGT是由Intel GVT-g的KVM实现的,KVMGT只支持英特尔的GPU,并且从Haswell就开始支持,其架构如图3-7所示。

img

图3-7 KVMGT架构

2.虚拟化引入的新特性

1)动态迁移

动态迁移是虚拟化的新特性,它将一台虚拟机从一台物理机快速迁移到另一台物理机,但是虚拟机里面的程序和网络都会保持连接。从用户的角度来看,动态迁移对虚拟机的可用性没有任何影响,不会令用户察觉任何的服务中断,如图3-8所示。

img

图3-8 动态迁移

动态迁移的最大好处就是提高服务器的可维护性。当用户察觉到即将发生硬件故障时,可以把虚拟机动态迁移到其他机器,从而避免服务中断。另外,动态迁移也可以用于负载均衡。比如,当各个服务器之间的CPU利用率差别过大时,或者当用户访问量较少时,可以将所有的虚拟机通过动态迁移集中到几个服务器上,然后把其他服务器关掉以节省电力。

动态迁移的实现方法是在目的服务器上建立一台同样配置的新虚拟机,然后不断地在两台虚拟机之间同步各种内部状态,如内存、外设、CPU等。在状态同步完成后,关掉旧的虚拟机,启动新的虚拟机。

实现的难度在于内存的同步:一是因为内存很大,不可能在可以接受的宕机时间内迅速同步到目的虚拟机,必须迭代进行;二是因为在每次迭代过程中,客户机操作系统又会写内存,造成新的“脏页”,需要重新同步。因此需要一个方法来确定“脏页”,并以最高效的迭代算法同步到目的虚拟机。

常见的虚拟机实现都会提供一个Log Dirty机制,用来记录哪些内存页被写过。每次迭代都会查看上次到现在所产生的“脏页”,并跳过它们,留到下次迭代再传送。在通常情况下,这是一个收敛的过程,“脏页”会越来越少,当达到一定的标准,比如,“脏页”占据的内存空间小于总内存空间的1%,迭代次数已经超过多少次或者迁移的时间已经太久等,就会暂停虚拟机,然后把剩余的“脏页”和虚拟机的其他状态一起传送到目的虚拟机。

如果动态迁移的虚拟机拥有VTd设备,则迁移不可能成功。这是因为不能保证目的物理机也有完全一样的设备。即使有这样的设备,也不能保证可以完整地保存、恢复设备状态,从而在两台设备之间做到完美的同步。针对VTd的网卡,英特尔利用OS内部的Bonding Driver和Hotplug机制,提供了一套软件的解决方案。

Bonding Driver可以将多个网卡绑定成一个网络接口,提供一些高级功能,如热备份,当一个网卡失效,网络接口可以自动切换到另一个,从而保证网络连接的通畅。VTd网卡的动态迁移,就是事先在客户机操作系统中将VTd网卡绑定在一个热备份的Bonding接口下,并且使用一个虚拟网卡作为热备份。在迁移前,通过一个hot remove(热插拔)的操作将VTd网卡移除,使Bonding接口自动切换到虚拟网卡,就可以进行动态迁移了。在迁移成功后,再hot add(热添加)一个VTd的网卡到目的虚拟机中,并将其加入Bonding接口中作为默认的网卡。这样就巧妙地实现了VTd网卡的动态迁移。

2)虚拟机快照(Snapshot)

虚拟机快照,即在某一时刻把虚拟机的状态像照片一样保存下来。通常快照需要保存所有的硬盘信息、内存信息和CPU信息。虚拟机快照可以便捷地产生一套同样的虚拟机环境,因此被广泛地应用于测试、备份和安全等各种场景。

3)虚拟机克隆

虚拟机克隆,即把一台虚拟机的状态完全不变地复制到另一台虚拟机中,形成两个完全相同的系统,并且它们可以同时运行。为了达到同时运行的目的,新虚拟机的某些配置,如MAC地址,可能需要改动以避免和旧虚拟机的冲突。

如今的数据中心都由数以万计的机器组成,所以部署工作需要耗费大量的时间和精力。有了虚拟机克隆技术,则只需要先安装、配置好一台虚拟机,然后将其克隆到其他数以万计的虚拟机中即可,大大减少了整个数据中心的安装和配置时间。

4)P2V(Physical to Virtual Machine)

P2V,即将一个物理服务器的操作系统、应用程序和数据从物理硬盘迁移到一台虚拟机的硬盘镜像中。P2V技术极大地降低了服务器虚拟化的使用门槛,使得用户可以方便地将现有的物理机转化成虚拟机,从而使用各种虚拟机相关技术进行管理。

3.典型的虚拟化产品

虚拟化经过多年的发展,已经出现了很多成熟的产品,其应用也从最初的服务器扩展到了桌面等更为广泛的领域。下面介绍几种典型的虚拟化产品及其特点。

1)VMware

VMware是x86虚拟化软件的主流厂商之一,成立于1998年,并于2003年被EMC收购。VMware提供了一系列的虚拟化产品,从服务器到桌面,可以运行于包括Windows、Linux和macOS在内的各种平台。近年来,VMware的产品线延伸到数据中心和云计算等方面,形成了各个层次、各个领域的全覆盖。VMware的虚拟化产品主要包括以下几种。

· VMware ESX Server:VMware的旗舰产品,基于Hypervisor模型(类型1 VMM),直接运行在物理硬件上,无须操作系统,在性能和安全方面得到了全面的优化。

· VMware Workstation:面向桌面的主打产品,基于宿主模型(类型2 VMM),宿主机操作系统可以是Windows或Linux。由于它支持完全虚拟化,因此可以使用各种客户机操作系统,包括Windows、Linux、Solaris和FreeBSD。

· VMware Fusion:面向桌面的一款产品,功能和VMware Workstation基本相同,但是VMware Fusion的宿主机操作系统是macOS,并且有很多针对macOS的优化。

VMware产品具有很多优点,如下所述。

· 功能丰富。很多新的虚拟化功能都是最先由VMware开发的。

· 配置和使用方便。VMware开发了非常易于使用的配置工具和用户界面。

· 稳定,适合企业级应用。VMware产品非常成熟,很多企业选择使用VMware ESX Server来运行关键应用。

2)Microsoft

微软在虚拟化方面起步比VMware晚,但在认识到虚拟化的重要性之后,微软通过外部收购和内部开发,推出了一系列产品,涵盖了用户状态(User State)虚拟化、应用程序(Applications)虚拟化和操作系统虚拟化。操作系统虚拟化产品主要包括面向桌面的Virtual PC和面向服务器的Virtual Server。这些产品的特点在于和Windows结合得非常好,在Windows下非常易于配置和使用。

3)Xen

Xen起源于英国剑桥大学的一个研究项目,并逐渐发展成一个开源软件项目,吸引了许多公司和科研院所加入,发展非常迅速。

从技术角度来说,Xen基于混合模型,其特权操作系统(Domain 0或者说Dom0)具有类似于宿主机操作系统的很多管理功能,并通过其他非特权的虚拟机(DomU)运行用户的程序。Xen最初是基于类虚拟化实现的,通过修改Linux内核,实现处理器和内存的虚拟化,通过引入I/O的前端/后端驱动(Front/Backend)架构实现设备的虚拟化。利用类虚拟化的优势,Xen可以达到近似于物理机的性能,其构架如图3-9所示。

img

图3-9 Xen架构

随着Xen社区的发展壮大,硬件完全虚拟化技术也被加入Xen中,如Intel VT和AMD-V,因此未加修改的操作系统也可以在Xen上面运行了。

Xen支持多种硬件平台,官方的支持版本包括x86_32、x86_64、IA64、PowerPC和ARM架构。Xen目前已经比较成熟,基于Xen的虚拟化产品很多,如Ctrix、VirtualIron、Red Hat和Novell等都有相应的产品。

作为开源软件,Xen的主要特点如下所述。

· 可移植性非常好,开发者可以将其移植到其他平台,也可以将其修改并用于项目研究。

· 独特的类虚拟化支持,提供了近似物理机的性能。但Xen的易用性和其他成熟的商业产品相比还有一定的差距,有待加强。

4)KVM

KVM(Kernel-based Virtual Machine)也是一款基于GPL的开源虚拟机软件。它最早由Qumranet公司开发,在2006年10月出现在Linux内核的邮件列表上,并于2007年2月被集成到Linux 2.6.20内核中,成为内核的一部分。

KVM架构如图3-10所示。它是基于Intel VT等技术的硬件虚拟化,并利用QEMU来提供设备虚拟化。此外,在Linux社区中已经发布了KVM的类虚拟化扩展。

img

图3-10 KVM架构

从架构上看,KVM属于宿主模型(类型2 VMM),因为Linux在设计之初并没有针对虚拟化的支持模块,所以KVM是以内核模块的形式存在的。但是随着越来越多的虚拟化功能被加入Linux内核中,也可以把Linux内核看作一个Hypervisor。因此KVM也可以被看作Hypervisor模型(类型1 VMM)。