虛擬化

在計算機技术中，虛擬化（技術）或虛擬技術（）是一種資源管理技術，是将计算机的各種實體资源（CPU、内存、磁盘空间、網路適配器等），予以抽象、转换后呈现出来並可供分割、組合為一個或多個電腦組態環境。由此，打破實體結構間的不可切割的障礙，使用戶可以比原本的組態更好的方式來应用這些電腦硬體资源。這些資源的新虛擬部份是不受現有資源的架設方式，地域或物理組態所限制。一般所指的虛擬化資源包括計算能力和資料儲存。

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

 历史 
虚拟化技术起源于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), 数据虚拟化是一种统一来自多个来源的数据的方法，这样应用程序，报告工具和最终用户就可以访问数据，而不需要有关原始来源，位置和数据结构的详细信息。

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

指令集架構等級的虛擬化（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）
 多运行环境
 多操作系统
 测试和性能监视
 应用整合
 虚拟硬件
 软件移植
 系统可管理性
 测试/质量保证

 参考文献 
Susanta Nanda, Tzi-cker Chiueh, "A Survey on Virtualization Technologies";
R.P.Goldberg, "Survey of Virtual Machine Research", Computer, June 1974, pp.34–45;
G.J.Popek, R.P.Goldberg, "Formal Requirements for Virtualizable Third Generation Architectures," Comm.ACM, Vol.17, Nr.7, July 1974, pp.412–421;
Joba Yeh (2018). "Research on Big Data Analysis Platform and Services", NDLTD in Taiwan, August 2018, pp.16–22.

 相关条目 
 虚拟化发展时间线
 硬件虚拟化
 x86虚拟化
 虚拟机
 虚拟机监视器
 VMware
 Hyper-V
 KVM
 VirtualBox
 Virtual PC
 软件虚拟化
 服务虚拟化
 虚拟设备
 Docker

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

需要计算机科学专家关注的页面
Category:虛擬化軟體