虚拟机技术的分类与比较
一、虚拟机按照上层应用接口的分类
近年来,虚拟机技术已经逐渐成为人们关注的热点,正受到越来越多的关注和重视,如VMware已经被80%以上的全球百强企业所采纳。随着多年来研究的深入,虚拟机技术已经在企业计算、灾难恢复、分布式计算和系统安全领域得到了广泛应用。
现在对虚拟机技术有很多种分类方式,本文认为虚拟机的本质特征是利用下层应用(或系统)的支持为上层应用(或系统)提供不同的接口,因此按照接口来分类应该更能反映虚拟机的特点。按照虚拟机系统对上层应用所提供接口的不同(如图1所示),形成了不同层次的虚拟机技术,主要包括硬件抽象层虚拟机、操作系统层虚拟机、API(应用程序编程接口,Application Programming Interface)层虚拟机,以及编程语言层虚拟机等四类。
图1 层次化的虚拟机分类
硬件抽象层的虚拟机。对上层软件(即客户操作系统)而言,硬件抽象层的虚拟机构造了一个完整的计算机硬件系统,这种虚拟机与客户操作系统的接口即为处理器指令。
操作系统层的虚拟机。通过在动态复制操作系统环境,此类虚拟机能够创建多个虚拟运行容器。而对运行在每个容器之上的软件而言,此类虚拟机均提供了一个完整的操作系统运行环境,而它与上层软件的接口即为系统调用接口。
API层的虚拟机。此类虚拟机为上层应用软件提供了特定操作系统运行环境的模拟,但这种模拟并不是对处理器指令的仿真,而是模拟实现该操作系统的各类用户态API。
编程语言层虚拟机。此类虚拟机通过解释或即时编译技术(Just-In-Time,JIT)来运行语言虚拟机指令,从而实现软件的跨平台特性。
1、硬件抽象层的虚拟机技术
早在上世纪70 年代,IBM System 360、370、CP-40、CP-67[1-4]等系统就已经实现了硬件抽象层的虚拟机技术,它最初是为了弥补系统架构上的不足而发展起来的,而随着技术的发展和对虚拟机需求的增加,硬件抽象层虚拟机在强隔离功能和安全控制方面得到了长足发展和广泛应用。
如前所述,运行在硬件抽象层虚拟机之上的软件即为客户操作系统,硬件抽象层的虚拟机技术利用客户系统环境和虚拟机宿主平台的相似性来减少执行客户系统指令的延迟。目前,大多数的商业服务器虚拟化产品,都是通过使用这种技术来实现高效、实用的虚拟化系统。这种技术利用虚拟机监视器(Virtual Machine Monitor,VMM)作为隔离代码运行环境的中间层。
这类虚拟机通过VMM 提供了一个物理机器的抽象,它允许操作系统假设自身可以直接在硬件上运行,VMM为其上运行的客户操作系统提供硬件映射。从操作系统的角度看,运行在虚拟机上与运行在其对应的物理计算机系统上一样。
图2.1 Type I VMM与Type II VMM体系结构
按照Goldberg的定义,虚拟机监视器是能够为计算机系统创建高效、隔离的副本的软件。这些副本即为虚拟机(Virtual Machine,VM),在虚拟机内虚拟处理器的指令集的一个子集能够直接在物理处理器上执行。根据VMM 在整个物理系统中的实现位置和实现方法的不同,Goldberg定义了两种虚拟机监视器模型,即Type I VMM和Type II VMM,具体结构如图2.1所示。Type I VMM 在操作系统之前预先安装,然后在此虚拟机监视器之上安装客户操作系统,它可以在硬件支持下拥有最佳性能,如IBM VM/370,VMware ESX Server,Xen,远为VirNOS,Denali等均属于这样的虚拟机。Type I VMM通常都是以一个轻量级操作系统的形式实现。Type II VMM 则是安装在已有的主机操作系统(宿主操作系统)之上,此类虚拟机监视器通过宿主主操作系统来管理和访问各类资源(如文件和各类I/O设备等),如VMwareWorkstation、ParallelWorkstation等。
从实现的角度,VMM实现从虚拟资源到物理资源的映射,并利用本地物理计算机系统进行实际计算。当客户操作系统通过特权指令访问关键系统资源时,VMM将接管其请求,并进行相应的模拟处理。为了使这种机制能够有效地工作,每条特权指令的执行都需要产生自陷(Trap)以便VMM能够捕获该指令,从而使得VMM能够进行相应的指令模拟执行。VMM通过模拟特权指令的执行,并返回处理结果给指定的客户虚拟系统的方式,实现了不同虚拟机的运行上下文保护与切换,从而能够虚拟出多个硬件系统,保证了各个客户虚拟系统的有效隔离。
然而,Intel x86体系结构的处理器并不是完全支持虚拟化的,因为某些x86特权指令在低特权级上下文执行执行时,不能产生自陷,导致VMM无法直接捕获特权指令的执行。
目前,针对这一问题的解决方案主要有三种:基于动态指令转换(DynamicInstruction Translation)的完全虚拟化(Full-virtualization)技术,半虚拟化(Para-virtualization)技术和硬件辅助(HardwareAssisted)技术。
许多商业的虚拟化产品都采用了基于动态指令转换的完全虚拟化技术,例如EMC公司的VMwareESXServer、VMwareWorkstation和Microsoft的VirtualServer系列产品。基于动态指令转换的完全虚拟化技术通过在运行时动态执行指令扫描以发现特权指令,然后依据VMM状态执行指令转换,使得特权指令的执行跳转到等价模拟代码段处,从而实现与自陷相同的目标。
由于完全虚拟化不需要修改客户操作系统,因此具有很好的兼容性,而完全虚拟化技术的性能也主要依赖于动态指令转换引擎的设计和实现。
与完全虚拟化技术技术不同,半虚拟化技术通过修改操作系统代码使特权指令产生自陷。半虚拟化技术最初由Denali和Xen 项目在x86 体系架构上实现。Denali最先提出半虚拟化技术,Xen是由剑桥大学计算机实验室发起的开源虚拟机项目。它的开发得到了Intel、HP、IBM等公司的支持。Xen是在x86平台上支持同时运行多个虚拟系统的高性能VMM,它支持x86_32、x86_64、IA64等多种平台。
Xen采用半虚拟化技术,通过对客户操作系统的内核进行适当的修改,使其能够在VMM的管理下尽可能地直接访问本地硬件平台。Xen利用半虚拟化技术降低了由于虚拟化而引入的系统性能损失。如图2.2所示,Xen的 半虚拟化技术的主要实现思路是:对于内存分段管理的虚拟化,要求客户操作系统对硬件分段描述符的更新由Xen进行验证,这也就要求客户操作系统不能有高于Xen的特权级别和不允许访问Xen的保留地址空间;对于内存分页管理的虚拟化,要求客户操作系统可以直接读取硬件页表,但对页表的更新需要Xen进行验证和处理,Xen支持客户虚拟系统可以分布在不连续的物理内存上;对于客户虚拟系统,其只能运行在低于Xen的特权级别上;客户虚拟系统需要注册一个异常(Exception)处理函数的描述符表,直接支持Xen的虚拟化;客户虚拟系统的硬件中断机制被Xen中的Event处理机制代替;每个客户虚拟系统都有自己的时钟接口,并且可以了解真实的时间和虚拟的时间;客户虚拟系统通过异步I/O rings的内存区域和外部设备(网络、硬盘)来传递数据,采用事件处理机制代替硬件中断通知机制。
图2.2 Xen 3.0 体系结构
目前,Xen的最新的3.x版本已经支持Intel VT和AMD Pacifica技术,基于IntelVT技术避免了对客户操作系统内核的修改[8, 16],这一技术将使得能够在Xen之上运行各种非开源操作系统(如Windows等)。Xen作为高性能的虚拟机软件[8],越来越受到业界的关注,并在企业计算和计算机安全领域都得到了广泛的应用[9, 17-28]。
第三种方案是通过修改x86 CPU指令的语义使其直接支持虚拟化,也就是Intel的VT(Virtualization Technology)技术[29-31]和AMD的Pacifica[32]技术的目标。Intel公司推出了VT-i(支持Ltanium 架构)和VT-x(支持X86 架构)引入新的处理器操作,称为VMX(Virtual Machine Extensions)来支持虚拟化。AMD 推出了新的处理器模式和新的内存管理模式支持虚拟化技术。VT的核心思想是给x86CPU的各种特权指令的执行,都增加可以进行trap的可能。
AMD在虚拟化技术方面的Pacifica技术规范,是AMD计划用于其64位产品中的虚拟化技术。该技术将用于基于x86架构的服务器、台式机和笔记本电脑等系列产品。
从技术角度看,不论是 VT技术外部架构规范,还是Pacifica技术规范,它们强调的核心功能都是RISC处理器早就实现了分区(Partition)功能,即基于该技术平台实现在独立分区中高效运行多个操作系统和应用程序,使一个计算机系统像多个虚拟系统一样运行。
除了基于VMM的硬件抽象层的虚拟机技术,还有一种基于软件模拟指令集方式实现的所谓ISA(InstructionSet Architecture)层虚拟机系统。一个典型的计算机系统由处理器、内存、总线、硬盘控制器、时钟、各种I/O设备组成。ISA层的虚拟化软件的实现方式是截获客户操作系统发出的指令,并把它们“翻译”成宿主平台上的可用指令进行执行(包括处理器内部指令和I/O指令)。由于这种指令的模拟方式,ISA层的虚拟化技术可以完全模拟一台真实机器,这种实现方式的好处在于,分离了操作系统和硬件平台的紧绑定关系。
这方面具有代表性的系统有很多。Bochs[33]是用C++语言编写的开源的x86平台的PC模拟器,可以方便地在多种平台上模拟IA32 PC系统。它能够模拟多种版本的x86系统,如386、486、Pentium、Pentium Pro、SSE、SSE2等指令。Bochs解释客户系统从开机到关机的全部指令,模拟了Intel x86 CPU、BIOS以及PC设备。因此,在客户操作系统看来,就好像是运行在一台真实的机器上一样。虽然Bochs系统的性能问题,使其很难有广泛的应用,但它也在某些方面有着重要的应用价值,如在非x86平台上运行Windows系统,进行新开发的操作系统的debug工作,进行老式x86系统的兼容性测试等。
QEMU [34]是一个采用动态指令转换技术的快速的模拟器,它支持两种工作模式:用户空间模拟和全系统模拟。在用户空间模式下,QEMU可以在物理 CPU上执行为其他CPU编译的程序。在全系统模拟的模式下,它支持模拟x86、ARM、PowerPC、Sparc等结构。它可以快速地把客户操作系统的指令动态地翻译成本地指令进行执行。QEMU进行动态指令转换的基本思想是把每条指令分解成少量的简单指令。每条简单指令由一段C代码实现,通过动态代码生成器把这些简单指令的目标文件连接起来,构建指定的功能。
与基于VMM的硬件抽象层虚拟机不同,ISA层的虚拟机技术模拟运行所有客户操作系统执行的处理器指令。因此,这种虚拟机技术最大的不足就是性能问题,它的性能远远低于硬件抽象层的虚拟机,所以主要应用于动态指令转换等研究领域。
硬件抽象层的虚拟化技术有着高度的客户虚拟系统的隔离性(包括客户操作系统之间,客户操作系统和宿主操作系统之间)。这种隔离性使得在同一个物理平台上,可以同时运行不同类型的操作系统,而且它们的重启等操作不会互相影响。在用户看来,隔离性使得物理平台被划分成不同虚拟机器。由于用户面对的是虚拟机器,用户需要更多的系统安装和配置工作
2、操作系统层虚拟机技术
一个典型的应用程序运行环境包括:操作系统、用户函数库、文件系统、环境设置等。如果一个运行环境包含了所有这些关键组件,应用程序自身是无法区分是运行在物理系统内,还是运行在虚拟系统中。操作系统层虚拟化技术的主要思想就在于此,即在宿主操作系统上动态复制软件运行环境,以此来创建多个虚拟系统。
Jail是FreeBSD上的操作系统层虚拟机技术。它把操作系统划分成多个独立的环境,称之为Jail。每个Jail都可以独立管理典型的操作系统资源,如进程、文件系统、网络资源等。而用户对资源的访问范围则被限制在该用户所在Jail的内部。Jail是通过Jail系统调用创建的,Jail 内的第一个进程的所有子进程都属于该Jail,任何一个进程不能同时属于多个Jail。Jail虚拟化技术在隔离应用程序方面有一定的应用价值。
Solaris操作系统提供的区域(Zone)技术也采用了类似的机制。区域是指在 Solaris 操作系统的单个实例中创建的一个虚拟的操作系统环境,是一种用于虚拟化操作系统服务的分区技术,目的是提供安全的隔离环境以便承载和运行各种应用程序。区域有两种类型:全局区域(global zone)和非全局区域 (non-globalzone)。通过系统硬件引导的 Solaris安装过程所安装的即是全局区域,一个系统中只能运行一个全局区域。全局区域管理员可使用 zonecfg和zoneadm来创建非全局区域。全局区域控制所有非全局区域的安装、维护、操作和损毁。Solaris 区域功能可为在非全局区域中运行的进程提供虚拟服务和名称空间隔离。它可以将在某个非全局区域中运行的进程与在其他区域中运行的进程隔离开,这种隔离可防止在某个非全局区域中运行的进程监视或影响在其他区域中运行的进程。对于在非全局区域中运行的进程,即使具有超级用户权限也不能查看或影响其他区域中的活动。区域还提供一个抽象层,用以分隔应用程序与部署应用程序的计算机的物理属性,例如物理设备路径和网络接口名称等。
Virtual Private Server(VPS)技术把服务器的操作系统环境分割成多个彼此隔离的虚拟运行容器,称之为VPS。管理员可以为每个VPS分配指定数量的内存、磁盘、网络带宽等资源,还能够在物理服务器与虚拟环境或物理服务器之间进行客户虚拟系统的迁移。VPS技术在网站的服务器整合,提高资源利用率等方面有很好的应用。
图3.1 User Mode Linux体系结构
UML(UserMode Linux)是让一个Linux作为一个独立进程运行在另一个Linux(宿主Linux)之上的开源项目,它是一种在同一时刻运行多 Linux 的虚拟化方式。UML不需要额外的虚拟化软件,它只需要在Linux内核源码上打上相关的补丁。UML的补丁把Linux标准内核转化成一个可以作为独立进程执行的操作系统。当运行UML内核时,需要为其分配一个完整的文件系统。新的系统内核作为一个用户态的应用程序运行。UML体系结构如图3.1所示,UML内核接收来自应用程序的系统调用请求,然后发送到宿主Linux内核进行处理。由于UML的内核和用户态进程在同一地址空间内,因此,需要把内核的代码和数据段放在UML进程通常不会使用的地方。为了让UML之间共享内核数据,UML内核被映射到一个文件,然后将这个文件映射到UML进程中。目前,UML主要被用于系统软件的调试和测试。
3、API层的虚拟机
API层虚拟机的典型代表是开源项目Wine,它构造了一个Windows用户态应用程序和其它操作系统之间的适配层(Adapter Layer),当这些应用程序需要在其他操作系统下调用一个Win32 API函数时,Wine将把该调用转换成相应操作系统下对该函数的模拟实现。
Wine系统在整个运行环境中起到的作用可以从三个角度理解。
l 从Windows应用程序的角度看,Wine为其提供了Windows软件运行环境的模拟,不过这并不是对处理器指令的模拟,而是对Win32 API函数的模拟。
l 从Linux及其内核的角度看,Wine形成Linux内核与Windows应用程序之间的一个中间层。它一方面为Windows应用程序提供了一套完整的动态链接库(Dynamic LinkLibrary,DLL),一方面将应用程序和动态链接库中对Windows的系统调用转换成具有相似语义的Linux的系统调用。
l 从Windows的动态连接库和服务进程的角度来看,Wine是Windows关键组件以模拟方式在Linux上实现的移植。
图4.1 Wine体系结构
Wine未包含任何Linux内核模块,即Wine所有的组件均是在用户态实现的。Wine需要在Linux用户态下基于Linux系统调用来模拟实现Windows的系统调用。然而,系统调用类似于函数调用,要让两个这样的“函数调用”在调用上下文、输入参数、函数语义和返回结果等各方面都完全一致是非常困难的。为了在用户态弥补这一语义鸿沟,Wine引入了Wine Server这一服务进程。
如图4.1所示,Wine构造了Windows应用软件与Linux内核之间的适配层,主要包括了一个Wine服务进程(Wine Server)和一组Windows动态连接库。此外,Wine对用户界面API的模拟仍依赖于X Server。在运行Windows应用程序时,Wine需要与三个进程交互:
l Windows应用程序进程。该进程对Windows API函数调用均经由Wine所提供的各种动态连接库逐层向下转发,直至Linux内核系统调用。在Wine内部,这个进程需要通过套接字(socket)和管道(pipe)接口与Wine服务进程通信,以调用Wine服务进程提供的系统功能并接受服务进程的管理。Wine上运行的Windows应用程序进程是从Wine的作业载入程序wine迁移过来的,wine为该应用程序的运行建立起与Wine服务进程的连接之后载入目标程序,最后转入目标程序的入口函数(WinMain函数)开始运行。
l Wine服务进程。该进程提供Windows进程间通信与同步的手段、Windows进程与线程管理、注册表服务、各种Win32对象的管理等。Wine服务进程对进程、进程间通信等的管理与Linux内核所提供的相关服务并不冲突,因此只提供了Linux内核中不存在或者与Windows内核不兼容的部分。Wine服务进程实际是在为Windows应用程序提供远地过程调用(RemoteProcedure Call,RPC)。可以说,Wine服务进程是整个Wine平台的核心,通过该服务进程,Wine在用户空间构造了一个虚拟的“Windows内核”。Wine服务进程的目的实际就是在用户态弥补Windows内核与其他操作系统内核的差异,尽管远程过程调用的方式带来了一定程度的性能下降,但也避免了修改Linux内核带来的潜在不稳定因素。
l X服务进程。该进程提供非Windows运行环境下的GUI服务,如图形显示输出以及键盘和鼠标输入等。
4、编程语言层虚拟机
编程语言层虚拟机也就是程序虚拟机,程序虚拟机为运行单个计算机程序设计,这意谓它支持单个进程。虚拟机的一个本质特点是运行在虚拟机上的软件被局限在虚拟机提供的资源里——它不能超出虚拟世界。
典型的程序虚拟机如JAVA虚拟机,Java虚拟机(英语:Java Virtual Machine),是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。对中央处理器(CPU)所执行的一种软件实作,用于执行编译过的Java 程序码(Applet 与应用程序)。
Java虚拟机(JVM)一种用于计算机设备的规范,可用不同的方式(软件或硬件)加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。
Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。
Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。
Java虚拟机是Java语言底层实现的基础,对Java语言感兴趣的人都应对Java虚拟机有个大概的了解。这有助于理解Java语言的一些性质,也有助于使用Java语言。对于要在特定平台上实现Java虚拟机的软件人员,Java语言的编译器作者以及要用硬件芯片实现Java虚拟机的人来说,则必须深刻理解Java虚拟机的规范。另外,如果你想扩展Java语言,或是把其它语言编译成Java语言的字节码,你也需要深入地了解Java虚拟机。
二、虚拟机按照实现方式的分类
CPU的虚拟化是VMM进行硬件虚拟化时最重要的环节。根据实现方式不同,将其分为全虚拟化、半虚拟化和硬件虚拟化。
1、全虚拟化
全虚拟化是一种完全模拟所有硬件设备的虚拟化模式。由于VMM(虚拟机监控系统)模拟了所有的计算机设备(包括BIOS、外设、内存等)使得操作系统好像独自占用了所有的计算机的资源。VMM翻译核心指令来替换不能虚拟化的指令,用软件的方式消除X86架构的缺陷,使得大多数操作系统都可以以全虚拟化模式运行。主要是在客户操作系统和硬件之间捕捉和处理那些对虚拟化敏感的特权指令,使客户操作系统无需修改就能运行,速度会根据不同的实现而不同,但大致能满足用户的需求。这种方式是业界现今最成熟和最常见的,而且属于 Hosted 模式和 Hypervisor 模式的都有,知名的产品有IBM CP/CMS,VirtualBox,KVM,Virtual PC,VMware Workstation和VMware ESX(它在其4.0版,被改名为VMware vSphere)。
全虚拟化(Full virtualization), 也称为原始虚拟化技术, 是另一种虚拟化方法. 该模型使用虚拟机协调客户操作系统和原始硬件(见图1). 这里"协调"是一个关键词, 因为VMM在客户操作系统和裸硬件之间用于工作协调. 一些受保护的指令必须由Hypervisor(虚拟机管理程序)来捕获和处理. 因为操作系统是通过Hypervisor来分享底层硬件.
图1. 全虚拟化: 使用Hypervisor分享底层硬件
全虚拟化的运行速度要快于硬件模拟, 但是性能方面不如裸机, 因为Hypervisor需要占用一些资源. 全虚拟化最大的优点是操作系统没有经过任何修改. 它的唯一限制是操作系统必须能够支持底层硬件(比如, PowerPC). 全虚拟化Guest OS无需修改,速度和功能都非常不错,使用操作非常简单,但是,完全模拟计算机硬件需要消耗虚拟机服务器更多地CPU资源,所以全虚拟化模式操作系统运行速度会比较慢,特别是I/O方面。
2、半虚拟化
半虚拟化又叫做操作系统协助虚拟化,在半虚拟化下,VMM需要在操作系统的协助下才能对特权指令进行虚拟化,它要对虚拟机的操作系统内核进行修改才能将操作系统的缺陷指令替换,虚拟OS知道自己运行在虚拟机中。所以,主机和虚拟操作系统要用相同版本和型号(32比特或64比特)的内核。半虚拟化是通过修改Guest OS的内核,绕开x86架构虚拟化的难点。但是对于非开源的Windows等操作系统却无能为力。半虚拟化的产品有Xen和Denali。
半虚拟化与完全虚拟化有一些类似,它也利用Hypervisor来实现对底层硬件的共享访问,但是由于在Hypervisor 上面运行的Guest OS已经集成与半虚拟化有关的代码,使得Guest OS能够非常好地配合Hyperivosr来实现虚拟化。通过这种方法将无需重新编译或捕获特权指令,使其性能非常接近物理机,其最经典的产品就是Xen,而且因为微软的Hyper-V所采用技术和Xen类似,所以也可以把Hyper-V归属于半虚拟化。
半虚拟化和全虚拟化的核心区别是在VMM自上的GuestOS是否修改内核。
半虚拟化(Paravirtualization)是另一种类似于全虚拟化的热门技术。它使用Hypervisor(虚拟机管理程序)分享存取底层的硬件, 但是它的客户操作系统集成了虚拟化方面的代码。该方法无需重新编译或引起陷阱, 因为操作系统自身能够与虚拟进程进行很好的协作。
图2. 半虚拟化: 通过客户操作系统分享进程
上面提到过,半虚拟化需要客户操作系统做一些修改(配合Hypervisor),这是一个不足之处,但是半虚拟化提供了与原始系统相近的性能。与全虚拟化一样,半虚拟化可以同时能支持多个不同的操作系统。这种模式和全虚拟化相比,架构更精简,而且在整体速度上有一定的优势,其缺点在于需要对Guest OS进行修改,所以在用户体验方面比较麻烦。
3、硬件虚拟化
许多虚拟机同时运行在一台计算机上需要占据很多的资源并占据很大的系统开销,许多东西被载入,存储器的容量需求也越多,数据传输等。如何有效的降低虚拟化时的系统开销是计算机虚拟化方面的一个重大问题。
硬件虚拟化也叫做硬件辅助虚拟化,VMM需要在硬件的支持下才能完成对硬件资源的虚拟化。硬件虚拟化技术其实就是把纯软件虚拟化技术的各项功能用硬件电路来逐一实现从而降低虚拟化时的系统开销。支持虚拟技术的CPU带有特别优化过的指令集来控制虚拟过程,VMM和Guest OS运行在不同的模式下,由硬件支持模式切换。相比软件的虚拟实现方式,这些VMM可以使用的指令集可以很大程度上提高性能。硬件虚拟化技术可以提供基于芯片的功能,借助兼容VMM软件能够改进纯软件解决方案。
Intel/AMD等硬件厂商通过对部分全虚拟化和半虚拟化使用到的软件技术进行硬件化来提高性能。硬件辅助虚拟化技术常用于优化全虚拟化和半虚拟化产品,而不是独创一派,最出名的例子莫过于VMware Workstation,它虽然属于全虚拟化,但是在它的6.0版本中引入了硬件辅助虚拟化技术,比如Intel的VT-x和AMD的AMD-V。现在市面上的主流全虚拟化和半虚拟化产品都支持硬件辅助虚拟化,包括VirtualBox,KVM,VMware ESX和Xen。
硬件虚拟化提供全新的架构,它支持操作系统直接在上面运行,而不需要进行二进制转换,减少了相关的性能开销,极大简化了VMM设计,进而使VMM能够按通用标准进行编写,性能更加强大,将使虚拟化技术更接近物理机的速度。
硬件虚拟化技术在完整的情况下需要CPU、主板、芯片组、BIOS和软件的支持,例如VMM软件或者某些操作系统本身。即使只是CPU支持虚拟化技术,在配合VMM的软件情况下,也会比完全不支持虚拟化技术的系统有更好的性能。
三、虚拟机比较
下面的表格比较了一些虚拟机软件的基本信息。这里说的是系统虚拟机,Java虚拟机之类的程序虚拟机不算在内。
名称 | 作者 | 主CPU | 客户CPU | 主系统 | 客户系统 | 许可 |
Kevin Lawton | 任何 | Windows,Windows Mobile,Linux,IRIX,AIX,FreeBSD,OpenBSD,BeOS,Mac OS X | ||||
CHARON | Stromasys | x86,x86-64 | DEC PDP11,Alpha, VAX, SUN SPARC,HP3000 | Solaris/SunOS,Tru64,OpenVMS,Ultrix | 私有 | |
Peter Veenstra和Sjoerd与社区帮助 | 任何 | x86 | Linux,Windows,Mac OS Classic,Mac OS X,BeOS,FreeBSD,OpenBSD,Solaris,QNX,IRIX,MorphOS,AmigaOS | DOS | ||
社区项目 | x86,x86-64 | x86 | Linux | DOS | GPL v2 | |
Roger Bowler | 任何 | z (IBM大型计算机) | Linux, Mac OS X,Solaris,Windows | OS/360,OS/390,z/OS,z/Linux | QPL | |
Windows 2000,Windows 2003,Windows 2008,Windows XP,Windows Vista,Linux | 私有(免费) | |||||
Intel/AMD处理器与x86虚拟化 | x86/x86-64 | Linux | Linux,Windows | GPL v2 | ||
兼容 | Solaris,Linux,FreeBSD | ? | ||||
社区项目,SWsoft支持 | Intel x86,x86-64,IA-64,PowerPC64,SPARC/64 | Intel x86,x86-64,IA-64,PowerPC64,SPARC/64 | Linux | 各种Linux发行版 | ||
x86,x86-64,VT-x,AMD-V | x86,(x86-64仅在VirtualBox 2及x86-64主机上) | Windows,Linux,Mac OS X (Intel),Solaris, FreeBSD | DOS,Windows,Linux,OS/2,FreeBSD,Solaris | GPL v2;完整版本中的额外特性是专有的(免费供个人与教育机构使用和评价) | ||
Intel x86,x86-64,Intel VT-x | Intel x86,x86-64,Intel VT-x | 无(裸机安装) | Microsoft Windows,Oracle Enterprise Linux,Red Hat Enterprise Linux | 免费,商业 | ||
Parallels公司 | x86,Intel VT-x | x86 | Windows,Linux | Windows,Linux,FreeBSD,OS/2,eComStation,MS-DOS,Solaris | 私有 | |
Sebastian Biallas | x86,x86-64,PowerPC | PowerPC | Windows,Linux,Mac OS X,NetBSD | Mac OS X,Darwin,Linux | GPL | |
Fabrice Bellard(其他开发者帮助) | x86,x86-64,IA-64,PowerPC,Alpha,SPARC 32 and 64,ARM,S/390,M68k | x86,x86-64,ARM,SPARC 32 and 64,PowerPC,MIPS | Windows,Linux,Mac OS X,Solaris,FreeBSD,OpenBSD,BeOS | 经常变化[1] | GPL/LGPL | |
Intel x86,x86-64 | Intel x86,x86-64 | Linux,FreeBSD,OpenBSD,Solaris,Windows | 经常变化[2] | GPL/LGPL | ||
Paul Brook | x86 | x86 | Linux,NetBSD,Windows | 经常变化 | GPL | |
x86-64 | x86-64 | Linux(64位),Windows(64位) | Linux,Windows(32位和64位) | AMD公司专有 | ||
x86-64,SPARC | x86-64,SPARC | 无:裸机执行 | Windows XP & 2003 Server(仅x86-64),Linux,Solaris | |||
Jeff Dike(其他开发者帮助) | x86,x86-64,PowerPC | x86,x86-64,PowerPC | Linux | Linux | GPL v2 | |
Virtual IronVirtual Iron 3.1 | Virtual Iron软件公司(已被Oracle收购 May 13, 2009) | x86 VT-x,x86-64 AMD-V | x86,x86-64 | 无:裸机执行 | ||
Virtual PC2007 | x86,x86-64 | x86 | Windows Vista(商业版,企业版,旗舰版),XP Pro,XP Tablet PC版 | DOS,Windows,OS/2,Linux(Suse,Xubuntu),OpenSolaris(Belenix) | 私有(从2006年7月起免费) | |
Virtual Server 2005 R2 | Intel x86,x86-64 | Intel x86 | Windows 2003,XP | Windows NT,2000,2003,Linux (Red Hat and SUSE) | 私有(免费) | |
x86,IA-64,x86-64 | x86,IA-64,x86-64 | Linux & Windows | 各种Linux发行版;Windows | 私有 | ||
x86, x86-64 | x86, x86-64 | 无:裸机安装 | Windows,Red Hat,SuSE,Ubuntu,Netware,Solaris,FreeBSD等 | 私有 | ||
VMware ESXi Server | x86,x86-64 | x86,x86-64 | 无:裸机安装(嵌入式) | Windows,Red Hat,SuSE,Ubuntu,Netware,Solaris,FreeBSD等 | 私有(免费) | |
x86,Intel VT-x | x86,x86-64 | Mac OS X (Intel) | Windows,Linux,Netware,Solaris,其他 | 私有 | ||
VMware Player 2.0 | x86,x86-64 | x86,x86-64 | Windows,Linux | DOS,Windows,Linux,FreeBSD,Netware,Solaris,Darwin,虚拟设备 | 私有(免费) | |
x86,x86-64 | x86,x86-64 | Windows,Linux | DOS,Windows,Linux,FreeBSD,Netware,Solaris,虚拟设备 | 私有(免费) | ||
x86,x86-64 | x86,x86-64 | Windows,Linux | DOS,Windows,Linux,FreeBSD,Netware,Solaris,Darwin,虚拟设备 | 私有 | ||
x86,x86-64 | x86,x86-64 | NetBSD,Linux,Solaris | Linux, Solaris, Windows XP & 2003 Server(需要3.0版和Vanderpool 或Pacifica),九号计划, FreeBSD | GPL | ||
名称 | 作者 | 主CPU | 客户CPU | 主系统 | 客户系统 | 许可 |