静态迁移
静态迁移:也叫做常规迁移、离线迁移(Offline Migration)。就是在虚拟机关机或暂停的情况下从一台物理机迁移到另一台物理机。因为虚拟机的文件系统建立在虚拟机镜像上面,所以在虚拟机关机的 情况下,只需要简单的迁移虚拟机镜像和相应的配置文件到另外一台物理主机上;如果需要保存虚拟机迁移之前的状态,在迁移之前将虚拟机暂停,然后拷贝状态至目的主机,最后在目的主机重建虚拟机状态,恢复执行。这种方式的迁移过程需要显式的停止虚拟机的运行。从用户角度看,有明确的一段停机时间,虚拟机上的服务不可用。这种迁移方式简单易行,适用于对服务可用性要求不严格的场合。
共享存储的动态迁移
动态迁移(Live Migration):也叫在线迁移(Online Migration)。就是在保证虚拟机上服务正常运行的同时,将一个虚拟机系统从一个物理主机移动到另一个物理主机的过程。该过程不会对最终用户造成明 显的影响,从而使得管理员能够在不影响用户正常使用的情况下,对物理服务器进行离线维修或者升级。与静态迁移不同的是,为了保证迁移过程中虚拟机服务的可 用,迁移过程仅有非常短暂的停机时间。迁移的前面阶段,服务在源主机的虚拟机上运行,当迁移进行到一定阶段,目的主机已经具备了运行虚拟机系统的必须资 源,经过一个非常短暂的切换,源主机将控制权转移到目的主机,虚拟机系统在目的主机上继续运行。对于虚拟机服务本身而言,由于切换的时间非常短暂,用户感 觉不到服务的中断,因而迁移过程对用户是透明的。动态迁移适用于对虚拟机服务可用性要求很高的场合。
SR-IOV
SR-IOV是标准化组织PCI-SIG提出的一种共享PCIe设备的标准,SR-IOV网卡除了本身的PCIe物理功能(Physical Function,PF)之外,还会呈现出多个相关联的轻量级PCIe虚拟功能(Virtual Function,VF),其由PF进行配置与管理,每个VF都能够直接分配给VM使用,增加了硬件的复用性。VM绕过了VMM的干预,并且借助输入/输出内存管理单元(Input/output memory management unit,IOMMU)的DMA重映射与中断重映射,直接与所分配的VF传输数据,这种方式 虽然提升了I/O性能,但是破坏了网络虚拟化的服务透明性,给VM的在线迁移带来了困难。
虚拟机器监视器(Hypervisor)
Hypervisor,又称虚拟机器监视器(英语:virtual machine monitor,缩写为 VMM),它为在系统上“虚拟”运行的系统提供一套虚拟化硬件件。被Hypervisor用来执行一个或多个虚拟机器的电脑称为主体机器(host machine),这些虚拟机器则称为客体机器(guest machine)。
Passthrough模型
Passthrough I/O模型是指在客户机内部能够直接对硬件进行操作,如下图所示。
Passthrough模型将设备独占式地分配给指定的客户域,使该域具有最高的I/O访问性能。
这样做的优点:
1. 不需模拟设备进行请求转换,故访问速度高;
2. 客户机能根据最新硬件,加载对应驱动,可充分发挥新硬件的功能;
3. 客户机可直接操纵硬件设备,提供了I/O性能。
Passthrough技术与基于软件的虚拟化I/O模型相比的优势:
1. 可直接对I/O设备进行操作,降低了CPU的开销;
2. I/O操作不需要经过一个有特权的客户机,不存在I/O瓶颈问题;
3. 不需要修改客户机驱动;
4. VMM的设计相对简单,可移植性较好。
当然,Passthrough技术也存在不足:
1. Passthrough最大程度上提供I/O性能是以牺牲设备共享能力为代价的;
2. Passthrough I/O中的设备只能被某个客户机所独占,难以充分发挥I/O设备的利用率。
特权级别
大部分的现代计算机体系结构都有两个或两个以上的特权级别,用来分隔内核和应用软件。以x86为例,为了得到更高的保护控制,在x86的保护模式下定义了当前特权级别(Current Previleged Level,简称CPL),一共有四个特级层次(0 to 3)被定义,我们一般称之为Ring。Ring后面的数字越大特权越小,我们的操作系统一般都运行在Ring0上,而Ring1和2一般用来支持设备驱动,Ring3上面跑的就是应用软件了。而在现在的x86处理器中,64位架构已经非常普遍,64位CPU因为必须支持页表模式,所以只有两个特权级别,我们可以简单理解为Ring0和Ring3(实际上另有明确定义),这种模型我们常称为0/3模型。
系统中有一些关键操作指令只能在最高特权级别上执行,它们一般被称为特权指令,特权指令仅仅在当前的特权级别为零时(CPL=0)才会执行。如果在非特权级别上试图执行特权指令,将生成一个一般保护异常(这通常会生成一个应用程序错误),而非特权指令则可以在任何一个权限级别执行。
敏感指令
在虚拟化世界的VMM模型中,我们可以看到所有的客户机操作系统都运行在非特权模式下,即非Ring0级。因为Guest OS已经不处在特权级别,所以存在一部分原本应该在特权级别执行但现在因为层级权限不够必须转交VMM进行处理的指令,这部分指令就叫敏感指令。
临界指令
而根据Popek和Goldberg的定义,指令集支持虚拟化的前提是:所有敏感指令都是特权指令。很可惜x86指令集不能满足这个要求,这是它和RISC架构相比的一个不足。
在IBM之类的RISC指令集方面,因为敏感指令全部是特权指令,所以敏感指令的执行都可以被VMM捕获,而在x86方面,因为有一部分敏感指令不属于特权指令,变成了非特权指令,而非特权指令在较低的特权级别上是可以直接执行的,也就是说VMM不会处理这些指令。这样就势必会带来问题,试想一个不受虚拟化软件层控制的指令却工作在虚拟化层之上,这是怎样一个情景?x86至少有十几条敏感指令是不会引发异常的非特权指令,在IA-32指令集中,我们称这些非特权级别的敏感指令为临界指令。
半虚拟化
前面提到x86体系结构中,部分敏感指令不是特权指令,这些指令不能自动产生异常,因此想要系统正常运行就必须要捕获这些指令。于是Xen采用修改Guest OS内核的方法对这些有缺陷的指令进行替换。在这种模式下,Xen位于操作系统和硬件之间,为其上运行的Guest OS内核提供虚拟化的硬件环境。这时候,Xen运行在最高特权级的ring0,操作系统被特权解除,运行在ring1,ring3运行应用程序,构成虚拟机系统中的“0/1/3模型”。当Xen占据最高特权级时,在Xen下运行的Guest OS内核将无法运行某些特权指令,并将产生一般保护错误,Xen必须通过超级调用向提供执行这些特权指令的接口。下图是虚拟化前后的特权级的变化。
参考文献:
[1] http://www.cnblogs.com/zhuguihua/archive/2012/11/03/2752841.html
[2] http://www.voidcn.com/blog/u014276460/article/p-3964672.html
[3] http://www.mcplive.cn/index.PHP/article/index/id/5788/page/5