跳转至

虚拟化技术简介

什么是虚拟化?狭义地说,大家在日常生活中说到的虚拟化主要指的还是 虚拟机 (Virtual Machine),即通过虚拟化技术将一台计算机虚拟为多台逻辑计算机——这其实是虚拟化技术中的一个抽象粒度为单个计算机的分支:系统虚拟化

在计算机科学当中,虚拟化(Virtualization)指的其实是一种「将计算机的各种实体资源进行逻辑抽象,从而呈现出不同的虚拟资源」的资源管理技术。利用虚拟化技术,我们可以打破实体结构间不可切割的特性——一份实体资源可以对用户呈现为多份虚拟资源,多份实体资源也可以呈现为一份物理资源。

通过虚拟化技术,我们可以实现资源的动态分配、灵活调度、跨域共享等,从而提高资源的利用率。

overview.png

这里所说的实体资源包括CPU、内存、磁盘空间、网络适配器等。

这里笔者摘抄一段来自一本经典的虚拟化技术教材的叙述:

抽象来说,虚拟化是资源的逻辑表示,它不受物理限制的约束。具体来说,虚拟化技术的实现形式是在系统中加入一个虚拟层,虚拟化层将下层的资源抽象成另一形式的资源,提供给上层使用。通过空间上的分割、时间上的分时以及模拟,虚拟化可以将一份资源抽象成多分。反过来,虚拟化也可以将多份资源抽象成一份。

——《系统虚拟化:原理与实现》

即虚拟化技术的实现其实源自于现代计算机系统自下而上的多层抽象的结构:「每个层次都向上一层次呈现一个抽象,每一层只需要知道下层的抽象接口,而无需了解其内部运作机制」——我们不难想到的是,只要我们能够通过某种方式向上层提供表现相同的抽象接口,在上层看来我们就是正常的该层所提供的资源,从而就实现了对该层的虚拟化。

layer.png

由此,从物理层与虚拟层的两侧来看,我们便有了虚拟化中的两个重要定语:

  • Host」:物理资源方。
  • Guest」:虚拟资源方。

根据资源的不同,在这两个定语之后我们可以接不同的名词:例如我们将一台物理机器称之为 Host Machine (宿主机),将运行在其上的虚拟机称之为 Guest Machine (客户机);相应地,在宿主机上若运行有操作系统,则称之为 Host OS,而运行在虚拟机中的操作系统称之为 Guest OS

由此,我们将位于不同抽象层上的虚拟化分为如下类:

  • 硬件抽象层上的虚拟化:通过虚拟硬件抽象层来实现虚拟机器,为 Guest OS 呈现与物理硬件相同或相类似的硬件抽象层,也称之为「系统级虚拟化」(例如VMWare、Xen)。
  • 操作系统层上的虚拟化:通常指的是操作系统内核可以提供多个互相隔离的用户态实例(通常称之为容器),这些用户态实例对其用户而言就像是一台真实的计算机,有着自己独立的网络、文件系统等(例如 VServer)。
  • 库函数层上的虚拟化:通过虚拟化操作系统的应用级库函数的服务接口,使得应用程序不需要修改就可以在不同的操作系统中无缝运行(例如 Wine、WSL)。
  • 编程语言层上的虚拟化:这类虚拟机运行的是进程级别的不存在于硬件上的虚拟体系结构,其程序代码由虚拟机的运行时支持系统翻译成机器语言后再执行,属于进程级的虚拟化(例如 JVM)。

例如 Linux kernel 当中的 VFS 便是非常符合虚拟化这一概念的子系统:从上层调用的角度而言,我们所看到的都是统一的 API 接口,不同文件系统的具体实现则被隐藏在了 VFS 层的下方。我们只需要知道在这一抽象层中 open、read、write 等抽象 API 的用法,而无需关注底层的 ext4 或是 ntfs 的内部实现。

虚拟化亦是如此,从 Guest 侧我们所能看到的也只是统一的虚拟资源的接口,或者说 Host 为我们呈现出了虚拟化的资源接口,其表现的行为与实体设备是一致的。

我们日常所说的虚拟化技术主要是硬件抽象层上的虚拟化,即「系统级虚拟化」:通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。

针对实体资源类型的不同,我们还可以再细分为:

  • 计算虚拟化:针对 CPU 和内存资源进行虚拟化。
  • 网络虚拟化:针对网络链路资源进行虚拟化。
  • IO虚拟化:针对 IO 资源进行虚拟化。
  • 存储虚拟化:针对磁盘存储资源虚拟化。

系统虚拟化概述

基本模型

我们首先给虚拟机下一个定义:

  • 虚拟机(Virtual Machine)是计算机的虚拟化实例,拥有自己的虚拟硬件(如 CPU、内存、设备等),可执行与计算机几乎完全相同的功能,包括运行应用和操作系统。

对于一台计算机,我们可以简单地抽象成下图所示的三层模型,从下往上分别是物理硬件层、操作系统层、应用程序层,因此我们可以把一个虚拟机实例看作是一台具有如图所示层次的逻辑的计算机

但虚拟机的运行是需要有物理环境所支撑的,同时虚拟机实例也是不可能凭空出现/凭空消失的,因此接下来我们引入一个新的概念——VMM,即 Virtual Machine Monitor,又称 Hypervisor,这是一个介于 VM 与硬件中间的软件层,其负责 VM 的创建、销毁等工作,并为 VM 提供了运行环境:即 虚拟硬件抽象层

1974年,Gerald J. Popek 与 Robert P. Goldberg 发表了合作论文《Formal Requirements for Virtualizable Third Generation Architectures》,在论文中提出了满足虚拟化系统结构的 VMM 的三个充分条件,称之为Popek and Goldberg virtualization requirements

  • 等价性(essentially identical):一个运行于 VMM 下的程序,其行为应与直接运行于等价物理机上的同程序的行为完全一致
  • 资源控制(resource control):VMM 对虚拟资源具有完全的控制能力,包括资源的分配、监控、回收
  • 效率性(efficiency):机器指令中经常使用的那一部分应在没有 VMM 干预下直接在硬件上执行

由此,论文中提出了两种 Hypervisor 方案,这也成为了现在最主流的两种方案:

  • Type IHypervisor 直接运行在硬件上,即以 Hypervisor 作为 Host OS 直接管控硬件资源。例如 VMware ESXI 便是采用此种架构的 Hypervisor

Type I VMM

  • Type IIHypervisor 运行在传统的操作系统上,与其他应用程序并行运行。例如 QemuVMware Player 便是采用此种架构的 Hypervisor

Type II VMM

现在我们引入 敏感指令 (sensitive instructions)的概念,该类指令即为操作特权资源的指令,例如 IO 操作、修改页表寄存器等。为了我们的 VMM 能够完全地控制系统资源,敏感质量必须在 VMM 的监控审查下完成,或是经由 VMM 来完成。因此,若一个架构中所有的特权指令都是敏感指令,则我们可以使用特权级压缩(Ring Compression)的方式来实现虚拟环境:

  • VMM 运行在最高特权级上,Guest VM 运行在低特权级上,当 Guest VM 执行到敏感指令时,其便会陷入位于最高特权级的 VMM,此时便能由 VMM 模拟敏感指令的行为。

由此我们便获得了系统虚拟化的经典模型——Trap & Emulate

  • 我们将操作系统分为两个运行模式:「用户模式(user mode)」与「特权模式(privileged mode)」,在用户模式下只能直接执行非特权指令,当执行到特权指令时便会触发异常,从而陷入特权模式对应的处理代码中。
  • Guest VM 运行在用户模式下,从而使得普通指令可以直接放在 CPU 上执行,当 Guest VM 执行到敏感指令时,便会触发异常,此时由 VMM 介入并模拟其应有的行为

而由于硬件实体资源也有着不同的类型,我们将对不同类型实体资源的虚拟化技术分为如下类型:

  • CPU 虚拟化
  • 内存虚拟化
  • I/O 虚拟化

REFERENCE

《系统虚拟化:原理与实现》——Intel 开源软件技术中心

【VIRT.0x02】系统虚拟化导论

Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3C: System Programming Guide, Part 3

重学 Docker - part1: 虚拟化技术简述

Formal Requirements for Virtualizable Third Generation Architectures