系統架構設計筆記(104)—— 虛擬化

deniro_li發表於2020-10-23

虛擬化( Virtualization )技術最早出現在 20 世紀 60 年代的 IBM 大型機系統,在 20 世紀 70 年代的System3 70 系列中逐漸流行起來,這些機器通過一種叫虛擬機器監控器( Virtual Machine Monitor , VMM )的程式在物理硬體之上生成許多可以執行獨立作業系統軟體的虛擬機器( Virtual Machine )例項。隨著近年多核系統 、 叢集 、 網格甚至雲端計算的廣泛部署,虛擬化技術在商業應用上的優勢日益體現,不僅降低了 IT 成本,而且還增強了系統安全性和可靠性,虛擬化的概念也逐漸深入到人們日常的工作與生活中。

虛擬化是一個廣義的術語,對於不同的人來說可能意味著不同的東西,這要取決他們所處的環境。在電腦科學領域中,虛擬化代表著對計算資源的抽象,而不僅僅侷限於虛擬機器的概念。例如對實體記憶體的抽象,產生了虛擬記憶體技術,使得應用程式認為其自身擁有連續可用的地址空間( Address Space ),而實際上,應用程式的程式碼和資料可能被分隔成多個碎片頁或段,甚至被交換到磁碟 、 快閃記憶體等外部儲存器上,即使實體記憶體不足,應用程式也能順利執行。

1 虛擬化技術的分類

虛擬化技術是一個非常廣的概念,所以其具體內容可分成不同層面的幾大型別。

1.1 平臺虛擬化

平臺虛擬化( Platform Virtualization )是針對計算機和作業系統的虛擬化。我們通常所說的虛擬化主要是指平臺虛擬化技術,通過使用控制程式( Control Program ,也稱為 Virtual Machine Monitor 或 Hypervisor ),隱藏特定計算平臺的實際物理特性,為使用者提供抽象的 、 統一的 、 模擬的計算環境。虛擬機器中執行的作業系統稱為客戶機作業系統( Guest OS ),執行虛擬機器監控器的作業系統稱為主機作業系統( Host OS ),當然某些虛擬機器監控器可以脫離作業系統直接執行在硬體之上(如 VMWARE 的 ESX 產品)。執行虛擬機器的真實系統稱為主機系統。

hypervisor /ˈhaɪpərvaɪzər/

平臺虛擬化技術又可以細分為如下幾個子類:

(1)全虛擬化

全虛擬化( Full Virtualization )是指虛擬機器模擬了完整的底層硬體,包括處理器 、 實體記憶體 、 時鐘 、 外設等,使得為原始硬體設計的作業系統或其他系統軟體完全不作任何修改就可以在虛擬機器中執行。作業系統與真實硬體之間的互動可以看成是通過一個預先規定的硬體介面進行的。

全虛擬化 VMM ( Virtual Machine Monitor )以完整模擬硬體的方式提供全部介面(同時還必須模擬特權指令的執行過程)。舉例而言, x86 體系結構中,對於作業系統切換程式頁表的操作,真實硬體通過提供一個特權 CR3 暫存器來實現該介面,作業系統只需執行 “mov pgtable , %%cr3” 彙編指令即可。全虛擬化 VMM 必須完整地模擬該介面執行的全過程。如果硬體不提供虛擬化的特殊支援,那麼這個模擬過程將會十分複雜:一般而言, VMM 必須執行在最高優先順序來完全控制主機系統,而 Guest OS 需要降級執行,從而不能執行特權操作。當 Guest OS 執行前面的特權彙編指令時,主機系統產生異常( General Protection Exception ),執行控制權重新從 Guest OS 轉到 VMM 手中。 VMM 事先分配一個變數作為影子 CR3 暫存器給 Guest OS ,將 pgtable 代表的客戶機實體地址( Guest Physical Address )填入影子 CR3 暫存器,然後 VMM 還需要 pgtable 翻譯成主機實體地址( Host Physical Address )並填入物理 CR3 暫存器,最後返回到 Guest OS 中。隨後 VMM 還將處理複雜的 Guest OS 缺頁異常( Page Fault )。

比較著名的全虛擬化 VMM 有Microsoft Virtual PC 、 VMware Workstation 、 SUNVirtual Box 、 Parallels Desktopfor Mac和 QEMU。

(2)超虛擬化

超虛擬化( Paravirtualization )是一種修改 Guest OS 部分訪問特權狀態的程式碼以便直接與 VMM 互動的技術。在超虛擬化虛擬機器中,部分硬體介面以軟體的形式提供給客戶機作業系統,這可以通過 Hypercall ( VMM 提供給 Guest OS 的直接呼叫,與系統呼叫類似)的方式來提供。例如, Guest OS 把切換頁表的程式碼修改為呼叫 Hypercall 來直接完成修改影子 CR3 暫存器和翻譯地址的工作。由於不需要產生額外的異常和模擬部分硬體執行流程,超 虛擬化可以大幅度提高效能,比較著名的 VMM 有 Denali、Xen。

hyper- /ˈhaɪpər/
Over; above; beyond;

(3)硬體輔助虛擬化

硬體輔助虛擬化( Hardware-Assisted Virtualization )是指藉助硬體(主要是主機處理器)的支援來實現高效的全虛擬化。例如有了 Intel-VT 技術的支援, Guest OS 和 VMM 的執行環境自動地完全隔離開來, Guest OS 有自己的 “ 全套暫存器 ” ,可以直接執行在最高階別。因此在上面的例子中, Guest OS 能夠執行修改頁表的彙編指令。 Intel-VT 和 AMD-V 是目前 x86 體系結構上可用的兩種硬體輔助虛擬化技術。

(4)部分虛擬化

部分虛擬化( Partial Virtualization )中, VMM 只模擬部分底層硬體,因此客戶機作業系統不作修改是無法在虛擬機器中執行的,其他程式可能也需要進行修改。在歷史上,部分虛擬化是通往全虛擬化道路上的重要里程碑,最早出現在第一代的分時系統 CTSS 和 IBMM44/44X 實驗性的分頁系統中。

(5)作業系統級虛擬化

在傳統作業系統中,所有使用者的程式本質上是在同一個作業系統的例項中執行,因此核心或應用程式的缺陷可能影響到其他程式。作業系統級虛擬化( Operating System Level Virtualization )是一種在伺服器作業系統中使用的輕量級的虛擬化技術,核心通過建立多個虛擬的作業系統例項(核心和庫)來隔離不同的程式,不同例項中的程式完全不瞭解對方的存在。比較著名的有 Solaris Container、FreeBSD Jail 和 OpenVZ 等。

1.2 資源虛擬化

資源虛擬化(Resource Virtualization),針對特定的系統資源的虛擬化,比如記憶體、儲存、 網路資源等。

1.3 應用程式虛擬化

應用程式虛擬化( Application Virtualization ),包括模擬 、 模擬 、 解釋技術等。雖然上面對虛擬化的分類已較為精確,但這種分類並不是絕對的,一個優秀的虛擬化軟體往往融合了多項技術。例如 VMware Workstation 是一個著名的全虛擬化的 VMM ,但是它使用了一種被稱為動態二進位制翻譯的技術把對特權狀態的訪問轉換成對影子狀態的操作,從而避免了低效的 Trap-And-Emulate 的處理方式,這與超虛擬化相似,只不過超虛擬化是靜態地修改程式程式碼。

對於超虛擬化而言,如果能利用硬體特性,那麼虛擬機器的管理將會大大簡化,同時還能保持較高的效能。

2 虛擬化的模式

虛擬化可以通過很多方法來證實。它不是一個單獨的實體,而是一組模式和技術的集合,這些技術提供了支援資源的邏輯表示所需的功能,以及通過標準介面將其呈現給這些資源的消費者所需的功能。這些模式本身都是前面介紹過的各種不同虛擬形式的重複出現。

2.1 單一資源多個邏輯表示

這種模式是虛擬化最廣泛使用的模式之一。它只包含一個物理資源,但是它向消費者呈現的邏輯表示卻彷彿它包含多個資源一樣。消費者與這個虛擬資源進行互動時就彷彿自己是唯一的消費者一樣,而不會考慮他正在與其他消費者一起共享資源。

2.2 多個資源單一邏輯表示

這種模式包含了多個組合資源,以便將這些資源表示為提供單一介面的單個邏輯表示形式。在利用多個功能不太強大的資源來建立功能強大且豐富的虛擬資源時,這是一種非常有用的模式。儲存虛擬化就是這種模式的一個例子。在伺服器方面,叢集技術可以提供這樣的幻想:消費者只與一個系統(頭節點)進行互動,而叢集事實上可以包含很多的處理器或節點。實際上,這就是從 IT 技術設施的角度看到的網格可以實現的功能。

2.3 在多個資源之間提供單一邏輯表示

這種模式包括一個以多個可用資源之一的形式表示的虛擬資源。虛擬資源會根據指定的條件來選擇一個物理資源實現,例如資源的利用 、 響應時間或鄰近程度。儘管這種模式與上一種模式非常類似,但是它們之間有一些細微的差別。首先,每個物理資源都是一個完整的副本,它們不會在邏輯表示層上聚集在一起。其次,每個物理資源都可以提供邏輯表示所需要的所有功能,而不是像前一種模式那樣只能提供部分功能。這種模式的一個常見例子是使用應用程式容器來均衡任務負載。在將請求或事務提交給應用程式或服務時,消費者並不關心到底是幾個容器中執行的哪一個應用程式的副本為請求或事務提供服務。消費者只是希望請求或事務得到處理。

2.4 單個資源單一邏輯表示

這是用來表示單個資源的一種簡單模式,就彷彿它是別的什麼資源一樣。啟用 Web 的企業後臺應用程式就是一個常見的例子。在這種情況下,我們不是修改後臺的應用程式,而是建立一個前端來表示 Web 介面,它會對映到應用程式介面中。這種模式允許通過對後臺應用程式進行最少的修改(或根本不加任何修改)來重用一些基本的功能。也可以根據無法修改的元件,使用相同的模式構建服務。

2.5 複合或分層虛擬

這種模式是前面介紹的一種或多種模式的組合,它使用物理資源來提供豐富的功能集。資訊虛擬化是這種模式一個很好的例子。它提供了底層所需要的功能,這些功能用於管理對資源 、 包含有關如何處理和使用資訊的後設資料,以及對資訊進行處理的操作的全域性命名和引用。例如 Open Grid Services Architecture ( OGSA )或者 Grid Computing Components ,實際上都是虛擬化的組合或虛擬化的不同層次。


相關文章