3.2 虚拟化技术原理
到目前为止,虚拟化技术的各方面都有了进步,虚拟化也从纯软件的虚拟化逐深入到处理器级虚拟化,再到平台级虚拟化乃至输入/输出级虚拟化。对数据中心来说,虚拟化可以节约成本,最大化利用数据中心的容量和更好的保护数据。虚拟化技术已经成为私有云和混合云设计方案的基础。
本节将简单地介绍虚拟化技术原理,包括虚拟机的原理、CPU虚拟化原理、内存虚拟化原理以及网络虚拟化原理。
3.2.1 虚拟机技术原理
虚拟机(Virtual Machine,VM)是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。简单地说,虚拟机就是通过软件在宿主机上虚拟出一台计算机。虚拟机技术是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部分是不受现有资源的架设方式、地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和数据存储。在实际的生产环境中,虚拟机技术主要用来解决云数据中心和高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化地利用物理硬件。即将多个操作系统整合到一台高性能服务器上,最大化利用硬件平台的所有资源,用更少的投入实现更多的应用,还可以简化IT架构,降低管理资源的难度,避免IT架构的非必要扩张。而且虚拟机的真正硬件无关性还可以实现虚拟机运行时迁移,实现真正的不间断运行,从而最大化保持业务的持续性,不用为购买超高可用性平台而付出高昂的代价。
虚拟机技术实现了一台计算机同时运行多个操作系统,而且每个操作系统中都有多个程序运行,每个操作系统都运行在一个虚拟的CPU或虚拟主机上。虚拟机技术需要CPU、主板芯片组、BIOS和软件的支持,如VMM软件或者某些操作系统本身。
虚拟机技术的核心是虚拟机监视器VMM(Virtual Machine Monitor),VMM也称为Hypervisor。VMM的作用是向底层分配访问宿主机的硬件资源,向上管理虚拟机的操作系统和应用程序。它是一个宿主程序,该程序是一层位于操作系统和计算机硬件之间的代码,用来将硬件平台分割成多个虚拟机,实现一台计算机支持多个完全相同的执行环境。每个用户都会感觉到自己在一台独立的、与其他用户相隔离的计算机上进行操作,尽管事实上为每个用户提供服务的都是同一台机器。在此种情况下,一台虚拟机就是由一个潜在的控制程序管理的操作系统。VMM为每个客户操作系统虚拟一套独立于实际硬件的虚拟硬件环境(包括处理器、内存、I/O设备等)。VMM采用某种调度算法在各个虚拟机之间共享CPU,如采用时间片轮转调度算法。
虚拟机系统与实际的计算机操作系统没有区别,也会感染病毒,但是由于虚拟机是封闭的虚拟环境,如果虚拟机不与宿主机连接,则不会受宿主机病毒的影响。
3.2.2 CPU虚拟化原理
首先,CPU虚拟化的目的是为了允许让多个虚拟机可以同时运行在VMM中。CPU虚拟化技术是将单CPU模拟为多CPU,让所有运行在VMM之上的虚拟机可以同时运行,并且它们相互之间都是独立的,互不影响的,以提高计算机的使用效率。在计算机体系中,CPU是计算机的核心,没有CPU就无法正常使用计算机,所以,CPU能否正常被模拟成为虚拟机能否正常运行的关键。
从CPU设计原理上来说,CPU主要包含三大部分:运算器、控制器以及处理器寄存器。每种CPU都有自己的指令集架构(Instruction Set Architecture,ISA),CPU所执行的每条指令都是根据ISA提供的相应的指令标准进行的。ISA主要包含两种指令集:用户指令集(User ISA)和系统指令集(System ISA)。用户指令集一般指普通的运算指令,系统指令集一般指系统资源的处理指令。不同的指令需要有不同的权限,指令需要在与其相对应的权限才能体现指令执行效果。在X86的体系框架中,CPU指令权限一般分为4种,ring0、1、2、3,如图3-6所示。
最常用的CPU指令权限为0与3:权限为0的区域的指令一般只能内核可以运行,而权限为3的指令则是普通用户运行。而权限为1、2的区域一般被驱动程序所使用。想要从普通模式(权限为3)进入权限模式(权限为0)需要有以下三种情况之一发生:
● 异步的硬件中断,如磁盘读写等。
● 系统调用,如int、call等。
● 异常,如page fault等。
从上面内容可以看出,要实现CPU虚拟化,主要是要解决系统ISA的权限问题。普通的ISA不需要模拟,只需保护CPU运行状态,使得每个虚拟机之间的状态分隔即可。而需要权限的ISA则需要进行捕获与模拟。因此要实现CPU的虚拟化,就需要解决以下几个问题:
● 所有对虚拟机系统ISA的访问都要被VMM以软件的方式所模拟。即所有在虚拟机上所产生的指令都需要被VMM所模拟。
● 所有虚拟机的系统状态都必须通过VMM保存到内存中。
● 所有的系统指令在VMM处都有相对应的函数或者模块来对其进行模拟。
● CPU指令的捕获与模拟,是解决CPU权限问题的关键。如图3-7所示。
图3-6 CPU的4种指令权限
图3-7 CPU指令的捕获与模拟
CPU在正常执行指令时,如果是普通指令,不需要进行模拟,直接执行;而如果遇到需要权限的指令时,则会被VMM捕获到,并且控制权会转交到VMM中,由VMM确定执行这些需要权限的指令;VMM在模拟指令时,会产生与此指令相关的一系列指令集,并执行这些指令;在VMM执行完成后,控制权再交回给客户操作系统。
如下面的示例所示:
在虚拟化时,则会动态地变为与以下指令类似的指令:
当然真实的情况没有那么简单,并不是所有的CPU框架都支持类似的捕获,而且捕获这类权限操作所带来的性能负担可能是巨大的。并且,在指令虚拟化的同时,也需要实现CPU在物理环境中所存在的权限等级,即虚拟化出CPU的执行权限等级因为没有了权限的支撑,指令所执行出来的效果可能就不是想要得到的效果了。
为了提高虚拟化的效率与执行速度,VMM实现了二进制转换器BT(Binary Translator)与翻译缓存TC(Translation Cache)。BT负责指令的转换,TC用来储存翻译过后的指令。BT在进行指令转换一般有以下几种转换形式。
1)对于普通指令,直接将普通指令拷贝到TC中。这种方式称为“识别(Ident)”转换。
2)对某些需要权限的指令,通过一些指令替换的方式进行转换,这种方式称为“内联(Inline)”转换。
3)对其他需要权限的指令,需要通过模拟器进行模拟,并将模拟后的结果转交给VM才能达到虚拟化的效果。这种方式称为“呼出”(Call-out)转换。
因为指令需要进行模拟,所以有些操作所消耗的时间比较长,在全虚拟化的情况下,它的执行效果会比较低下,因此,才出现了半虚拟化与硬件辅助虚拟化两种另外的虚拟化技术,用于提高虚拟机运行的效率。
3.2.3 内存虚拟化原理
除去CPU的虚拟化以外,另一个关键的虚拟化技术是内存虚拟化。内存虚拟化是让每个虚拟机可以共享物理内存,VMM可以动态分配与管理这些物理内存,保证每个虚拟机都有自己独立的内存运行空间。虚拟机的内存虚拟化与操作系统中的虚拟内存管理有点类似。在操作系统中,应用程序所“看”到、用到的内存地址空间与这些地址在物理内存中是否连续是没有联系的。因为操作系统通过页表保存了虚拟地址与物理地址的映射关系,在应用程序请求内存空间时,CPU会通过内存管理单元(Memory Management Unit,MMU)与转换检测缓冲器(Translation Lookaside Buffer,TLB)自动地将请求的虚拟地址转换为与之相对应的物理地址。目前,所有X86体系的CPU都包含有MMU与TLB,用于提高虚拟地址与物理地址的映射效率。所以内存虚拟化也要将MMU与TLB在虚拟化的过程中一起解决。多个虚拟机运行在同一台物理设备上,真实物理内存只有一个,同时又需要使每个虚拟机独立运行,因此,需要VMM提供虚拟化的物理地址,即添加另外一层物理虚拟地址,则解决方案如图3-8所示。
图3-8 虚拟机内存分配
● 虚拟地址:客户虚拟机应用程序所使用的地址。
● 物理地址:由VMM提供的物理地址。
● 机器地址:真实的物理内存地址。
● 映射关系:包含两部分,客户机中的虚拟地址到VMM物理地址的映射;VMM物理地址到机器地址的映射。
从图3-8可以看出,客户虚拟机不能再通过MMU直接访问机器的物理地址,它所访问的物理地址则是由VMM所提供。即客户虚拟机以前的操作不变,同样保持了虚拟地址到物理地址的转换,只是在请求到真实的地址之前,需要再多一次地址的转换——VMM物理地址到机器地址的转换。通过两次内存地址的转换,可以实现客户虚拟机之间的相互独立运行,只是它们运行的效率会低很多。为了提高效率,引入了影子页表(Shadow Page Table),再后来的硬件辅助虚拟化的出现更进一步地提高了地址映射查询的效率,此处不再进一步讨论。
3.2.4 网络虚拟化原理
网络虚拟化提供了以软件的方式实现的虚拟网络设备,虚拟化平台通过这些虚拟网络设备可以实现与其他网络设备进行通信。而通信的对象可以是真实的物理网络设备,也可以是虚拟的网络设备。所以,网络虚拟化是要实现设备与设备之间的与物理连接没有关系的虚拟化连接。因此,网络虚拟化最主要解决的问题有两个,网络设备与虚拟连接。虚拟化的网络设备可以是单个网络接口,也可以是虚拟的交换机以及虚拟的路由器等。在同一个局域网内,任何两个不同的虚拟设备都可以实现网络的连接;如果不是在同一个网内,则需要借助到网络协议才能实现网络的正常连接与通信,如VLAN(Virtual Local Area Network)、VPN(Virtual Private Network)等协议。
以VLAN为例简单说明网络虚拟化的连接与通信。VLAN将网络结点按需划分成若干个逻辑工作组,每一个逻辑工作组就对应一个虚拟网络。每一个虚拟网络就像是一个局域网,不同的虚拟网络之间相互独立,无法连接与通信。如果需要通信,则需要路由设备的协助,转发报文才能正常通信。由于这些分组都是逻辑的,所以这些设备不受物理位置的限制,只要网络交换设备支持即可。