虚拟化

在计算机技术中，虚拟化（技术）或虚拟技术（Virtualization）是一种资源管理技术，是将计算机的各种实体资源（CPU、内存、磁盘空间、网络适配器等），予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑组态环境。由此，打破实体结构间的不可切割的障碍，使用户可以比原本的组态更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式，地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料储存。

## 定义

由于目前信息技术领域的很多企业都曾在宣传中将该企业的某种技术称为虚拟化技术，这些技术涵盖的范围可以从Java虚拟机技术到系统管理软件，这就使得准确的界定虚拟技术变得困难。因此各种相关学术论文在谈到虚拟技术时常常提到的便是如前面所提到的那个不严格的定义。

<image>

## 历史

虚拟化技术起源于20世纪60年代末，美国IBM公司当时开发了一套被称作虚拟机监视器（Virtual Machine Monitor）的软件，该软件作为计算机硬件层上面的一层软件抽象层，将计算机硬件虚拟分割成一个或多个虚拟机，并提供多用户对大型计算机的同时、交互访问。

## 虚拟化技术的类别

### 按虚拟的对象分类

- 硬件虚拟化
- 虚拟机（Virtual machine或VM），可以像真实机器一样运行程序的计算机的软件实现
- 平台虚拟化，将操作系统和硬件平台资源分割开
- 完全虚拟化，敏感指令在操作系统和硬件之间被捕捉处理，客户操作系统无需修改，所有软件都能在虚拟机中运行，例如IBM CP/CMS，VirtualBox，VMware，QEMU
- 硬件辅助虚拟化，利用硬件（主要是CPU）辅助处理敏感指令以实现完全虚拟化的功能，客户操作系统无需修改，例如VMware，Xen，KVM，Hyper-V
- 部分虚拟化，针对部分应用程序进行虚拟，而不是整个操作系统
- 准虚拟化/超虚拟化（paravirtualization），为操作系统提供与底层硬件相似但不相同的软件接口，客户操作系统需要进行修改。例如Xen的半虚拟化模式，Hyper-V，KVM的VirtIO。
- 操作系统级虚拟化，使操作系统内核支持多用户空间实体，例如Parallels Virtuozzo Containers、OpenVZ、LXC以及类Unix系统上的chroot，Solaris上的Zone，FreeBSD上的FreeBSD jail。
- 应用程序虚拟化，在操作系统和应用程序间建立虚拟环境
- 便携式应用程序，允许程序在便携式设备中运行而不用在操作系统中安装
- 跨平台虚拟化，允许针对特定CPU或者操作系统的软件不做修改就能运行在其他平台上，例如Wine
- 虚拟设备，运行于虚拟化平台之上，面向应用的虚拟机映像
- 模拟器
- 虚拟内存，将不相邻的内存区，甚至硬盘空间虚拟成统一连续的内存地址
- 存储虚拟化，将实体存储空间（如硬盘）分隔成不同的逻辑存储空间
- 网络虚拟化，将不同网络的硬件和软件资源结合成一个虚拟的整体
- 虚拟专用网络（VPN），在大型网络（通常是Internet）中的不同计算机（节点）通过加密连接而组成的虚拟网络，具有类似局域网的功能
- 存储器虚拟化，将网络系统中的随机存储器聚合起来，形成统一的虚拟内存池
- 桌面虚拟化，在本地计算机显示和操作远程计算机桌面，在远程计算机执行程序和储存信息
- 数据库虚拟化
- 软件虚拟化
- 服务虚拟化
- 数据虚拟化 (data virtualization), 数据虚拟化是一种统一来自多个来源的数据的方法，这样应用程序，报告工具和最终用户就可以访问数据，而不需要有关原始来源，位置和数据结构的详细信息。

### 按照抽象程度分类

<image>

按照抽象程度的不同，常常把虚拟技术分为五个层次：

#### 指令集架构等级的虚拟化（Instruction Set Architecture Level）

指令集架构的虚拟化是透过软件来模拟不同架构的处理器、内存、总线、磁盘控制卡、计时器等多个I/O设备，软件会将虚拟机所发出的指令转换为本机可以操作的指令在现有的硬件上执行。这种等级的虚拟化对于模拟相同处理器架构的平台可以提供很好的相容性，例如︰x86架构、Sparc架构、Alpha架构。

若主机处理器可以执行由虚拟机转换出来的指令，或是使用相同的指令集来完成任务，那就表示除了处理器以外的操作系统、I/O设备皆可不受特定平台所绑定，但由于虚拟机的每条指令都必须透过软件来模拟，所以在效能会有较大程度的耗损。

这个分类底下代表性的有Bochs以及QEMU。

#### 硬件抽象层等级的虚拟化（Hardware Abstraction Level）

硬件抽象层等级的虚拟化是由虚拟机器监视器来隐藏不同厂商的处理器、内存、芯片组...等特征，为这些虚拟机器提供抽象与统一的虚拟平台。运行此平台的电脑称之为主体机器（Host Machine），而在此平台中运作的虚拟机称为客体机器（Guest Machine）。

目前大多数x86平台的商业电脑都在使用这种虚拟化，最主要是由于现今处理器厂商提供了硬件辅助虚拟化技术，例如︰第三世代的Intel VT-d、AMD-Vi皆提供虚拟机直接内存存取（Direct Memory Access）以及对各种PCI界面的直接存取功能（PCI passthrough）。

这个分类底下代表性的有VMware ESXi、Hyper-V、以及Citrix。

#### 操作系统等级的虚拟化（Operating System Level）

硬件抽象层等级的虚拟化中的全虚拟化与操作系统底层间有非常高的隔离能力，支援不同的操作系统，安装后不须要重新启动主机、或修改开机程式（Boot Loader）以达到双系统的目的，风险低、维护简单。由于此等级的虚拟机可以访问底层操作系统，因此使用者必须花费大量的时间来安装与设定虚拟机器，接着才能开始评估或测试所需运作的软件，这些设定包含了操作系统的安装、安全性或相容性软件的更新、网络、系统调校...等，如果所需的操作系统与底层操作系统相同，那么其实它们所作的跟实际上安装一台实体机器没有什么区别。

操作系统内核虚拟化可以最大限度的减少新增虚拟机的所需，在这个等级的虚拟机器共用实体主机上的硬件以及操作系统，呈现彼此独立且隔离的虚拟机环境。

应用软件的环境是由操作系统、函式库、相依性软件、特定于系统的资料结构或档案系统，例如︰NTFS或Ext4，以及其他环境设定所组成。如果这些都保持不变，应用软件很难发现与真实环境的区别。这是所有操作系统等级虚拟化的关键想法。

这个分类底下代表性的有Docker、LXC和OpenVZ。

#### 程式语言等级的虚拟化（Programming Language Level）

传统电脑是由指令集架构所驱动的一种机械语言，硬件的操作由特殊的I/O指令处理，也可以透过区块映射（Mapping）来操作内存，此等级的虚拟化会将高阶语言转译成一种名为字节码的语言，透过虚拟机器转译成为可以直接执行的命令。跨操作系统平台、跨语言皆为其优点。

这个分类底下代表性的有Oracle Java、Microsoft . NET、Parrot。

#### 函式库等级的虚拟化（Library Level）

大部分的应用程序都是使用由许多函式库组成的API（Application Programming Interface）来设计，使用动态连结的方式用于隐藏操作系统的细节，目的是提供程序员更简单的工作。这也产生了一种新的虚拟化方式，使用不同的API与不同操作系统底层的ABI（Application Binary Interface）来进行模拟的工作。

这个分类底下代表性的有Wine以及WSL（Windows Subsystem for Linux）。

## 虚拟化技术的应用

- 服务器整合
- 沙盒（Sandboxing）
- 多运行环境
- 多操作系统
- 测试和性能监视
- 应用整合
- 虚拟硬件
- 软件移植
- 系统可管理性
- 测试/质量保证

## 外部链接

- 进入美妙的虚拟世界—虚拟系统探秘
- An introduction to Virtualization
- VMware虚拟技术白皮书（英文）