虚拟化技术是一种对计算机硬件资源进行抽象和模拟的技术。一般所说的计算机硬件资源主要包括计算资源和存储资源。对于运行于虚拟机之上的软件来说,虚拟机和真实的机器没有区别,也就是说虚拟化技术对于上层软件是透明的,上层软件不知道也不需要知道虚拟化技术的存在和作用。
1999 年,VMware 率先推出了针对x86 平台的商用虚拟机。2003 年,剑桥大学发布的Xen 虚拟机平台的首个版本,通过半虚拟化技术实现了对包括x86-64 平台多个平台的虚拟化支持。随后Intel 公布了在x86 平台CPU 上支持虚拟化技术,即VT技术,随着VT 技术的诞生及在Intel x86 处理器上的成功应用,x86 硬件虚拟化缺陷时代正式宣告终结。在有了硬件虚拟化技术的支持后,Linux 内核开发者们也将虚拟化支持加入到Linux 内核中,即Linux 内核虚拟机(KVM)。
从Xen发布到现在,随着技术的进步,Xen的虚拟化技术也随着新技术的发展而不断的优化和改进自身的架构和技术,使之保持与时俱进的技术先进性,并不断成熟。本文将从Xen发布以来Xen所经历的虚拟化技术种类进行阐述Xen的发展。
半虚拟化技术(PV)
2.0 版本的Xen 是一款准虚拟化的虚拟机监视器,这表示,为了调用系统管理程序,要有选择地修改操作系统,然而却不需要修改操作系统上运行的应用程序。即表示Xen2.0的时代是基于半虚拟化架构的。
半虚拟化又称准虚拟化、泛虚拟化或者协同虚拟化,是指虚拟机监视器通过暴露给虚拟机操作系统一个修改过的硬件层,而虚拟机操作系统也修改自身的部分代码与虚拟机监视器进行配合,从而实现的虚拟化技术。半虚拟化最大的特点是大大降低了虚拟化技术带来的额外开销,主要体现在减少特权机转换和内存复制。另一方面,由于虚拟机操作系统知道自己处于虚拟化环境,并且会主动跟虚拟机监视器进行配合,从而消除了全虚拟化中黑盒调度带来的一些问题。半虚拟化的缺点是需要修改虚拟机操作系统,因此非开源的商业操作系统如Microsoft Windows 等不能直接运行在半虚拟化平台上。
与全虚拟化相比,虽然VMware等其他虚拟化系统实现了完全的虚拟化(它们不必修改使用中的操作系统),但它们仍需要进行实时的机器代码翻译,这会影响性能。半虚拟化将一些硬件暴露给客户操作系统,可取得较好的性能。不需要修改应用程序,但是需要修改操作系统。
在Xen中,将半虚拟化技术Para-virtualization,简称为PV。在Xen的半虚拟化技术中,是如何对计算机的主要硬件资源进行管理和调度的?Xen半虚拟化架构如下图所示:
如图所示,在Xen的半虚拟化架构中,对物理硬件资源的主要三大类资源,虚拟机监控程序(hypervisor)主要管理和调度CPU和内存资源。而IO资源由和hypervisor紧密集成的Domain 0来进行管理,采用的技术就是比较著名的前后端(Frontend-Backend)IO技术,前后端(Frontend-Backend)是Xen 平台的专业术语。
前后端I/O 虚拟化采用半虚拟化原理是指,虚拟机操作系统需要安装一些额外的设备驱动,以识别特定的虚拟设备,虚拟机操作系统本身并不需要修改。通过特殊的设备驱动,也就是所谓的前端驱动,虚拟机操作系统就具备了跟宿主机上的后端驱动进行通信的能力。所以在半虚拟化中,我们在虚拟机上需要安装PV Driver。
虚拟机 访问I/O 设备相比VMware 的模型要直接很多,通过一条Hypercall 进入Hypervisor,由其直接访问硬件。虚拟机 和Hypervisor之间的数据传输采用基于循环队列数据结构的生产者消费者模型。利用内存映射和DMA 操作可实现两者之间的零拷贝。应用程序仍然运行在ring3。
全虚拟化技术(HVM)
传统x86 构架对虚拟化没有很好的支持,因此当时x86 平台的虚拟化只能完全通过软件方式来实现。基于软件的虚拟化主要有两种可行的解决方案:模拟执行和修改虚拟机操作系统。根据是否需要修改虚拟机操作系统可以把虚拟化技术分成两类:全虚拟化和半虚拟化。
全虚拟化技术通过软件模拟的方式来弥补x86 平台的虚拟化缺陷,呈现给虚拟机操作系统一个与真实硬件完全相同的环境,任何操作系统都无需修改可以直接运行在全虚拟化平台上。然而由于软件模拟带来的额外开销,全虚拟化的缺点是运行效率比较低。
Vmware在硬件虚拟化技术出来之前是典型的全虚拟化技术的代表,其就是采用通过对虚拟机执行的代码进行动态二进制代码转换(Binary translation)的技术实现全虚拟化。而其他的虚拟化软件则是完全的采用软件模拟的方式进行虚拟化,比如QEMU这一软件就是典型的代表。
现在回来说说我们的Xen,Xen在半虚拟化方式下,Xen 要为虚拟操作系统打补丁。为了适应虚拟机技术发展的潮流,通过x86 处理器对虚拟化技术的支持,Xen 虚拟机系统也进行了完全虚拟化的扩展。Intel 公司在2005 年宣布了称为VirtualizationTechnology的虚拟化技术,对x86 架构进行了扩展,使得虚拟机更加容易设计并具有更高性能;之后AMD公司也推出了类似的称为Pacifica的虚拟化技术。硬件虚拟化技术弥补了X86的虚拟化漏洞,使得完全虚拟化技术更加容易实现,效率更高。
Xen 从其3.0 版本开始,利用硬件虚拟化技术的支持,实现了完全虚拟化,可以在其平台上不加修改的直接运行如Linux/Windows 等系列的操作系统,使得系统具备了更好的兼容性。但总体来说,Xen的完全虚拟化的实现比其半虚拟化的实现性能要差很多,尤其是其I/O 性能。
这是为什么呢?要明白我们先来看下Xen的完全虚拟化的架构图:
如图所示,在Xen的全虚拟化架构中,Xen对硬件三类资源的管理和调度是这样运作的:对于CPU的管理和调度,加入了对Intel VT 技术和AMD Pacifica 技术的支持,因此可以使得虚拟机可以直接访问物理CPU资源;对于内存来说,硬件虚拟化技术IOMMU等等也简化了内存地址之间虚拟与真实的转换开销。但是对于IO设备来说,由于前后端驱动是基于半虚拟化环境开发的,因此,在最初的Xen完全虚拟化技术中,使用Qemu来仿真PC硬件,包括BIOS、IDE硬盘控制器、VGA图形适配器(显卡)、USB控制器、网络适配器(网卡)等。因此在这样的全虚拟化架构下,其IO设备的性能是比半虚拟化架构下要低得多的。
全虚拟化技术的变种PV on HVM或PVHVM
由于HVM对disk和network的模拟的繁琐,以及后台qemu耗费的资源。为了提高性能,Xen开始考虑PV和HVM进行结合,各自取其中的有点进行融合。全虚拟化虚拟机可以使用一些特殊的半虚拟化设备驱动(PVHVM 或者 PV-on-HVM驱动)。这些半虚拟化驱动针对全虚拟化环境进行了优化并对磁盘和网络IO仿真进行分流,从而得到一个类似于或优于半虚拟化虚拟机性能的全虚拟化虚拟机。这意味着,你可以对只支持全虚拟化技术的操作系统进行优化,比如Windows。
融合后的架构如下图所示:
如图,Xen 虚拟机系统由如下几个部分组成:虚拟机监视器Hypervisor:完成硬件的虚拟化,虚拟机的调度等;Domain 0:可通过一组特殊的Hypercall 完成其他DomainN 的创建、迁移、分配资源、管理,I/O 设备的模拟等工作;Guest VM:运行已修改过的操作系统的虚拟机;HVM Guest:运行未修改过操作系统的虚拟机;运行在Guest VM 的操作系统通过调用Hypervisor提供的API 来完成重要的管理操作,如分配物理内存、修改进程页表等。在访问外设时,Guest OS 中的前端驱动(Front-End)将请求通过共享内存的方式传递给Domain 0 中的后端驱动(Back-end),后端驱动再调用Linux OS 中的设备驱动程序来完成操作。
在这种架构类型中,Xen半虚拟化虚拟机自动使用PV驱动,因此不需要提供这些驱动,你已经在使用这些优化过的驱动了。另外,只有Xen全虚拟化虚拟机才需要PVHVM驱动。
PV in an HVM Container (PVH)
Xen在4.4版本的时候,换成了一个被称作PVH的新的虚拟化种类,就是在PV的模式下增加对硬件辅助虚拟化的支持,但目前对xen和kernel的版本有要求。就是相比较PVHVM而言,PVH融合得更加的彻底。它是一个使用了针对启动和I/O的半虚拟化驱动的半虚拟化模式。与全虚拟化不同的是,它使用了硬件虚拟化扩展,但是不需要进行仿真。PVH拥有结合和权衡所有虚拟化模式优点的潜力。
下面一幅图说明了PVH是如何将PV和HVM进行结合的。
在PVH模式中去掉了QEMU对一些IO设备的模拟和仿真,将Xen和虚拟机的管理页表进行整合,并引入了APs booting等等。
区别和总结
下面是上述模式在IO设备方面的典型比较: