虚拟化

在計算機技術中，**虛擬化（技術）** 或**虛擬技術**（英語：Virtualization）是一種資源管理技術，是將電腦的各種實體資源（CPU、記憶體、磁碟空間、網路適配器等），予以抽象、轉換後呈現出來並可供分割、組合為一個或多個電腦組態環境。由此，打破實體結構間的不可切割的障礙，使使用者可以比原本的組態更好的方式來應用這些電腦硬體資源。這些資源的新虛擬部份是不受現有資源的架設方式，地域或物理組態所限制。一般所指的虛擬化資源包括計算能力和資料儲存。

## 定義

由於目前資訊科技領域的很多企業都曾在宣傳中將該企業的某種技術稱為**虛擬化技術**，這些技術涵蓋的範圍可以從 Java 虛擬機器技術到系統管理軟體，這就使得準確的界定虛擬技術變得困難。因此各種相關學術論文在談到虛擬技術時常常提到的便是如前面所提到的那個不嚴格的定義。

## 歷史

虛擬化技術起源於 20 世紀 60 年代末，美國 IBM 公司當時開發了一套被稱作虛擬機器監視器（**V**irtual **M**achine **M**onitor）的軟體，該軟體作為電腦硬體層上面的一層軟體抽象層，將電腦硬體虛擬分割成一個或多個虛擬機器，並提供多使用者對大型電腦的同時、互動存取。

## 虛擬化技術的類別

### 按虛擬的物件分類

* 硬體虛擬化
* 虛擬機器（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 虛擬技術白皮書（英文） （頁面存檔備份，存於網際網路檔案館）