虚拟化(技术)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境。
分区技术使得虚拟化层为多个虚拟机划分服务器资源的能力;使您能够在一台独立服务器上运行多个应用程序,每个操作系统只能看到虚拟化层为其提供的虚拟硬件。
虚拟机隔离让虚拟机是互相隔离,一个虚拟机的崩溃或故障(例如,操作系统故障、应用程序崩溃、驱动程序故障等等)不会影响同一服务器上的其它虚拟机。推荐阅读:《什么是服务器虚拟化?》
封装意味着将整个虚拟机(硬件配置、BIOS 配置、内存状态、磁盘状态、CPU 状态)储存在独立于物理硬件的一小组文件中。这样,您只需复制几个文件就可以随时随地根据需要复制、保存和移动虚拟机。
对于一台计算机,我们可以简单的划分为三层:从下到上依次是物理硬件层,操作系统层、应用程序层。
在计算机技术的发展历史上,出现了两种著名的方案,分别是I型虚拟化和II型虚拟化。
图中的VMM意为Virtual Machine Monitor,虚拟机监控程序,或者用另一个更专业的名词:HyperVisor
全虚拟化:VMware 二进制翻译技术
不同于8086时代16位实地址工作模式,x86架构进入32位时代后,引入了保护模式、虚拟内存等一系列新的技术。同时为了安全性隔离了应用程序代码和操作系统代码,其实现方式依赖于x86处理器的工作状态。
这就是众所周知的x86处理器的Ring0-Ring3四个“环”。
操作系统内核代码运行在最高权限的Ring0状态,应用程序工作于最外围权限最低的Ring3状态,剩下的Ring1和Ring2主流的操作系统都基本上没有使用。
这里所说的权限,有两个层面的约束:
- 能访问的内存空间
- 能执行的特权指令
来关注一下第二点,特权指令。
CPU指令集中有一些特殊的指令,用于进行硬件I/O通信、内存管理、中断管理等等功能,这一些指令只能在Ring0状态下执行,被称为特权指令。这些操作显然是不能让应用程序随便执行的。处于Ring3工作状态的应用程序如果尝试执行这些指令,CPU将自动检测到并抛出异常。推荐阅读:《虚拟化技术——服务器虚拟化》
回到我们的主题虚拟化技术上面来,如同前面的定义所言,虚拟化是将计算资源进行逻辑或物理层面的切割划分,构建出一个个独立的执行环境。
按照我们前面所说的陷阱 & 模拟手段,可以让虚拟机中包含操作系统在内的程序统一运行在低权限的Ring3状态下,一旦虚拟机中的操作系统进行内存管理、I/O通信、中断等操作时,执行特权指令,从而触发异常,物理机将异常派遣给VMM,由VMM进行对应的模拟执行。
这本来是一个实现虚拟化很理想的模式,不过x86架构的CPU在这里遇到了一个跨不过去的坎。到底是什么问题呢?
回顾一下前面描绘的理想模式,要这种模式能够实现的前提是执行敏感指令的时候能够触发异常,让VMM有机会介入,去模拟一个虚拟的环境出来。
但现实是,x86架构的CPU指令集中有那么一部分指令,它不是特权指令,Ring3状态下也能够执行,但这些指令对于虚拟机来说却是敏感的,不能让它们直接执行。一旦执行,没法触发异常,VMM也就无法介入,虚拟机就露馅儿了!
这结果将导致虚拟机中的代码指令出现无法预知的错误,更严重的是影响到真实物理计算机的运行,虚拟化所谓的安全隔离、等价性也就无从谈起。
怎么解决这个问题,让x86架构CPU也能支持虚拟化呢?
VMware和QEMU走出了两条不同的路。
VMware创造性的提出了一个二进制翻译技术。VMM在虚拟机操作系统和宿主计算机之间扮演一个桥梁的角色,将虚拟机中的要执行的指令“翻译”成恰当的指令在宿主物理计算机上执行,以此来模拟执行虚拟机中的程序。你可以简单理解成Java虚拟机执行Java字节码的过程,不同的是Java虚拟机执行的是字节码,而VMM模拟执行的就是CPU指令。
另外值得一提的是,为了提高性能,也并非所有的指令都是模拟执行的,VMware在这里做了不少的优化,对一些“安全”的指令,就让它直接执行也未尝不可。所以VMware的二进制翻译技术也融合了部分的直接执行。
对于虚拟机中的操作系统,VMM需要完整模拟底层的硬件设备,包括处理器、内存、时钟、I/O设备、中断等等,换句话说,VMM用纯软件的形式“模拟”出一台计算机供虚拟机中的操作系统使用。
这种完全模拟一台计算机的技术也称为全虚拟化,这样做的好处显而易见,虚拟机中的操作系统感知不到自己是在虚拟机中,代码无需任何改动,直接可以安装。而缺点也是可以想象:完全用软件模拟,转换翻译执行,性能堪忧!
而QEMU则是完全软件层面的“模拟”,乍一看和VMware好像差不多,不过实际本质是完全不同的。VMware是将原始CPU指令序列翻译成经过处理后的CPU指令序列来执行。而QEMU则是完全模拟执行整个CPU指令集,更像是“解释执行”,两者的性能不可同日而语。推荐相关阅读:《虚拟化和云计算的区别》