漫談虛擬化之一虛擬化綜述
前面咱比較全面的介紹了云計算,趁熱打鐵,咱們索性把云計算的基礎技術 —“虛擬化”展開來聊一下,以便各位小伙伴對云計算有更為完整的認識。
1. 概述
我們常說云計算是一種按使用量付費的模式,這種模式能夠快速的提供可用的、便捷的、按需的網絡訪問,進入可配置的資源共享池(包括計算、網絡、存儲、應用和服務),并,用戶只需投入很少的管理工作。云計算是將 IT 資源作為一種服務的業務模式,是產業形態,它不是一種具體的技術,云計算通常通過互聯網來提供動態易擴展且經常是虛擬化的資源,旨在降低 IT 成本并幫助用戶專注于他們的核心業務,而不是讓 IT 成為他們的阻礙。
“虛擬化”可以被認為是云計算主要的支撐技術之一。虛擬化將應用程序和數據在不同層次以不同的面貌展現,讓用戶能夠更加便捷的使用、開發及維護這些應用程序及數據。虛擬化不但允許 IT 部門添加、減少移動硬件和軟件到它們想要的地方。虛擬化還為組織帶來靈活性,從而改善 IT 運維和減少成本支出。
需要注意的是,云計算和虛擬化雖然是密切相關的,但是虛擬化對于云計算來說并不是必須的。云計算將各種 IT 資源以服務的方式通過互聯網交付給用戶,然而虛擬化本身并不能給用戶提供服務。二者可以通過優勢互補為用戶提供更優質的服務。云計算方案使用虛擬化技術使整個 IT 基礎設施的資源部署更靈活。反過來,虛擬化方案也可以引入云計算的理念,為用戶提供按需使用的資源和服務。
2. 虛擬化綜述
2.1 為什么需要虛擬化
傳統 x86 服務器的構架是在每臺物理服務器上通過唯一的操作系統(例如 Windows, Linux etc.)進行管理,大多數情況下每個操作系統僅有一個負載。而且,也很難在服務器上運行多個主應用程序,否則可能會產生沖突和性能問題。
這么做會導致服務器資源在大部分時間內的利用率很低。正如前面所討論的,物理機的大部分性能都被浪費,我們必須在浪費硬件資源和降低運行風險之間尋找平衡。隨著業務的增長,隨之而來的成本壓力也變化,相關管理效率也會變低,需消耗的資源也會變大。
2.2 什么是虛擬化
早期虛擬化(Virtualization)技術最早出現在 20 世紀 60 年代的 IBM 大型機系統中,并在 70 年代的 System 370 系列中逐漸流行起來,這些機器通過一種叫虛擬機監控器(Virtual Machine Monitor,VMM)的程序在物理硬件之上生成許多可以運行獨立操作系統軟件的虛擬機(Virtual Machine)實例。隨著近年多核系統、集群、網格以及云計算的廣泛部署,虛擬化技術在商業應用上的優勢日益體現,不僅降低了 IT 成本,而且還增強了系統安全性和可靠性,虛擬化的概念也逐漸深入到人們日常的工作與生活中。
虛擬化是一個廣義的術語,對于不同的人來說可能意味著不同的東西,這要取決他們所處的環境。在 IT 領域中,虛擬化代表著對計算資源的抽象,而不僅僅局限于虛擬機的概念。例如對物理內存的抽象,產生了虛擬內存技術,使得應用程序認為其自身擁有連續可用的地址空間(Address Space),而實際上,應用程序的代碼和數據可能是被分隔成多個碎片頁或段),甚至被交換到磁盤、閃存等外部存儲器上,即使物理內存不足,應用程序也能順利執行。
這里,虛擬化 Virtualization 定義包括兩層含義:
(1)虛擬化是 IT 資源的邏輯表示,其不受物理限制的約束;
(2)虛擬化技術通過在軟件系統中加入虛擬化層,將下層的資源抽象成另一種形式的資源,供給上層應用。
咱們還是通過示意圖來理解:
虛擬化的重要目標之一就是提高管理效率,從而降低成本、提高硬件使用率,把管理變得更加輕松。虛擬化的主攻方向集中在控制實體服務器的配置數量,并將物理機上的操作系統及應用程序,無縫轉移至虛擬機上,以便集中管理這些不同平臺的虛擬環境。
2.3 虛擬化的基本原理
判定一個計算機系統能否被虛擬化,或者說一個能夠被稱為 VMM 的控制程序,需要滿足一下條件:
(1)資源控制:控制程序必須能夠管理所有的系統資源。
(2)等價性:在控制程序管理下運行的程序(包括操作系統),除時序和資源可用性之外的行為,應該與沒有控制程序時完全一致,且預先編寫的特權指令可以自由地執行。
(3)效率性:絕大多數的客戶機指令應該由主機硬件直接執行而無需控制程序參與。
由于傳統的 x86 體系結構缺乏必要的硬件支持,任何控制程序都無法直接滿足上述條件,所以 x86 不是一個可虛擬化架構,但是我們可以使用軟件實現的方式構造 VMM。
經典的 CPU 虛擬化方法主要使用“特權解除”(Privilege deprivileging) 和“陷入-模擬”(Trap-and-Emulation) 的方式。即:將 Guest OS 運行在非特權級(特權解除),而將 VMM 運行于最高特權級(完全控制系統資源)。解除了 Guest OS 的特權后,Guest OS 的大部分指令仍可以在硬件上直接運行,只有當執行到特權指令時,才會陷入到 VMM 模擬執行(陷入-模擬)。下面我們更為詳細的解釋一下這種機制
我們知道虛擬機是對真實計算環境的抽象和模擬,VMM 需要為每個虛擬機分配一套數據結構來管理它們狀態,包括虛擬處理器的全套寄存器,物理內存的使用情況,虛擬設備的狀態等等。
VMM 調度虛擬機時,將其部分狀態恢復到主機系統中。并非所有的狀態都需要恢復,例如主機 CR3 寄存器(Control Rigister 控制寄存器,包括 CR0-CR3)中存放的是 VMM 設置的頁表物理地址,而不是 Guest OS 設置的值。主機處理器直接運行 Guest OS 的機器指令,由于 Guest OS 運行在低特權級別,當訪問主機系統的特權狀態(如寫 GDT 寄存器)時,權限不足導致主機處理器產生異常,將運行權自動交還給 VMM。此外,外部中斷的到來也會導致 VMM 的運行。VMM 可能需要先將 該虛擬機的當前狀態寫回到狀態數據結構中,分析虛擬機被掛起的原因,然后代表 Guest OS 執行相應的特權操作。
最簡單的情況,如 Guest OS 對 CR3 寄存器的修改,只需要更新虛擬機的狀態數據結構即可。一般而言,大部分情況下,VMM 需要經過復雜的流程才能完成原本簡單的操作。最后 VMM 將運行權還給 Guest OS,Guest OS 從上次被中斷的地方繼續執行,或處理 VMM “塞”入的虛擬中斷和異常。這種經典的虛擬機運行方式就是 Trap-And-Emulate,虛擬機對于 Guest OS 完全透明,Guest OS 不需要任何修改,但是 VMM 的設計會比較復雜,系統整體性能受到明顯的損害。
3. 虛擬化的基本特征
我們一般認為虛擬化包括四方面的基本特征:
(1)分區:即在單一物理機上同時運行多個虛擬機。
分區意味著虛擬化層擁有為多個虛擬機劃分服務器資源的能力;每個虛擬機可以同時運行一個單獨的操作系統(相同或不同的操作系統),使得用戶能夠在一臺服務器上運行多個應用程序;每個操作系統只能看到虛擬化層為其提供的“虛擬硬件”(虛擬網卡、CPU、內存等),使它認為運行在自己的專用服務器上。
(2)隔離:在同一物理機上的虛擬機之間是相互隔離的。
這意味著一個虛擬機的崩潰或故障(例如,操作系統故障、應用程序崩潰、驅動程序故障,等等)不會影響同一物理機上的其它虛擬機;
一個虛擬機中的病毒、蠕蟲等與其它虛擬機相隔離,就像每個虛擬機都位于單獨的物理機上一樣;
不但可以進行資源控制以提供性能隔離,可以為每個虛擬機指定最小和最大資源使用量,以確保某個虛擬機不會占用所有資源而使得同一系統中的其它虛擬機無資源可用;
還可以在單一機器上同時運行多個負載/應用程序/操作系統,而不會出現前面提到的,由于傳統 x86 服務器體系結構的局限性所導致的那些問題(應用程序沖突、DLL 沖突等)。
(3)封裝:整個虛擬機都保存在文件中,可以通過移動文件的方式來遷移該虛擬機。
也就是說整個虛擬機(包括硬件配置、BIOS 配置、內存狀態、磁盤狀態、CPU 狀態)都儲存在獨立于物理硬件的一組文件中。這樣,使用者只需復制幾個文件就可以隨時隨地根據需要復制、保存和移動虛擬機。
(4)相對于硬件獨立:無需修改就可以在任何服務器上運行虛擬機。
因為虛擬機運行在虛擬化層之上,所以操作系統只能看到虛擬化層提供的虛擬硬件;而且這些虛擬硬件也同樣不必考慮物理服務器的情況;這樣,虛擬機就可以在任何 x86 服務器(IBM、Dell、HP 等)上運行而無需進行任何修改。這打破了操作系統和硬件以及應用程序和操作系統/硬件之間的約束,也就是實現了解耦。