-----本文大纲

虚拟化

虚拟化技术

分类

--------

一、虚拟化

虚拟化通过在一个物理平台上虚拟出更多的虚拟平台,而其中的每一个虚拟平台则可以作为独立终端的分布式系统。比起直接使用物理平台,虚拟化在资源的有效利用、动态调配和高可靠性方面有着巨大的优势。利用虚拟化,企业不必抛弃现有的基础架构即可构建全新的信息基础架构,从而更加充分地利用原有的 IT 资源。

为了满足不同的功能需要,目前己经出现了许多不同的种类的虚拟机化解决方案,由于采用的不同的实现方式和抽象层次,因而这些虚拟化系统呈现出了不同的特性。计算机系的设计本身采用分层结构,首先,计算机硬件为直接运行在其上的软件提供的接口是一组指令集合(Instruction Set Architecture,ISA)但是,不同处理器硬件提供的接口不尽相同;理论上,如果操作系统希望在一个特定的硬件上运行,就必须遵守和使用该硬件提供人指令集。
为方便上层应用程序的开发,一个完善的操作系统会提供一组程序开发库,这些库为应用程序的编写提供了大量的应用程序接口(API),使得到编写应用程序不用直接调用操作系统提供更低层的功能,从而减轻了程序员的工作负担。
wKiom1N_dcHB3QIKAACVBOG3fdc231.jpg

理论上,虚拟化技术采用的抽象层次可以在上图所示的几个层次中自由选取,而实际上,选择的多样性,也就决定了虚拟化技术的多样性,然而虚拟化的实质是一样的:将底层资源进行分区,并向上层提供特定和多样化执行环境。

wKioL1N_ltOBj4beAACwyWydnZU635.jpg

从系统架构看,VMM(亦称为Hyervisor)是一个位于计算机硬件和操作系统之间的软件层,它运行在特权级,负责管理和隔离上层运行的多个虚拟机。为这些虚拟机提供安全、独立的运行环境。同时也为每个虚拟机虚拟出一套与真实硬件无关的虚拟硬件环境,如显示器、硬盘、CPU、内存、网卡等 。VMM可以将原本运行在传统架构上的单一程序运行的虚拟机上,将多个虚拟机合并到一个物理平台上,减少空间与管理成本。VMM不仅仅是一个多任务箮理工具,更是一种高安全性和高可靠性的解决方案。同时,VMM为操作系统开发人员提供了更多的机会去开发那些在复杂操作系统上不易实现的功能,如迁移和安全等功能在操作系统层是很难实现的,但是在VMM层上实现起来就相对要容易很多,根据VMM在物理系统中的位置,可以将VMM分成独立的监视器(Stand-alone Hypervisor Model)、宿主模式(Hostend-based Model)和混合模式(Hydrid Model)三种。

wKiom1N_m07QT4ClAAGB22LZIBw366.jpg

  • 独立监控模式

在此模式下,VMM直接运行在裸机上,可以使用和管理底层的硬件资源,具有最高的的特权级,并向VM内的Guest OS提供抽象的底层硬件,而所有的Guest OS则运行在较低的特权级上,VMM可以捕获所有Guest OS对系资源的访问,Guest OS对真实硬件资源的访问都要通过VMM在来完成,作为底层硬件的直接操作都,VMM拥有的这些硬件的驱动程序。此在模式下在实现的VMM亦称在Type-I型VMM。

  • 主机模式

与独立的监控模式不同,主机的模式下的VMM是作为一个应用程序运行在主机操作系统,即宿主操作系统(Host OS)上的。VMM可以充分利用宿主操作系统所提供的设备驱动和底层服务来进行内存管理、进程管理和资源管理。在VMM之上的Guest OS不能访问真实的硬件,所有的访问必须由VMM来完成,但是,在VMM之下还有一层宿主操作系统,使得Guest OS对硬件的访问不仅要经过VMM,还要经过这一层宿主操作系统,而带来的额外的开销,在此模式下实现的VMM亦称为Type-II型 VMM。

  • 混合模式

混合模式集合了独立监控模式和要主机模式的优点,混合模式在结构上与独立监控模式类似,VMM直接运行在裸机上,具有最高的特权级,其上运行VM。与前面两种模式的区别在于:混合模式中的VMM相对要小得多,它只负责向Guest OS提供一部分基本的虚拟服务,例如CPU内存及中断等 ,而把I/O设备的虚拟交给一个特权VM(pvivileged VM)来执行。由于序分利用了原操作系统中的设备,VMM本身并不包含设备的驱动,Xen所采用的就是混合模式。

二、虚拟化技术

1、模式术语

  • 虚拟机与虚拟机监视器

虚拟机VM是指在一个硬件平台上模拟多个独立的、ISA结构和实际硬件相同的虚拟硬件系统,在每个虚拟硬件系统上都可以运行不同的操作系统,即客户操作系统Guest OS。这些Guest OS通过虚拟机监视器VMM访问实际的物理资源

  • 全虚拟化

在 全虚拟化下,VMM可以向虚拟机虚拟出来和真实硬件完全相同的硬件环境。为每一个虚拟机提供完整的硬件支持,包括虚拟BIOS、虚拟设备和虚拟内存管理 等。这个过程并需要硬件或操作系统的协肋,因而不需要修改Guest OS的内核,Guest OS完全感知不到是更否发生了虚拟化,VMM以纯软件的方法来弥补X86固有的虚拟化的缺陷,可以翻译核心指令来代替那此不能虚拟化的指令,通过翻译后的 指令来直接访问虚拟硬件。全虚拟化的代表的例子有VMware 和 Vrirtual PC

  • 半虚拟化

在半虚拟化下,VMM需要操 作操作系统的协助才能完成对x86敏感特权指令的虚拟化。因而需要对Guest OS内核进行修改,以便操作系统能够自行对有缺陷的指令进行替换半虚拟化可以称为操作系统协助虚拟化,这种情况下,Guest OS是知道自己运行在虚拟机中的。半虚拟化的例子有Xen、Denali.

  • 硬件虚拟化

硬件虚拟化又称为硬件辅助虚拟化,就是说VMM需要 硬件的协助才能完成对硬件资源的虚拟。硬件虚拟化始于两大CPU厂商Intel和AMD分别提出的Intel-VT和AMD-V技术,其基本思想是引入新 的在指令和处理器运行模式,使VMM和Guest OS运行在不的模式下。
2、三种虚拟化技术比较

  • CPU虚拟化

在X86架构下,CPU虚拟化的核心问题是保证VCPU的正确执行,即需要解决物理CPU的虚拟化中的关键技术问题

  1. 全虚拟化
    在 全虚拟化下,CPU虚拟化是采用二进制代码动态翻译(Dynamic Binary Translation,DBT)即在执行时动态地重写虚拟机的执行代码,在需要VMM监控和模拟的位置插入陷入指令的技术,该技术的优势在于Guest OS能够不经修改直接在虚拟机上运行,其缺点则是动态翻译带来的一定性能开销。

  2. 半虚拟化
    半虚拟化技术通过修改 Guest OS的内核源代码,将待监控的操作系统替换为对VMM的超级调用(Hypercall)。该技术的优势在于避免了如“二进制代码动态翻译”这种开销较大的 方法,性能方面得到了很大提升;其缺点则是需要修改在Guest OS的源代码,使虚拟机上使用的操作系统类型受到了限制,不开源的操作系统(如Windows系统)就很难移植到半虚拟化的VMM平台上,英国剑桥大学开 发的著名的Xen系统就是采用半虚拟化技术实现其CPU的虚拟化。

  3. 硬件虚拟化
    Intel和AMD对X86架构 CPU的改进使X86硬件也能够支持“陷入--模式”方式的虚拟化,这就意味着,不需要对敏感和特权指令进行翻译或者修改Guest OSr的内核,VMM也能够很轻松地完成对CPU虚拟化的工作,硬件虚拟化提供了全新在架构,简化了VMM的设计和实现。并提升了其对虚拟机的掌控灵活度 和力度。

  • 内存虚拟化
    在CPU虚拟化之后,下一个关键是内存虚拟化,由于内存是虚拟机最频繁访问的设备之一,内存虚拟化的效率将对虚拟机的性能产生重大影响;而现代计算机通常都采用段页式存储管理、多级页表等复杂的存储体系结构,又给高性能内存虚拟化的设计带来很大挑战。
    VMM 通常采用分块共享的思想来虚拟计算物理内存,也是是说,VMM需要将机器的内存分配给各个虚拟机,并维护机器内存和虚拟机所见到的“物理内存”的映射关 系,使得那些内存在虚拟机看来是段从地址0开始的、连续的“物理”地址空间。为此,在操作系统原来的机器地址和虚拟地址之间新增加了一个内存虚拟化层,用 来表示这一段连续的“物理”地址空间,内存地址的层次由两层向三层的转变使得原来的内存管理单元(Memory Management Unit,MMU)失去了作用,因为普通的MMU只能完成一次的虚拟地址到物理地址的映射,但在虚拟机的环境一,经过MMU转换所得到的“物理地址”己不 是真正的硬件机器地址,如果需要得到真正的物理地址,必须由VMM介入,经这再次映射才能得到总线上使用的机器地址。如果虚拟机的每个内存访问操作都要由 VMM介入,则用软件模拟地址转换是不妥的,所有就有了两个解决方案:
    在半虚拟化技术中采用的是MMU半虚拟化以及在全虚拟化或硬件虚拟化中采用的影子页表

  1. MMU半虚拟化
    MMU 半虚拟化,可以理解为在VMM的帮助下,使Guest OS能够利用物理MMU一次完成由虚拟地址到机器地址的三层转换的技术,但是,实际上MMU不可能一次完成内存地址到的三层转换,而是由VMM在其中牵线 将中间地址层(客户机的“物理地址”)通过由VMM保管的一个转换表(机器地址到客户物理地址)消除而实现的,也就是说,经过MMU能够像在原来的操作系 统中一样直接完成由虚拟地址到机器地址的转换工作。

  2. 影子页表
    在全虚拟化或引入硬件虚拟化的虚拟机系统中,对于没 有修改过系统内核的Guest OS,其虚拟地址到机器地址的转换必须使用影子页表(Shadow Page Table)来实现,目的是消除客户物理地址层,使用MMU能够利用剩下的虚拟地址和机器地址完成地址转换。与半虚拟化技术将这个映射关系更新到 Guest OS的页表项不同,影子页表技术则是为Guest OS的每个页表维护一个“影子页表”,并将合成的映射关系(虚拟地址到机器地址)写入到这个“影子页表”中,Guest OS的页表内容则保持不变。最后,VMM将影子页表交给MMU进行地址转换。影子页表的引入使用内存虚拟化对于Guest OS 来说是完全透明的;Guest OS 所能见到是页表内容没有任何变化,也不需要向VMM注册页表页面,影子页表的分配的维护完全是在Guest OS之外的VMM中进行的。也是在当前硬件条件下进行内存全虚拟化的唯一方法,但是,维护影子页表的开销是很大的,主要包括时间开销和空间开销。

    1. 时间开销,由于Guest OS构造页表时不会主动通知VMM,VMM必须等到Guest OS发生缺页时,通才分析缺页原因,方能获得Guest OS所维护的地址映射关系(虚拟地址到客户物理地址),这种间接手段的效率要比半虚拟化的效率低很多。

    2. 空 间开销,VMM需要支持多个虚拟机同时运行,而每一个虚拟机的Guest OS通常会为其上运行的每个进程都创建一套页表系统,因此影子页表的空间开销会随着进程数量的增多而迅速增大,而Guest OS的进程数量对于VMM来说是不可控的,减小空间开销的一种方法只为当前进程的页表维护影子页表,这样做虽然可将空间开销 限制在常数级别,但是却大大增加了上下文切换的时间开销;VMM需要在Guest OS每个进程切换时重构新进程的所有影子页表,减少空间开销和时间开销的方法是使用影子页表缓存,即VMM在内存中维护部分最近使用过的影子页表,只有当 相关影子页表在缓存中找不到时,才构建一个新的。

  • I/O设备虚拟化
    除 了处理器和内存外,计算机的运行也离不开硬盘、显示器、键盘、鼠标等I/O设备,因此VMM还在需要对这些I/O设备进行虚拟化,并将其提供给虚拟机的 Guest OS,但是,由此VMM还需要对这些I/O设备进行虚拟化,并将其提供给虚拟机的Guest OS,但是,由于I/O设备具有异构性强、内部状态不易控制等特点,因此I/O设备虚拟化也一直虚拟化的技术的难点所在。
    在全虚拟化、半虚拟化以及硬件虚拟化中,I/O设备虚拟化都不尽相同,其核心在于I/O设备原生驱动的存放位置以及VMM对I/O设备的处理方式

  1. 全虚拟化
    在 全虚拟化下,由于不需要修改Guest OS内核,I/O设备的原生驱动存放在Guest OS中,但是VMM处理设备的方式会根据VMM的位置不同而有所不同,全虚拟化最具有代表的VMware ESX Server和 VMware Workstation 由于VMM实现模式不同,采用I/O设备虚拟化方法亦不同。
    在VMware ESX Server中,VMM采用的独立监视器模式,即VMM直接运行在物理硬件之上,直接操作硬件设备,而Guest OS看到的则一组统一的虚拟I/O设备,Guest OS 对这些虚拟设备的每一个I/O操作都会陷入(捕捉)VMM中,由于VMM对I/O指令进行解析并映射到实际物理设备,然后直接控制硬件完成。这种方法能够 获得较好的性能,对Guest OS是完全透明的,但是,由于VMM需要直接控制各种I/O设备,其设计会变得非常复杂,而且无法应对设备的快速更新
     VMware Workstation采用的宿主模式,即VMM实际上运行在一个传统操作系统上,这类VMM无法获得对硬件资源的完全控制,因此通常用软件模拟的方法来 虚拟I/O设备。Guest OS的I/O操作会被VMM捕获,并转交给宿主操作系统(Host OS)的一个用户态进程,该进程通过对宿主操作系统的系统调用来模拟设备的行为。
    模拟I/O虚拟化方法最大开销在于处理器模式的切换:包括从Guest OS到VMM的切换,以及从内核态的VMM到用户态的I/O模拟进程之间的切换。因此,对于采用模拟方法进行虚拟化的I/O设备,优化I/O性能的主要策略就是尽量减少模式切换。

  2. 半虚拟化
    在 半虚拟化下,修改Guest OS内核,将原生设备驱动从Guest OS中移出,放在一个经过VMM授权的设备虚拟机(Device VM)中,其余虚拟机中Guest OS的I/O请求都交由设备虚拟机处理。而在Guest OS内部,系统为每个虚拟I/O设备安装一个特殊的驱动程序(半虚拟化驱动程序,Paravirtualization Driver),由该驱动程序负责I/O请求的传递。设备虚拟化在经过VMM授权(其中的Guest OS具在直接访问物理I/O设备的特权)后,解析收到的I/O请求并映射到实际物理设备,最扣交给它的原生设备驱动程序来控制硬件完成。

  3. 硬件虚拟化
    目 前,硬件虚拟化技术广泛用于Xen。Xen在引入硬件虚拟化技术后,其VMM能够支持未假修改内核的Guest OS。尽管在未修改内核的Guest OS中含有I/O设备驱动程序,但是同Xen半虚拟化一样,Xen亦不允许Guest OS直接访问真实的物理设备,而是通过VMM单独授权的虚拟机间接访问。在Xen的辅助操作系统(即特权虚拟机)中采用设备模式(Device Model,DM),为未修改内核的Guest OS提供各种I/O设备的抽象,如显示器、硬件、鼠标、键盘、网卡设备等 。
    严格来讲,尽管这三种虚拟化方法在CPU虚拟化、内存虚拟化和I/O虚拟化中都采用了不同的技术,但是它们之间并不存在绝对的优劣之分,在现在的虚拟机系统中,的可能会采用几种虚拟技术相结合的方法,做到优劣互补

  4. 列表说明

wKioL1OAzVHByJV6AAJoJb1r-vc590.jpg

三、分类

注:结合虚拟化解决方案和计算系统结构及虚拟化实现所采用的抽象层次的角度对虚拟化系统进行分类

1、指令级虚拟化

指令级虚拟化又称为指令集架构级虚拟化(ISA虚拟化),它是通过纯软件方法,模拟出来与实际运行的操作系统不同的指令集去执行,采用这种方法构造出来的虚拟机一般称为模拟器(Emulator)。
一个成功的模拟器必须能够模拟真实机器所能做的一切事情,包含读ROM芯片、重启、系统开关等,指令级虚拟化的代表包括Bochs和QEMU等

  • Bochs

Bochs是由Kevil Lawon领导的一群爱好者用c++编定的开放源代码的X86PC模拟器,它可以运行在大多数最流行的平台上,包括X86、PowerPC、Alpha、Sun和MIPS,并可以编译、模拟大多数版本的x86机器;但是Bochs模拟x86软件需要额外的开销。

  • QEMU

QEMU是一个使用使便携式动态翻译器的快速处理器模拟器,它支持两种操作模式:
单纯用户空间模式和完整系统仿真模式,在前一个模式中,QEMU可以将在CPU上编译的Linux进程装载到另一个CPU中,或者跨编译进行交叉调试,在后一个模式中,QEMU可以模拟完整系统,包括处理器和外围设备。QEMU采用基本块作为独立的翻译单元,在动态翻译过程在,将遇到的每一块代码都转换成主机指令集,与Bochs不同的是,它支技多种处理器架构的模拟,包括x86、ARM、PowerPC和Sparc,而Bochs只支持x86的客户执行环境。另一个方面,使用的是动态翻译以达到比较高的代码运行速度。

2、硬件级的虚拟化

硬件抽象层(HAL)虚拟化实际上与指令集架构虚拟化非常相似,其不同之处在于这种类型的虚拟化所考虑的是一种特殊情况;客户执行环境和主机具有相同指令集的情况,并充分利用这一特点,让绝大多数客户指令在主机上直接执行,从而大大提高了执行的速度。如今大部分商业虚拟化软件均在流行的x86平台使用此虚拟化技术来提高效率,这说明了这类虚拟化技术的可行性与实用性,该虚拟化技术可将虚拟资源映射到物理资源并在虚拟机计算使用本地硬件,当虚拟机需要访问关键物理资源时,模拟器接管其物理资源并妥善地进行多路复用。
硬件级虚拟化是上目前研究最广泛的虚拟化技术,相应的虚拟化系统也较多,其中,业界最具影响的VMware和Xen都属于硬件级虚拟化的范畴。

  • VMware

VMware是EMC公司旗下独立的软件公司。主要研究在工业领域应用的大型主机级的虚拟化技术,并于1999年发布了它的第一款产品:基于主机在模型的桌面虚拟化软件VMware Workstation.,之后于2001年推出了面向企业服务器市场的VMware GSX Server和VMware ESX Server。

基于主机模型的桌面虚拟化软件VMware Workstation可以在Windows、Linux和MAC OS上运行。VMware Workstation 软件由3个部分组成:VMX驱动、安装在最高特权级0环的VMM以及在3环的VMware应用程序(VM App).VMX驱动器安装在操作系统内部,以使VMM获得所需要的特权级别。当软件执行时,VM App将VMMD载入带有VMX驱动的内核内存,并授予VMM最高的特权级。此时,主机操作系统仅知道VM App及VMX驱动的存在,并不知道VMM,更不知道VMM己经被加载到内核中。因此,整个硬件环境中存在主机操作系统和VMM两个执行环境:主机空间和VMM空间,VMM可以直接访问物理处理器,亦可以在通过VMX驱动与主机操作系统通信

wKiom1N_fn6CAf9nAADu9ZhA4NA239.jpg

  • KVM

KVM(Kernel-based Virtual Machine for Linux)是Delaware公司启动的开源项目,是第一个进入传统Linux内核(V2.6.20)虚拟机解决方案

KVM为Linux系统提供了一种新在划分机制。一般的linux进程有两个执行模式:内核模式(Kernel Mode)和用户模式(User Mode).KVM向Linux引入了一种除现在内核和用户模式之外新的进程模式,这种进程模式称为客户模式 (Guest Mode).客户模式有拥有自己的内核模式和用户模式,用来执行Guest os中的用户模式中的代码。

在KVM中,Linux系统内核通过添加内核自身成为系统管理程序,该内核模块导出一个名为/dev/kvm的设备,它可以启用内核的客户,在/dev/kvm设备的帮助下,VM使自己的地址空间独立于内核或运行着任何其他VM的地址空间。因为设备树(/dev)中的设备对于所有用户空间进程来说都是通用的,但在每个打开的/dev/kvm的进程看到的是不同的映射。这样支持了VM间的隔离。

在KVM中,内核、用户、客户三种模式的分工如下:

客户模式执行非I/O操作的Guest OS代码;内核模式转换到客户模式,并处理的那些由于I/O操作而从客户模式退出的代码或特殊指令;用户模式Guest OS 执行I/O操作。KVM结构也非常简单,由两部分在组成:设备驱动部分用来管理虚拟硬件,用户空间部分用来模拟PC硬件,这部分操作是通过修改QEMU完成的。

wKioL1N_h13SDFBAAAConxuOQmY934.jpg

3、操作系统级虚拟化

  • 硬件层次的虚拟机主要具有以下几个特性

  • 高度的隔离性(虚拟机和底层物理机器均实现隔离)

  • 易于让用户接受(和用户所习惯使用的普通机器看起来一样)

  • 支持不同操作系统和应用程序而不需要重启机器、低风险和易于维护性

由于这一层次的虚拟机可以直接对裸机进行访问,因此用户在调试或运行应用程序之前需要花费大量时间来安装和管理虚拟计算机,其中包括操作系统安装,应用套件安装以及网络配置等,这一层次的虚拟机和底层物理机器上的操作系统可以共享硬件资源,并在操作系统之上通过一个虚拟层(类型于VMware的VMM)来展现给用户多个独立的、隔离的机器。

操作系统级虚拟化的代表系统有 Linux-VServer、Virtuozzo(Open VZ)、LWVM(Leather-Weight Virtual Machine)等。

  • Virtuozzo(Open VZ)

Virtuozzo是一个基于操作系统的虚拟化解决方案,为用户提供虚拟环境(Virtual Environment, VE).VE用于安全隔离单个应用或一组相关应用。避免多个应用服务部署在同一台服务器时出现的相互干扰或冲突,使各应用能够完全隔离,和谐相处。Virtuozzo允许在单个物理服务器上创建多个独立的VE以实现硬件、软件许可证和管理资源的共享。VE为运行在其中的应用程序提供了完整的虚拟操作系统环境,它拥有自己的注册表、文件系统、进程号、用户名/安全标识符(SID),TCP/IP地址,内核等。所有的系统资源和标识也均被虚拟化。

Virtuozzo为用户建立的VE并不同于传统意义上的VM。VM采用虚拟硬件技术利用软件的方法模拟出一台机器。并在每个VM内部安装独立的操作系统。而VE无需要安装独立的操作系统。所有的VE共享相同的操作系统(部分应用程序),包括硬盘和内存。因为它本身提供了虚拟的操作系统环境,因此所有的VE仅需要维护一套操作系统映像。

Open VZ是Virtuozzo For Linux的开源项目,目前面向的是Linux内核程序员以及业内资深系统管理员。对于普通用户来说,使用Open VZ在技术实现和可靠性上并无不妥之处,但是,缺少全套管理工具、用户控制面板、迁移备份、后续技术支持等必备的环节。也缺少Windows版本支持,使得 Open VZ无法承担起实际运行环境的重任,更多的是作为一个支持Linux内核开发的研究项目。


====================完=========================