系统架构设计笔记(104)—— 虚拟化
虚拟化( Virtualization )技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在 20 世纪 70 年代的System3 70 系列中逐渐流行起来,这些机器通过一种叫虚拟机监控器( Virtual Machine Monitor , VMM )的程序在物理硬件之上生成许多可以运行独立操作系统软件的虚拟机( Virtual Machine )实例。随着近年多核系统 、 集群 、 网格甚至云计算的广泛部署,虚拟化技术在商业应用上的优势日益体现,不仅降低了 IT 成本,而且还增强了系统安全性和可靠性,虚拟化的概念也逐渐深入到人们日常的工作与生活中。
虚拟化是一个广义的术语,对于不同的人来说可能意味着不同的东西,这要取决他们所处的环境。在计算机科学领域中,虚拟化代表着对计算资源的抽象,而不仅仅局限于虚拟机的概念。例如对物理内存的抽象,产生了虚拟内存技术,使得应用程序认为其自身拥有连续可用的地址空间( Address Space ),而实际上,应用程序的代码和数据可能被分隔成多个碎片页或段,甚至被交换到磁盘 、 闪存等外部存储器上,即使物理内存不足,应用程序也能顺利执行。
1 虚拟化技术的分类
虚拟化技术是一个非常广的概念,所以其具体内容可分成不同层面的几大类型。
1.1 平台虚拟化
平台虚拟化( Platform Virtualization )是针对计算机和操作系统的虚拟化。我们通常所说的虚拟化主要是指平台虚拟化技术,通过使用控制程序( Control Program ,也称为 Virtual Machine Monitor 或 Hypervisor ),隐藏特定计算平台的实际物理特性,为用户提供抽象的 、 统一的 、 模拟的计算环境。虚拟机中运行的操作系统称为客户机操作系统( Guest OS ),运行虚拟机监控器的操作系统称为主机操作系统( Host OS ),当然某些虚拟机监控器可以脱离操作系统直接运行在硬件之上(如 VMWARE 的 ESX 产品)。运行虚拟机的真实系统称为主机系统。
hypervisor /ˈhaɪpərvaɪzər/
平台虚拟化技术又可以细分为如下几个子类:
(1)全虚拟化
全虚拟化( Full Virtualization )是指虚拟机模拟了完整的底层硬件,包括处理器 、 物理内存 、 时钟 、 外设等,使得为原始硬件设计的操作系统或其他系统软件完全不作任何修改就可以在虚拟机中运行。操作系统与真实硬件之间的交互可以看成是通过一个预先规定的硬件接口进行的。
全虚拟化 VMM ( Virtual Machine Monitor )以完整模拟硬件的方式提供全部接口(同时还必须模拟特权指令的执行过程)。举例而言, x86 体系结构中,对于操作系统切换进程页表的操作,真实硬件通过提供一个特权 CR3 寄存器来实现该接口,操作系统只需执行 "mov pgtable , %%cr3" 汇编指令即可。全虚拟化 VMM 必须完整地模拟该接口执行的全过程。如果硬件不提供虚拟化的特殊支持,那么这个模拟过程将会十分复杂:一般而言, VMM 必须运行在最高优先级来完全控制主机系统,而 Guest OS 需要降级运行,从而不能执行特权操作。当 Guest OS 执行前面的特权汇编指令时,主机系统产生异常( General Protection Exception ),执行控制权重新从 Guest OS 转到 VMM 手中。 VMM 事先分配一个变量作为影子 CR3 寄存器给 Guest OS ,将 pgtable 代表的客户机物理地址( Guest Physical Address )填入影子 CR3 寄存器,然后 VMM 还需要 pgtable 翻译成主机物理地址( Host Physical Address )并填入物理 CR3 寄存器,最后返回到 Guest OS 中。随后 VMM 还将处理复杂的 Guest OS 缺页异常( Page Fault )。
比较著名的全虚拟化 VMM 有Microsoft Virtual PC 、 VMware Workstation 、 SUNVirtual Box 、 Parallels Desktopfor Mac和 QEMU。
(2)超虚拟化
超虚拟化( Paravirtualization )是一种修改 Guest OS 部分访问特权状态的代码以便直接与 VMM 交互的技术。在超虚拟化虚拟机中,部分硬件接口以软件的形式提供给客户机操作系统,这可以通过 Hypercall ( VMM 提供给 Guest OS 的直接调用,与系统调用类似)的方式来提供。例如, Guest OS 把切换页表的代码修改为调用 Hypercall 来直接完成修改影子 CR3 寄存器和翻译地址的工作。由于不需要产生额外的异常和模拟部分硬件执行流程,超 虚拟化可以大幅度提高性能,比较著名的 VMM 有 Denali、Xen。
hyper- /ˈhaɪpər/
Over; above; beyond;
(3)硬件辅助虚拟化
硬件辅助虚拟化( Hardware-Assisted Virtualization )是指借助硬件(主要是主机处理器)的支持来实现高效的全虚拟化。例如有了 Intel-VT 技术的支持, Guest OS 和 VMM 的执行环境自动地完全隔离开来, Guest OS 有自己的 “ 全套寄存器 ” ,可以直接运行在最高级别。因此在上面的例子中, Guest OS 能够执行修改页表的汇编指令。 Intel-VT 和 AMD-V 是目前 x86 体系结构上可用的两种硬件辅助虚拟化技术。
(4)部分虚拟化
部分虚拟化( Partial Virtualization )中, VMM 只模拟部分底层硬件,因此客户机操作系统不作修改是无法在虚拟机中运行的,其他程序可能也需要进行修改。在历史上,部分虚拟化是通往全虚拟化道路上的重要里程碑,最早出现在第一代的分时系统 CTSS 和 IBMM44/44X 实验性的分页系统中。
(5)操作系统级虚拟化
在传统操作系统中,所有用户的进程本质上是在同一个操作系统的实例中运行,因此内核或应用程序的缺陷可能影响到其他进程。操作系统级虚拟化( Operating System Level Virtualization )是一种在服务器操作系统中使用的轻量级的虚拟化技术,内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程,不同实例中的进程完全不了解对方的存在。比较著名的有 Solaris Container、FreeBSD Jail 和 OpenVZ 等。
1.2 资源虚拟化
资源虚拟化(Resource Virtualization),针对特定的系统资源的虚拟化,比如内存、存储、 网络资源等。
1.3 应用程序虚拟化
应用程序虚拟化( Application Virtualization ),包括仿真 、 模拟 、 解释技术等。虽然上面对虚拟化的分类已较为精确,但这种分类并不是绝对的,一个优秀的虚拟化软件往往融合了多项技术。例如 VMware Workstation 是一个著名的全虚拟化的 VMM ,但是它使用了一种被称为动态二进制翻译的技术把对特权状态的访问转换成对影子状态的操作,从而避免了低效的 Trap-And-Emulate 的处理方式,这与超虚拟化相似,只不过超虚拟化是静态地修改程序代码。
对于超虚拟化而言,如果能利用硬件特性,那么虚拟机的管理将会大大简化,同时还能保持较高的性能。
2 虚拟化的模式
虚拟化可以通过很多方法来证实。它不是一个单独的实体,而是一组模式和技术的集合,这些技术提供了支持资源的逻辑表示所需的功能,以及通过标准接口将其呈现给这些资源的消费者所需的功能。这些模式本身都是前面介绍过的各种不同虚拟形式的重复出现。
2.1 单一资源多个逻辑表示
这种模式是虚拟化最广泛使用的模式之一。它只包含一个物理资源,但是它向消费者呈现的逻辑表示却仿佛它包含多个资源一样。消费者与这个虚拟资源进行交互时就仿佛自己是唯一的消费者一样,而不会考虑他正在与其他消费者一起共享资源。
2.2 多个资源单一逻辑表示
这种模式包含了多个组合资源,以便将这些资源表示为提供单一接口的单个逻辑表示形式。在利用多个功能不太强大的资源来创建功能强大且丰富的虚拟资源时,这是一种非常有用的模式。存储虚拟化就是这种模式的一个例子。在服务器方面,集群技术可以提供这样的幻想:消费者只与一个系统(头节点)进行交互,而集群事实上可以包含很多的处理器或节点。实际上,这就是从 IT 技术设施的角度看到的网格可以实现的功能。
2.3 在多个资源之间提供单一逻辑表示
这种模式包括一个以多个可用资源之一的形式表示的虚拟资源。虚拟资源会根据指定的条件来选择一个物理资源实现,例如资源的利用 、 响应时间或邻近程度。尽管这种模式与上一种模式非常类似,但是它们之间有一些细微的差别。首先,每个物理资源都是一个完整的副本,它们不会在逻辑表示层上聚集在一起。其次,每个物理资源都可以提供逻辑表示所需要的所有功能,而不是像前一种模式那样只能提供部分功能。这种模式的一个常见例子是使用应用程序容器来均衡任务负载。在将请求或事务提交给应用程序或服务时,消费者并不关心到底是几个容器中执行的哪一个应用程序的副本为请求或事务提供服务。消费者只是希望请求或事务得到处理。
2.4 单个资源单一逻辑表示
这是用来表示单个资源的一种简单模式,就仿佛它是别的什么资源一样。启用 Web 的企业后台应用程序就是一个常见的例子。在这种情况下,我们不是修改后台的应用程序,而是创建一个前端来表示 Web 界面,它会映射到应用程序接口中。这种模式允许通过对后台应用程序进行最少的修改(或根本不加任何修改)来重用一些基本的功能。也可以根据无法修改的组件,使用相同的模式构建服务。
2.5 复合或分层虚拟
这种模式是前面介绍的一种或多种模式的组合,它使用物理资源来提供丰富的功能集。信息虚拟化是这种模式一个很好的例子。它提供了底层所需要的功能,这些功能用于管理对资源 、 包含有关如何处理和使用信息的元数据,以及对信息进行处理的操作的全局命名和引用。例如 Open Grid Services Architecture ( OGSA )或者 Grid Computing Components ,实际上都是虚拟化的组合或虚拟化的不同层次。