虛擬化

QEMU，一種x86虛擬機器套件
在計算機技術中，虛擬化（技術）或虛擬技術（Virtualization）是一種資源管理技術，是將計算機的各種實體資源（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

**外部鏈接**
 進入美妙的虛擬世界—虛擬系統探秘fix-attempted=no - An introduction to Virtualization date=20200504153848  - VMware虛擬技術白皮書（英文） date=20210427133749