現代計算機系統是一個龐大的整體,整個系統的復雜性是不言而喻的。因而,整個計算機系統被分成了多個自下而上的層次,每一個層次都向上一層次呈現一個抽象,并且每一層只需知道下層抽象的接口,而不需要了解其內部運作機制。這樣以層的方式抽象資源的好處是每一層只需要考慮本層設計以及與相鄰層間的相互交互,從而大大降低了系統設計的復雜性,提高了軟件的移植性。
本質上,虛擬化就是由位于下層的軟件模塊,通過向上一層軟件模塊提供一個與它原先所期待的運行環境完全一致的接口的方法,抽象出一個虛擬的軟件或硬件接口,使得上層軟件可以直接運行在虛擬的環境上。虛擬化可以發生在現代計算機系統的各個層次上,不同層次的虛擬化會帶來不同的虛擬化概念。
如前文所述,虛擬化技術起源于上世紀70年代的IBM370體系,經過四十余年的發展,當前存在諸多實現在不同層次的虛擬化技術,原理不盡相同,且每一種技術都相當復雜。在本文中,將通過不同的角度對目前存在的較流行的虛擬化技術進行分類,并對其原理進行初步介紹,旨在對紛繁復雜的虛擬化技術有個整體認識及厘清不同虛擬化技術之間的相互關系。
在介紹各種虛擬化概念之前,先介紹虛擬化中的兩個重要名詞。在虛擬化中,物理資源通常有一個定語稱為宿主(Host),而虛擬出來的資源通常有一個定語稱為客戶(Guest)。
在計算機系統中,從底層至高層依次可分為:硬件層、操作系統層、函數庫層、應用程序層,在對某層實施虛擬化時,該層和上一層之間的接口不發生變化,而只變化該層的實現方式。從使用虛擬資源的Guest的角度來看,虛擬化可發生在上述四層中的任一層。應當注意,在對Guest的某一層進行虛擬化時,并未對Host在哪一層實現它作出要求,這一點是時常引起混淆的地方。
硬件抽象層上的虛擬化是指通過虛擬硬件抽象層來實現虛擬機,為客戶機操作系統呈現和物理硬件相同或相近的硬件抽象層,又稱為指令集級虛擬化,實現在此層的虛擬化粒度是最小的。
實現在此層的虛擬化技術可以對整個計算機系統進行虛擬,即可將一臺物理計算機系統虛擬化為一臺或多臺虛擬計算機系統,故又可稱作系統級虛擬化。每個虛擬計算機系統(簡稱為虛擬機)都擁有自己的虛擬硬件(如CPU、內存和設備等),來提供一個獨立的虛擬機執行環境。每個虛擬機中的操作系統可以完全不同,并且它們的執行環境是完全獨立的。由于客戶機操作系統所能看到的是硬件抽象層,因此,客戶機操作系統的行為和在物理平臺上沒有什么區別。
操作系統層上的虛擬化是指操作系統的內核可以提供多個互相隔離的用戶態實例。這些用戶態實例(經常被稱為容器)對于它的用戶來說就像是一臺真實的計算機,有自己獨立的文件系統、網絡、系統設置和庫函數等。
由于這是操作系統內核主動提供的虛擬化,因此操作系統層上的虛擬化通常非常高效,它的虛擬化資源和性能開銷非常小,也不需要有硬件的特殊支持。但它的靈活性相對較小,每個容器中的操作系統通常必須是同一種操作系統。另外,操作系統層上的虛擬化雖然為用戶態實例間提供了比較強的隔離性,但其粒度是比較粗的。