Tips:文章爲拜讀@xingjiarong 後有感而作的分享,先對做者表示感謝,附原文地址:http://blog.csdn.net/xingjiarong安全
雲計算的一個核心思想就是在服務器端提供集中的物理計算資源,這些計算資源能夠被分解成更小的單位去獨立地服務於不一樣的用戶,也就是在共享物理資源的同時,爲每一個用戶提供隔離、安全、可信的虛擬工做環境,而這一切不可避免地要依賴於虛擬化技術。服務器
虛擬化技術對你們來講都不陌生,好比虛擬內存和虛擬服務器等,爲了更好的理解虛擬化咱們應該首先來了解一下計算機系統的層次結構。
網絡
每一層都向上層提供一個抽象,而且每一層只須要知道下層抽象的接口,而並不須要瞭解其內部運做機制。例如,操做系統看到的是一個硬件抽象層,它並不知道硬件中佈線和電器特徵。即便硬件層發生變化,只要硬件抽象層不變,那麼操做系統層將察覺不到任何的變化。架構
這種分層有必定的優勢。首先,每一層只須要考慮本層的設計以及相鄰層間的交互接口,從而大大的下降了系統設計的複雜性,提升了軟件的移植性。另外,這樣的設計也是給下一層軟件模塊爲上一層軟件模塊創造「虛擬世界」提供了條件。雲計算
所謂的虛擬化就是有位於下層的軟件模塊,根據上一層軟件模塊的期待,抽象出一個虛擬的軟件或硬件接口,使上一層軟件能夠直接運行在與本身所期待的運行環境徹底一致的虛擬環境上。spa
虛擬化能夠發生在上圖中的每個層次上,硬件的虛擬化,操做系統的虛擬化等等,可是對於IaaS(基礎架構即服務)的雲計算,更關心的是硬件抽象層上的虛擬化。硬件抽象層上的虛擬化是指經過虛擬硬件抽象層來實現虛擬機,爲客戶機操做系統呈現出與物理硬件相同或相近的硬件抽象層。
操作系統
如上圖所示,系統虛擬化在硬件和操做系統之間引入了一個虛擬化層,虛擬化層提供一個操做系統指望的接口,統一處理操做系統的請求,使得操做系統層感受不到虛擬化層的存在,任然認爲本身在享有整個硬件。每一個虛擬計算機系統(虛擬機)都擁有本身的虛擬硬件,並提供一個獨立的虛擬運行環境,經過虛擬機監控器(VMM)的模擬,虛擬機中的操做系統認爲本身仍然是獨佔一個系統在運行。.net
按照實現方式虛擬化能夠分爲兩種:翻譯
VMM直接運行在硬件平臺上,控制全部硬件並管理客戶操做系統。客戶操做系統運行在比VMM更高的級別上,Xen就是採用的這個模型;設計
VMM運行在一個傳統的操做系統裏(第一層軟件),能夠看作是第二層軟件,而客戶機操做系統則是第三層了。KVM和VirtualBox就是這種實現。
按照VMM所提供的虛擬平臺類型能夠分爲兩類:
徹底虛擬化
VMM虛擬的是現實存在的平臺,而且在客戶機操做系統看來,虛擬平臺和現實平臺是同樣的,客戶機操做系統感受不到運行在一個虛擬平臺上,現有的操做系統無需進行任何修改就能夠在這樣的虛擬平臺上運行,所以這種方式被稱爲徹底虛擬化。
徹底虛擬化中,VMM須要可以正確處理客戶機操做系統全部可能的行爲,或者說正確處理全部可能的指令,徹底虛擬化經歷了兩個階段:軟件輔助的徹底虛擬化與硬件輔助的徹底虛擬化。
在x86虛擬技術的早期,x86體系中沒有在硬件層次對虛擬化提供支持,所以徹底虛擬只能靠軟件來實現,典型的作法就是優先級壓縮和二進制代碼翻譯相結合。
優先級壓縮的原理是:將VMM和客戶機的優先級放到同一個CPU中來運行,對應於x86架構,一般VMM在ring0,客戶機操做系統內核在ring1,客戶機操做系統應用程序在ring3。當客戶機操做系統內核執行特權指令時,因爲處在非特權的ring1,一般會觸發異常,VMM截獲後就能夠進行特權指令的虛擬化。可是x86指令體系結構在設計之初並無考慮到虛擬化,一小部分特權指令在ring1中沒有觸發異常,VMM也就不能進行截獲進行虛擬化,因此就須要用二進制代碼翻譯來處理這些不友好的指令。
二進制代碼翻譯的原理:VMM一般會對操做系統的二進制代碼進行掃描,一旦發現虛擬化不友好的指令,就將其替換成支持虛擬化的指令塊。
Intel的VTx技術是硬件輔助虛擬化的表明。VTx技術在處理器上引入了一個新的執行模式用於運行虛擬機。當虛擬機運行在這個特殊模式中時,他仍然面對一套完整的處理器寄存器和執行環境,只是任何特權操做都會被處理器截獲並報告給VMM。VMM本省就運行在正常模式下,在接收處處理器的報告後,經過對目標指令的解碼,找到相應的虛擬化模塊進行模擬,並把最終的效果反映在特殊的環境中。
類虛擬化
類虛擬化虛擬出的平臺在現實中是不存在的,而是通過VMM從新定義的。這樣的虛擬平臺須要對所運行的客戶機操做系統進行或多或少的修改使之可以適應虛擬環境,客戶機操做系統也就知道本身運行在虛擬平臺上,而且會主動去適應。
類虛擬化是經過在源代碼級別修改指令以迴避虛擬漏洞的方式來使VMM可以對物理資源實現虛擬化。對於x86中難以虛擬化的指令,類虛擬化採起的方式是修改操做系統內核代碼,使得操做系統內核徹底避免這些難以虛擬化的指令。
動態遷移是虛擬化特有的新特性,它將虛擬機從一個物理機快速遷移到另外一個物理機,可是虛擬機裏面的程序和網絡都保持鏈接。從用戶的角度來看,動態遷移對虛擬機的可用性沒有任何影響,用戶不會察覺任何的服務被中斷。
動態遷移實現的方法是在目的服務器上創建一臺一樣配置的新虛擬機,而後不斷地在兩個虛擬機之間同步各類內部狀態,好比內存、外設、CPU等。等狀態同步完成後,關掉老的虛擬機,啓動新的虛擬機。