什么是虚拟化
维基百科关于虚拟化的定义是:“In computing,virtualization refers to the act of creating a virtual(rather than actual)version of something,including virtual computer hardware platforms,storage devices,and computer network resources。”(在计算机领域,虚拟化指 创建某事物的虚拟(而非实际)版本,包括虚拟的计算机硬件平台、存储设备,以及计算 机网络资源)可见,虚拟化是一种资源管理技术,它将计算机的各种实体资源(CPU、内 存、存储、网络等)予以抽象和转化出来,并提供分割、重新组合,以达到最大化利用物 理资源的目的。
如图所示的Virtual Machine Monitor(VMM,虚拟机监控器,也称为Hypervisor) 层,就是为了达到虚拟化而引入的一个软件层。它向下掌控实际的物理资源(相当于原本的操作系统);向上呈现给虚拟机N份逻辑的资源。为了做到这一点,就需要将虚拟机对物理资源的访问“偷梁换柱”——截取并重定向,让虚拟机误以为自己是在独享物理资源。虚拟机监控器运行的实际物理环境,称为宿主机;其上虚拟出来的逻辑主机,称为客户机。
软件虚拟化技术
软件虚拟化,顾名思义,就是通过软件模拟来实现VMM层,通过纯软件的环境来模 拟执行客户机里的指令。 最纯粹的软件虚拟化实现当属QEMU。
硬件虚拟化技术
硬件虚拟化技术就是指计算机硬件本身提供能力让客户机指令独立执行,而不需要 (严格来说是不完全需要)VMM截获重定向。
以x86架构为例,它提供一个略微受限制的硬件运行环境供客户机运行,在绝大多数情况下,客户机在此受限环境中运行与原生系统在非虚拟化环境 中运行没有什么两样,不需要像软件虚拟化那样每条指令都先翻译再执行,而VMM运行 在root mode,拥有完整的硬件访问控制权限。仅仅在少数必要的时候,某些客户机指令 的运行才需要被VMM截获并做相应处理,之后客户机返回并继续在non-root mode中运 行。可以想见,硬件虚拟化技术的性能接近于原生系统,并且,极大地简化了VMM的 软件设计架构。
Intel从2005年就开始在其x86 CPU中加入硬件虚拟化的支持——Intel Virtualization Technology,简称Intel VT。到目前为止,在所有的Intel CPU中,都可以看到Intel VT的身 影。并且,每一代新的CPU中,都会有新的关于硬件虚拟化支持、改进的feature加入。也 因如此,Intel x86平台是对虚拟化支持最为成熟的平台
############################################################################### 最理想的虚拟化的两个目标如下:
1)客户机完全不知道自己运行在虚拟化环境中,还以为自己运行在原生环境里。
2)完全不需要VMM介入客户机的运行过程。 纯软件的虚拟化可以做到第一个目标,但性能不是很好,而且软件设计的复杂度大大 增加。
半虚拟化
让客户机意识到自己是运行在虚拟化环境里,并做相应 修改以配合VMM,这就是半虚拟化(Para-Virtualization)。
一方面,可以提升性能和简 化VMM软件复杂度;另一方面,也不需要太依赖硬件虚拟化的支持,从而使得其软件设 计(至少是VMM这一侧)可以跨平台且是优雅的。“本质上,准虚拟化弱化了对虚拟机特 殊指令的被动截获要求,将其转化成客户机操作系统的主动通知。但是,准虚拟化需要修 改客户机操作系统的源代码来实现主动通知。”典型的半虚拟化技术就是virtio,使用virtio 需要在宿主机/VMM和客户机里都相应地装上驱动。
全虚拟化
与半虚拟化相反的,全虚拟化(Full Virtualization)坚持第一个理想化目标:客户机 的操作系统完全不需要改动。敏感指令在操作系统和硬件之间被VMM捕捉处理,客户操 作系统无须修改,所有软件都能在虚拟机中运行。因此,全虚拟化需要模拟出完整的、和 物理平台一模一样的平台给客户机,这在达到了第一个目标的同时也增加了虚拟化层 (VMM)的复杂度。
性能上,2005年硬件虚拟化兴起之前,软件实现的全虚拟化完败于VMM和客户机操 作系统协同运作的半虚拟化,这种情况一直延续到2006年。之后以Intel VT-x、VT-d为 代表的硬件虚拟化技术的兴起,让由硬件虚拟化辅助的全虚拟化全面超过了半虚拟化。但 是,以virtio为代表的半虚拟化技术也一直在演进发展,性能上只是略逊于全虚拟化,加 之其较少的平台依赖性,依然受到广泛的欢迎。
Type1和Type2虚拟化
从软件框架的角度上,根据虚拟化层是直接位于硬件之上还是在一个宿主操作系统之 上,将虚拟化划分为Typel和Type2<