您现在所在的位置:首页 >> 通知公告 >> 通知公告 >>
发布日期:2014年10月21日
初识虚拟化技术

1.虚拟化技术的意义

虚拟化技术已有40多年的历史,它起源于对分时(Time Sharing)系统的需求。

 

1.1.为什么要使用虚拟化技术

很容易理解,由于不同任务耗费的资源不同,4个任务交给4个人分别来完成不如4个人合力依次完成这4个任务。为了提高计算机硬件利用率,我们希望计算机能完成多个任务,而不需要多台计算机分别完成。

早期的操作系统只能处理单个任务,按顺序依次执行。为了能同时处理多个任务,时分系统的概念被提出来,进而出现了如今广泛使用的时分多线程技术。CPU将一个处理周期分割成n个时间片,在一个时间片内执行一个线程的任务,在时间片到后,保存当前线程的现场,恢复下一个线程的现场,从而实现线程间的切换。在这个切换频率足够高时,计算机就好像“同时在执行多个线程”。

但是上述时分多线程技术存在一个问题,就是只能在同一操作系统下进行,因为维护CPU进程切换的工作是操作系统完成的,因此为了保证CPU的正常运转,同一时间只能运行一个操作系统。

为了实现同时运行两个操作系统上的2个线程,就需要使用虚拟化技术,通过各种虚拟的方式,在同一硬件资源上,同时运行多个/种操作系统。

所以,使用虚拟化技术的目的,是为了提高硬件的利用率。

 

1.2.虚拟化技术能解决什么问题

虚拟化技术主要解决的,是同一硬件条件下,只能同时运行一个操作系统的问题。

计算机硬件是在操作系统的管理下进行工作的,如今的计算机,为了保证硬件正常工作,无法实现2个操作系统同时干预硬件的运行。

但是,在某些情况下,我们需要同时运行多个操作系统,而虚拟化技术,能实现这一需求。

 

1.3.虚拟化技术是如何实现的

虚拟化技术的核心,是“虚拟”2字。

所谓虚拟,就是模拟或伪造出本来不存在的东西。虚拟化技术的核心思想,是为计算机高层应用,模拟底层的硬/软件环境,使高层应用觉得底层真实存在一个自己需要的环境,并正常工作。

而虚拟化技术根据模拟层次不同,以及实现模拟的方法同,可以分为多种虚拟化。

 

2.虚拟化技术——底层环境

1.3讲到了虚拟化技术的核心是模拟底层环境,这里就必须介绍一下计算机的工作原理。

计算机系统的设计本身采用分层结构,如图2-1所示。首先计算机硬件为直接运行在其上的软件(操作系统)提供的接口是一组指令集合(Instruction Set Architecture,ISA),不同处理器硬件提供的接口不尽相同。

图 2‑1 计算机层次结构

方便应用程序的开发,一个完善的操作系统会提供一组程序开发库,这些库为应用程序的编写同了大量的应用程序编程接口(API),使得在编写应用程序时不用直接调用操作系统提供的更底层的功能,从而减轻程序员的工作负担。

在此基础上,一些应用程序开发者在API和ISA的基础上,结合高级语言,整合出程序库和函数库,对一些操作进行“打包”和“封装”,以方便更高级应用程序的开发。这里的包括各类动态链接库(.DLL)和静态链接库(.lib)。

在这种底层向上层提供接口的层次结构中,虚拟化技术可以根据需要,选择其中任意一个接口层,来进行模拟,从而为上层提供底层的服务,使得上层认为底层好像存在这样要给环境使自己运行一样。

 

3.虚拟化技术的类别

 

3.1.指令级虚拟化

指令级虚拟化又称为指令集架构级虚拟化(ISA虚拟化)。它通过纯软件方法,模拟出与实际运行的应用程序(或操作系统)不同的指令集去执行,采用这种方法构造的虚拟机一般称为模拟器(Emulator)。

模拟器可以将客户虚拟机发出的所有指令翻译成本地指令集,然后在真实的硬件上执行。这些指令包括典型的处理器指令和特殊的I/O指令。

指令集虚拟化系统的代表包括Bochs和QEMU。

 

3.2.硬件级虚拟化

硬件抽象层(Hardware Abstraction Layer,HAL)虚拟化实际上与指令集架构级虚拟化非常相似,其不同之处在于,这种类型的虚拟化所考虑的是一种特殊情况:客户执行环境和主机具有相同指令集的情况,并充分利用这一特点,让绝大多数客户指令在主机上直接执行,从而大大提高了执行的速度。

这种虚拟化技术要正确工作,所构造的虚拟机必须对其中一些特权指令(例如修改页表等操作)进行处理,执行时产生Trap(陷入)并将它传给下层的VMM(Virtual Machine Monitor虚拟机监视器)执行。这是因为如果虚拟机直接运行未加修改的特权指令,虚拟机中的操作系统会利用这些特权指令得到CPU和内存资源,由于各个虚拟机互相并不知晓,如果任由虚拟机中的操作系统来使用这些资源,就无法实现虚拟机之间的隔离效果。因此当虚拟机执行这些特权指令执行时,需要产生一个Trap,使得VMM可以完全控制虚拟机并保持每个虚拟机间的隔离。然后VMM在处理器中执行该指令,并将模拟结果返回给虚拟机。

硬件级虚拟化是目前研究最广泛的虚拟化技术,相应的虚拟化系统也较多。其中,在业界最具影响力的VMware和Xen都属于硬件虚拟化的范畴。

 

3.3.操作系统级虚拟化

硬件层次的虚拟机主要具有以下几个特性:高度的隔离性、易于让用户接受、支持不同操作系统和应用程序、低风险和易于维护等。但是这一层次虚拟机在调试或运行应用程序之前需要花费大量时间来安装和管理虚拟计算机,包括安装操作系统、应用套件以及网络配置等。

如果用户希望虚拟机中的操作系统和物理机器上安装的一样,只是利用该虚拟环境来进行一些安全或沙箱方面的实验,通过虚拟化技术,则可以有效避免对物理机器的重复安装,从而减少用户在机器安装上所花费的时间和精力。

一个应用的操作环境包括操作系统、用户函数库、文件系统、环境设置等。如果应用系统所处的这些环节能够保持不变,那么应用程序自身将无法分辨出其所在的环境与真实环境之间的差别。

操作系统级虚拟化技术的关键思想在于,操作系统之上的虚拟层按照每个虚拟机的要求为其生成一个运行在物理机器之上的操作系统副本,从而为每个虚拟机产生一个完好的操作环境,并实现虚拟机及其物理机器的隔离。

 

3.4.程序语言级虚拟化

传统机器通过ISA(Instruction Set Architecture)的支持来执行指令集,硬件上的操作都是由指令集中的指令来完成的,而硬件上无论是运行的操作系统还是应用程序,最终都是由一系列的指令所组成的。随着Java虚拟机(JVM)的诞生,一种新的实现虚拟机的方式逐渐引起了人们的注意。

这种抽象层次的虚拟化技术的主要思想是,在应用层次上创建一个和其他类型虚拟机行为方式类似的虚拟机,并支持一种新的自定义的指令集(例如,JVM中的Java字节码)。这种类型的虚拟机能实现对底层条件的屏蔽,使得所有使用这类指令集编写的程序都能正常运行在虚拟机上。

 

3.5.程序库级虚拟化

在几乎所有操作系统中,应用程序的编写都需要调用系统API或函数库函数,这些用户级函数的设计能够隐藏操作系统的相关底层细节,从而降低普通程序员的软件开发难度。

但是API和函数库是与操作系统环境紧密相关的,因此可以在应用程序和运行库函数之间引入一个中间层的虚拟库函数接口,给上层应用软件提供不同的API或函数接口。

 

4.虚拟机与虚拟机监视器

目前,由于x86指令集的广泛运用,硬件级虚拟化是最为流行的虚拟化层次,业界最具影响力的VMware和Xen都属于硬件级虚拟化的范畴。下面将详细介绍硬件级虚拟化中,最重要的组成部分虚拟机监视器VMM及虚拟化实现方法。

有了虚拟机VM模拟出独立的、ISA结构和实际硬件相同的虚拟硬件系统,我们还需要在真实的操作系统中管理这些VM,这就是虚拟机监视器VMM。

从系统架构看,VMM是一个位于计算机硬件和操作系统之间的软件层,运行在特权级,负责管理和隔离上层运行的多个虚拟机,为这些虚拟机提供安全、独立的运行环境。同时也为每个虚拟机虚拟出一套与真实硬件无关的虚拟硬件环境(如显示器、硬盘等)。

根据VMM在整个物理系统中的实现位置,可以将VMM分为独立监控模式、宿主模式和混合模式。如图4-1所示。

图 4‑1 三种硬件级虚拟化模式

 

4.1.独立监控模式

在该模式下,VMM直接运行在裸机上,可以使用和管理底层的硬件资源,具有最高的特权级,并向VM内的Guest OS提供抽象的底层硬件,而所有的Guest OS则运行在较低的特权级上,VMM可以截获所有Guest OS对系统资源的访问,Guest OS对真实硬件资源的访问都要通过VMM来完成。

独立监控模式常用于大型服务器上搭建虚拟机,由于大型服务器对于操作系统的需求不是很高,对服务器的操作靠一些配置命令即可完成,更多的是需要在服务器上运行大型的程序,而非使用服务器的操作系统。因而独立监控模式在大型服务器上代替了普通操作系统 地位,例如VMware ESX服务器(一种能直接在硬件上运行的企业级的虚拟平台)使用的就是独立监控模式,在服务器上虚拟多台虚拟机,供用户使用。

 

4.2.宿主模式

与独立监控模式不同,宿主模式下VMM是作为一个应用程序运行在主机操作系统,既宿主操作系统上。同样的,Guest OS对硬件资源的操作需要经由VMM来完成,但是在VMM之下还有一层宿主操作系统,这带来了额外的开销。

宿主模式对于普通用户较为容易使用,因为操作宿主模式的VMM就像平时打开一个软件一样,有完善的UI界面,对于不太熟悉虚拟化的具体细节,只是需要搭建虚拟机的普通人来讲,宿主模式简单易用,例如非常流行的VMware Workstation就是宿主模式。

 

4.3.混合模式

混合模式结合了独立监控模式和宿主模式的优点。

混合模式中VMM直接运行在裸机上,具有最高的特权级,其上运行VM。与前面两种模式的区别在于:混合模式中的VMM相对要小得多,它只负责向Guest OS提供一部分基本的虚拟服务,而把其他虚拟交给了一个特权VM来执行。

混合模式相较于前2种模式有着优势互补的特点,既有比较好的性能也有良好的用户交互界面。但是此类虚拟机的配置较前2种模式而言复杂一些,因为用户需要先安装一个完善的操作系统,然后安装VMM后对系统启动流程进行更改,赋予VMM高权限,通过VMM来管理硬件。同时用户需要良好地处理特权VM和普通VM之间的关系,如果特权VM损坏,就会引起整个虚拟化环境的损坏。

目前混合模式常常用于Linux下,利用Linux的开源特性配置VMM,XEN采用的就是混合模式,并由于其开源特性获得了很多虚拟化技术研究爱好者的好评。

 

5.x86的虚拟化技术

经典的虚拟化技术采用的是“特权解除”(Privilege Deprivileging)和“陷入-模拟”(Trap-and-emulation)技术。“特权解除”是为了实现VMM对虚拟机的控制,降低Guest OS运行的权限级别,而将VMM运行在最高特权级的技术。

在解除了Guest OS的特权之后,Guest OS的大部分指令还是能在硬件上直接运行的,但是当执行到某些关系到CPU状态的特权指令时,会“陷入”到最高特权级的VMM来模拟执行这些特权指令,既实现“陷入-模拟”。

但是,目前流行的x86架构并不能适用于这种模型,严格来说,他并不是一种支持虚拟化的架构,在架构上的缺陷给他的虚拟化实现带来了巨大的困难和挑战。在x86架构中,其指令集中有一部分敏感指令不是特权指令(例如PUSH和POP),能在低特权级下运行,无法引起陷入。

由于x86的这种缺陷,长期以来对x86架构的虚拟化都是通过软件方式实现的。根据实现方式中是否需要修改Guest OS内核,可分为全虚拟化(Full Virtualization)和半虚拟化(Paravirtualization)两种。2005年Intel发布了处理器级的虚拟化技术,即VT技术后,x86的两大生产商Intel和AMD分别扩展了x86的指令集,使x86硬件也能支持“陷入-模拟”方式的虚拟化。于是有了第三种选择——硬件虚拟化(Hardware Virtualization)技术。

 

5.1.全虚拟化

在全虚拟化下,VMM可以向虚拟机虚拟出和硬件完全相同的硬件环境,为每个虚拟机提供完整的硬件支持服务,包括虚拟BIOS、虚拟设备和虚拟内存管理等。整个过程不需要硬件或Guest OS的协助,不需要修改Guest OS的内核,Guest OS完全感知不到是否发生了虚拟化。

VMM以纯软件的方式来弥补x86的虚拟化缺陷。

 

5.2.半虚拟化

在半虚拟化下,VMM需要Guest OS的协助才能够完成对x86敏感特权指令的虚拟化。由于需要对Guest OS的内核进行修改,以便操作系统能能够自行对有缺陷的指令进行替换,半虚拟化也可以成为操作系统协助虚拟化(OS Assisted Virtualization)。在这种情况下,Guest OS是知道自己运行在虚拟机中的。

 

5.3.硬件虚拟化

硬件虚拟化又称为硬件辅助虚拟化(Hardware Assisted Virtualization),VMM需要硬件的协助才能完成对硬件资源的虚拟。硬件虚拟化始于两大CPU厂商Intel和AMD分别提出的Intel-VT和AMD-V技术,其基本思想是引入新的指令和处理器运行模式,使VMM进行监控和模拟时,硬件支持模式切换。

 

5.4.三种虚拟化技术的比较

下面分别从CPU、内存和I/O设备3个方面比较以上3种虚拟化技术。

 

5.4.1.CPU虚拟化

 

5.4.1.1. 全虚拟化

在全虚拟化下,CPU虚拟化采用的是二进制代码动态翻译(Dynamic Binary Translation)技术,即在执行时动态地重写虚拟机自省代码,并在需要VMM监控和模拟的位置插入陷入指令。

这种方式不需要修改Guest OS,但是这种动态翻译会带来一定的性能开销。

 

5.4.1.2. 半虚拟化

半虚拟化通过修改Guest OS内核代码,将敏感指令的操作替换为对VMM的超级调用(Hypercall),通过VMM来模拟执行这些指令。

这种方式避免了代码动态翻译的开销,使得性能大大提高,但缺点在于需要对Guest OS内核进行修改,因此对不开源的操作系统(如Windows系统)就很难支持。

 

5.4.1.3. 硬件虚拟化

Intel和AMD对x86架构CPU的改进使x86硬件也能支持“陷入-模拟”方式的虚拟化。这就意味着,不需要对敏感特权指令进行翻译或对Guest OS内核的修改就能很轻松地完成对CPU的虚拟化工作。

硬件虚拟化提供了全新的架构,简化了VMM的设计和实现,显著提高了其对虚拟机的掌握灵活度和性能。

 

5.4.2.内存虚拟化

在CPU虚拟化之后,下一个关键是内存虚拟化。由于内存是计算机访问最频繁的设备之一,内存虚拟化的效率将对虚拟机的性能产生重大影响。

现代计算机通常都采用段页式储存光里、多级页表等复杂的储存体系结构,计算机需要把进程使用的线性地址转换为实际内存上的物理地址,再对内存进行相应的操作。而这项工作是由硬件中的内存管理单元(Memory Management Unit,MMU)来实现的。

MMU利用进程提供的线性地址查询页目录和页表,找到对应的机器物理地址,将物理地址送到计算机地址总线上。如图5-1所示。

 

图 5‑1 线性地址到物理地址的转换

 

但是由于虚拟化技术的引入,经过MMU转换所得到的“物理地址”已经不是真正硬件上的物理地址。如果需要得到真正的物理地址,需要VMM的介入,再进行一次虚拟内存地址到实际内存地址的映射转换。

但是,由于内存的读写频率非常高,如果每次内存操作都需要VMM的介入,那么整个虚拟机运行效率会非常低。因此必须利用现有的MMU机制,实现虚拟机中线性地址到真实内存的物理地址的一次性转换。

这里将介绍在半虚拟化中使用的MMU半虚拟化以及在全虚拟化和硬件虚拟化中使用的影子页表技术。

5.4.2.1. MMU半虚拟化

这里所说的MMU半虚拟化,可以理解为在VMM的帮助下,使Guest OS能够直接利用MMU一次性完成虚拟地址到物理地址的转换。

实际上如果将虚拟机的页表和线性地址交给MMU,MMU不可能直接获得物理地址,所以VMM在其中进行了一个操作——VMM根据虚拟机中的页表和虚拟机中虚拟内存与真实内存之间的映射关系,制作了一张新的页表,这个页表直接反应了进程线性地址到真实内存地址之间的映射关系,并用这张表替换掉虚拟机中的页表。对于Guest OS而言,他能通过这张新的页表,直接获得真正的物理地址。如图5-2所示。

 

图 5‑2 MMU半虚拟化

 

使用这种方式对内存进行虚拟化时,需要注意的是Guest OS能够获得真正的物理地址信息,因此为了保证各个虚拟机内存空间的独立,要保证交给虚拟机的真实物理地址是各不相同的。同时,对于真实机器本身敏感的内存地址,不能交给虚拟机让虚拟机操作。

5.4.2.2. 影子页表

影子页表技术的思想和MMU半虚拟化比较相似,都是通过改变交给MMU的地址映射关系表,来完成地址的一次性转换。

但是与MMU半虚拟化中直接改变虚拟机里的映射关系表不同,全虚拟化和硬件虚拟化技术是由VMM为虚拟机维护一份影子页表,影子页表储存在VMM中,并在虚拟机对内存进行访问时由VMM将影子页表交给MMU,完成地址转换。如图5-3所示。

 

图 5‑3 影子页表

 

影子页表的引入对于Guest OS来说是透明,Guest OS所能看见的页表明白没有变化,影子页表的分配和维护完全在Guest OS之外的VMM中进行。

5.4.3.I/O设备虚拟化

全虚拟化、半虚拟化以及硬件虚拟化中,对I/O设备虚拟化都不尽相同,其核心问题在于I/O设备原生驱动(Legacy Driver)的存放位置以及VMM对I/O设备的处理方式。

5.4.3.1. 全虚拟化

全虚拟化中,主要采用了2种方式来管理I/O设备。

一种是在VMM独立监控模式下时,由于VMM完全掌控底层的硬件系统,VMM也拥有所有I/O设备的驱动。因此上层VM对于硬件的操作都会陷入VMM中,由VMM对I/O指令进行解析并根据驱动控制I/O设备运行指令,最后将结果返回给VM

另一种是当VMM运行在宿主模式下时,由于VMM之下还有一层Host OS,而Host OS对于硬件有完全的控制权。这时VMM对上层VM提供软件模拟出的一套I/O设备,VM对模拟的I/O设备进行操作,VMM对再将这些操作交给Host OS,并根据Host OS的返回结果返回给VM。可以说,这种方式下VMM起到了一个中间人,转交VM操作给Host OS功能。

5.4.3.2. 半虚拟化

半虚拟化下,通过修改Guest OS内核,将原生设备驱动从Guest OS中移除,放在一个经过VMM授权的设备虚拟机(Device VM)中,其余虚拟机中的Guest OS的I/O请求都交给该设备虚拟机处理。

同时,在每个Guest OS内部,添加了一个与设备虚拟机交互的驱动来协助Guest OS能够顺利地将I/O设备指令传递给设备虚拟机。而设备虚拟机收到I/O请求后,解析I/O请求并映射到实际物理设备,通过设备驱动来控制I/O设备完成指令。

5.4.3.3. 硬件虚拟化

硬件虚拟化通常采用了混合模式的VMM架构,即VMM大小很小,仅仅处理最和谐的CPU和内存虚拟化,而对I/O设备的虚拟化交给一个特权VM来处理。

这种方式与半虚拟化中使用的设备虚拟机方式比较相似,都是通过一台经过VMM授权的具有特殊权限的VM来处理I/O设备的交互。但是硬件虚拟化使用的特权VM是一台具有完整Guest OS系统的VM,因此这台特权VM拥有自身完善的I/O设备驱动,因而可以直接利用这些驱动来完成与I/O设备的交互。其他VM的I/O设备访问由VMM转交给特权VM处理,最后返回结果。

 

6.总结与展望

本文对于虚拟化技术的类别、虚拟机监视器VMM和虚拟化的3种实现技术做了简要介绍。

对于虚拟化的3种实现方式:全虚拟化、半虚拟化和硬件虚拟化,以二进制代码动态翻译为基础的全虚拟化技术出现得最早,也最为成熟,曾被认为是最具可靠性和可行性的虚拟化技术。但是随着半虚拟化的概念的提出,全虚拟化在性能问题上的弱点就越来越明显。尽管全虚拟化技术依然能够以不需修改Guest OS内核为优势,但是随着硬件虚拟化技术的加入,这个优势也将不复存在。

硬件虚拟化技术的诞生彻底改变了以往通过纯软件的方法来实现x86平台虚拟化的局面,它集合了全虚拟化不需修改Guest OS内核和半虚拟化高性能的优势,在Intel和AMD的努力下获得了令人瞩目的进步。

目前,严格来讲,三种虚拟化技术任然各有优劣,很多商用虚拟机软件也同时兼顾了多种虚拟化技术的实现方法,做到优势互补。它们的对比如表6-1所示。

表6-1 三种虚拟化技术对比

类别

全虚拟化

半虚拟化

硬件虚拟化

修改Guest OS

不需要

需要

不需要

兼容性

性能

一般(逐步提升)

CPU虚拟化

二进制代码动态翻译

超级调用

修改指令集

内存虚拟化

影子页表

MMU半虚拟化

影子页表

I/O虚拟化

设备模拟/陷入访问

设备虚拟机

设备模拟

(特权VM)

最后,虚拟化技术未来的发展可以按虚拟化技术的安全发展和虚拟化技术的商用发展两方面来说明。

在安全方面,目前内核级恶意代码的出现威胁到了计算机安全软件的安全性能,由于内核级恶意代码与操作系统、计算机安全软件处于同一特权级,因此可以做到互相干预,计算机安全软件没有完全可靠的方法来保证自身的安全机制不被恶意代码攻击,因此无法做到完全的防范。

但在虚拟化技术中,VMM的引入使得VMM处于最高的特权级,因此基于VMM的安全检测机制能保证自身不被恶意代码攻击,从而更加安全可靠。

同样的,对于恶意代码和黑客,如何判断当前入侵的计算机是否是虚拟机变得尤为重要,因为如果入侵的计算机不是实体机,那么很多入侵策略就变得毫无作用。在这方面半虚拟化技术由于对Guest OS的修改有着明显的劣势,攻击者很容易通过检测修改痕迹发现当前计算机是虚拟机。

如果入侵计算机是虚拟机,攻击者需要试图从虚拟机入侵到VMM中,即虚拟机逃逸技术。或是通过当前虚拟机,去入侵或获取其他虚拟机的信息,即虚拟机自省技术

在商业方面,目前虚拟机的移植还停留在对VMM上文件的复制,许多商用虚拟机软件商正在研究如何利用虚拟化层次(操作系统级虚拟化、函数库级虚拟化)的选择来降低虚拟机移植时的时间和空间消耗。

另一方面,提供远程虚拟机服务也是当下很有前景的一项服务,在未来可能对于普通人可能不再需要购买实体机,而只需要购买一个能够实现远程桌面的显示器和一些基本I/O设备,而向虚拟机服务供应商购买一台虚拟机的使用权。供应商能够根据客户对硬件的需求在服务器上创建一台虚拟机,客户只需要远程控制这台虚拟机,就可以完成购买实体机能完成的全部需求。

虚拟化技术近年来得到了广泛的关注,更是随着硬件虚拟化技术的产生获得了飞速的发展,相信在不久的将来,虚拟化技术将会极大的影响我们对计算机和操作系统的认识,能彻底改变我们目前的计算机硬件的使用情况。