虛擬化技術詳解——少年想自己做個虛擬機嗎?

白嫖了這麼久的VMare workstation來搞Linux系統,一直不知道虛擬機的虛擬兩個字是什麼東西。看了《現代操作系統》纔有所瞭解,那就順手做個虛擬化技術的筆記進行總結。私信可以給電子書,如果我那時候還保留的話(現2020年4月21日)

虛擬化技術是一個比較複雜的領域,這裏僅僅對虛擬化技術做一個比較簡單的介紹,具體的一些東西沒有能力全部列舉出來,每一個小知識點需要擴展的部分都會有鏈接進行擴充

1. 虛擬化技術究竟是個什麼鬼東西

儘管虛擬化技術這幾年一直吹的很nb,但其實它並不是一個新興的東西,早在20世紀60年代,IBM就試驗了兩個獨立開發的虛擬機管理程序SIMMONCP-40。但是真正能夠用到實際中、可以直接商用是20世紀90年代,斯坦福大學的研究人員開發了一種名爲DISCO(蹦迪的意思?)的新型虛擬機管理程序,接下來成立了我們熟知的VMware公司,隨後逐漸發展到了雲技術。雲的核思想很直接:將你的計算或存儲需要外包給一個管理良好的數據中心。

其實雲的運用有很多,像雲計算,百度網盤(也用到了虛擬化技術,這個限速到幾kb的渣男出來捱打)
在這裏插入圖片描述
時間2020年4月16號。


  1. 虛擬化的目的:使用邏輯來表示資源,從而擺脫物理限制的約束。提高物理資源的利用率。
  2. 虛擬化的原理:在OS中加入一個虛擬化層(VMM),虛擬化層可以對下層(HostOS)硬件資源(物理CPU、內存、磁盤、網卡、顯卡等)進行封裝、隔離,抽象爲另一種形式的邏輯資源,再提供給上層(GuestOS)使用。所以你可以理解VMM其實就是聯繫HostOS和GuestOS的一箇中間件,當然虛擬化可以將一份資源抽象爲多份,也可以將多份資源抽象爲一份。
  3. 虛擬化的主要思想:虛擬機管理程序(Virtual Machine Monitor,VMM)在同一物理硬件上創建出有多臺虛擬機器的環境。VMM分爲兩類:第一類虛擬機管理程序和第二類虛擬機管理程序前者運行在裸機上,後者依賴於底層操作系統
  4. 虛擬化比較通俗的理解:一臺電腦裏面可以用多幾個系統。那麼比較靠譜的說法是:

虛擬化技術就是在一臺機器上模擬出獨立的cpu、存儲器等使得同一臺主機能虛擬爲多臺主機或者多臺主機能虛擬爲一臺主機。————CSDN 博主逃離地球的小小呆

  1. 虛擬化技術比較實在的好處一臺電腦即可以在windows系統裏面打英雄聯盟,又可以在虛擬機裏面學習並且用Linux操作系統。現在計算機專業的學生畢業出去說自己不會用Linux系統,那給HR的感受是:好傢伙直接往我嘴裏面塞了個電飯煲🌭🌭。
  2. 虛擬化技術的組成部分:VMM和對於硬件設備(CPU、內存、存儲設備(硬盤、磁盤)、網絡設備、I/O輸入輸出設備),接下來圍繞這些部分進行講解。

通過虛擬化技術實現的虛擬機一般被稱之爲GuestOS(客戶機操作系統),而作爲GuestOS載體的物理主機稱之爲HostOS(宿主操作系統)。
在這裏插入圖片描述

2. 虛擬化技術的優點?

  1. 可靠性:把各個服務放到獨立的計算機上之後,如果一個服務器崩潰了,其他還可以正常運作。服務全放在一個電腦,服務器崩了怎麼辦,就如同寫檢討書寫了兩個小時,剛按下結尾句號,藍屏了(我***沒保存),就只能再寫一遍白給。做事情總要一個備份的嘛。
  2. 安全性:黑客即使攻陷了Web服務器,也不能立即看到敏感的電子郵件,這個性質有時候也叫沙盒。聽說現在網絡安全有個做法是,在電腦上做個虛擬機模擬當前的環境用來釣魚,壞蛋攻擊就記下IP地址,然後警察叔叔去抓人
  3. 省錢:確實上面兩個性質可以通過放多幾臺電腦來減少崩潰丟失數據的風險,但是小錢包頂不住啊,電腦這麼貴。物理機數量的減少節省了硬件和電力開銷以及機架空間的佔用。

  1. 設置檢查點和虛擬機遷移(例如跨多臺服務器進行負載均衡)比起普通操作系統上運行的遷移要容易得多:在後一種情況下,在操作系統中保留有關於每個進程的大量關鍵狀態信息,包括打開的文件、計時器、信號處理程序等。而遷移虛擬機時,只需要遷移虛擬機的內存和磁盤鏡像就能完成整個系統的遷移。
  2. 方便運行上古程序:在已停止支持或無法工作於當前硬件的操作系統(或操作系統版本)上運行遺留應用程序。遺留應用程序可以與當前應用程序同時運行在相同硬件上。事實上,能同時運行不同操作系統中的應用程序時虛擬機受歡迎的重要原因。通俗一點講:就是代碼屎山再利用
  3. 協助軟件開發。程序員不需要在多臺機器上安裝不同操作系統來保證軟件能在Windows 7、Windows 8、不同版本的Linux,FreeBSD、OpenBSD、NetBSD、OS X及其他操作系統上運行。相反,它只需要一臺機器上創建一些虛擬機來安裝不同的操作系統。當然,他也可以對磁盤進行分區,在每個分區上安裝不同的操作系統,但這種方法更加困難。簡單點比較好

  1. 虛擬裝置:有了虛擬機之後,軟件開發人員可以精心構造一個虛擬機,裝上需要的操作系統、編譯器、運行庫和應用程序代碼,固定整個虛擬機使之可以隨時運行。這個虛擬機鏡像可以刻錄到CD-ROM或發佈到網站上讓用戶安裝或下載。這種方法意味着只有軟件開發人員需要知道所有的依賴關係,客戶得到的是能夠實際運行的完整包,與它們使用的操作系統和安裝的其他軟件包、運行庫完全無關。這類“盒裝”的虛擬機通常稱爲虛擬裝置
    在這裏插入圖片描述

3. 怎麼樣才配叫做一個虛擬機

現代操作系統上面說的很爛,這裏的必要條件的第二條參考了:博客園博主又是火星人的《虛擬化的發展歷程和實現方式》,網址:https://www.cnblogs.com/echo1937/p/7222606.html

虛擬機(Virtual Machine)的必要條件 :

  1. 虛擬機管理程序(Virtual Machine Monitor,VMM):往下管理底層硬件虛擬化,往上支持操作系統。

  1. 擁有自己的硬件(CPU、內存、網絡設備、I/O設備、存儲設備):對於底層硬件的虛擬化(等一下詳細解釋)而言,虛擬化技術的方式有三種:
    1. 全虛擬化( Full virtualization)(軟件方面)GuestOS(客戶機操作系統)可以直接在全虛擬化VMM上運行而不需要對GuestOS本身的核心代碼做任何修改,全虛擬化的GuestOS具有完全的物理機特性。既VMM會爲GuestOS抽象模擬出它所需要的包括CPU、磁盤、內存、網卡、顯卡等抽象硬件資源,所以全虛擬化的GuestOS並不會知道自己其實是一臺虛擬機。
    2. 半虛擬化(Paravirtualization)(軟件方面)半虛擬化是需要GuestOS協助的虛擬化。因爲在半虛擬化VVMM中運行的GuestOS,都需要將其內核源碼進行都進過了特別的修改。半虛擬化VMM在處理敏感指令和內核態指令的流程上相對更簡單一些。在半虛擬化VMM上運行的GuestOS都需要修改內核代碼,主要是修改GuestOS指令集中的敏感指令核心態指令。讓HostOS在捕抓到沒有經過半虛擬化VMM模擬和翻譯處理的GuestOS內核態指令或敏感指令時,HostOS也能夠準確的判斷出該指令是否屬於GuestOS(GuestOS知道自己是虛擬機)。這樣就可以高效的避免了上述問題。典型的半虛擬化軟件有——Xen、KVM-PowerPC(簡易指令集)。提供一層類似物理機器的軟件接口,顯示暴露出自身是一個虛擬化的環境。
    3. 硬件輔助虛擬化 HVM(硬件方面):2005年 — Intel提出並開發了由CPU直接支持的虛擬化技術。這種虛擬化技術引入新的CPU運行模式和新的指令集,使得VMM和GuestOS運行於不同的模式下(VMM=Root Mode;GuestOS=Non-Root Mode),GuestOS運行於受控模式,原來的一些敏感指令在受控模式下會全部陷入VMM,由VMM來實現模擬,這樣就解決了部分非內核態敏感指令的陷入——模擬難題,而且模式切換時上下文的保存恢復由硬件來完成,這樣就大大提高了陷入——模擬時上下文切換的效率 。該技術的引入使x86 CPU可以很容易地實現完全虛擬化。故皆被幾乎所有之前分歧的各大流派所採用,包括KVM-x86,VMWare ESX Server 3,Xen 3.0 。

  1. 由VMM提供的高效、獨立的計算機系統,

名詞解釋:模擬:仿照真實的計算機。


對於虛擬機來講,非常重要的一點是要像 真實的機器那樣運轉。因此虛擬機管理程序(VMM)在一下三個維度上有良好的表現:

  1. 安全性:虛擬機管理程序應完全掌控虛擬資源。
  2. 保真性:程序在虛擬機上執行的行爲應該與裸機上相同。
  3. 高效性:虛擬機中運行的大部分代碼應該不受虛擬機管理程序的干涉。

4. VMM技術的分類:第一類和第二類虛擬機管理程序

VMM分爲兩類:第一類虛擬機管理程序(全虛擬化)和第二類虛擬機管理程序(半虛擬化)前者運行在裸機上,後者依賴於底層操作系統

從技術而言:

  1. 第一類虛擬機管理程序就像一個操作系統,因爲它是唯一一個運行在最高特權級(也就是直接操控硬件)的程序。它的工作時支持真實硬件的多個虛擬機(virtual machine)拷貝,類似於普通操作系統支持的進程。
  2. 第二類虛擬機管理程序,也就是現在流行的VMare Workstation所用的,它是一個依賴於Windows、Linux等操作系統分配和調度資源的程序,很像一個普通的進程。當然,他還是會假裝自己是個靠譜的操作系統,具有CPU和各種設備的完整計算機。
    在這裏插入圖片描述

運行在兩類虛擬機管理程序上的操作系統都被稱爲客戶操作系統(guest operating system)。 對於第二類虛擬機管理程序,運行在底層硬件上的操作系統稱爲宿主操作系統

第二類虛擬機管理程序有時又稱作託管型虛擬機管理程序,依賴於Windows、Linux、OS X等宿主操作系統提供的功能。首次啓動時,第二類虛擬機管理程序好像一個剛啓動的計算機那樣運行,期待找到一個包含操作系統的DVD、u盤這類的,這些驅動器可以是虛擬設備。接下來,虛擬機管理程序運行DVD上的安裝程序,將操作系統安裝到虛擬磁盤(virtual disk,其實只是宿主操作系統中的一個文件上)。客戶操作系統安裝好後,就能啓動並運行。


5. CPU虛擬化(非常複雜)

cpu虛擬化指的就是把物理的cpu虛擬爲多個虛擬cpu,從而實現一個cpu能被多臺虛擬機共用,但是卻相互隔離的場景。cpu的運轉是以時間爲單位的,cpu虛擬化要解決的問題主要是隔離和調度問題,隔離指的是讓不同的虛擬機之間能夠相互獨立的執行命令,調度指的是VMM決定cpu當前在哪臺虛擬機上執行。
由於x86體系設計的cpu在虛擬化上具有一定的缺陷(每個包含內核態和用戶態的CPU都有一個特殊的指令集合,其中的指令在內核態和用戶態執行的行爲不同)所以我們有兩種方法來實現cpu的虛擬化。其一是採用完全虛擬化的方式,利用動態指令轉換或者硬件輔助來幫助實現cpu的虛擬化;其二是採用半虛擬化得方式,在客戶的操作系統內核上進行一定的更改使得操作系統自己明白自己是虛擬機的角色,能夠在VMM的管理下儘可能的訪問硬件。


CPU虛擬化這一部分我是真的沒有看懂那個《現代操作系統》到底在講一些什麼,我也是看了下面兩個博文,我才比較明白。

  1. 博客園博主又是火星人的《CPU純軟件半虛擬化技術》,網址:https://www.cnblogs.com/echo1937/p/7227385.html
  2. . 博客園博主又是火星人的《CPU純軟件全虛擬化技術》,網址:https://www.cnblogs.com/echo1937/p/7222606.html
  3. 博客園博主又是火星人的《CPU硬件輔助虛擬化技術》,網址:https://www.cnblogs.com/echo1937/p/7218201.html

6. 內存的虛擬化

這一點內存虛擬化閱讀之前,要有點虛擬內存的知識背景,這裏不過多展開,貼一個鏈接完事:
簡書博主:要上班的斌哥的《深入理解虛擬內存機制》,網址:https://www.jianshu.com/p/13e337312651

內存的虛擬化指的是把物理內存包裝成若干虛擬內存來使用,把物理內存抽象出來,給每一臺虛擬機都分配一個連續的內存空間。說的明白一點,物理內存是一塊蛋糕,虛擬內存是分號的給你的最小的那個蛋糕——大的肯定給弟弟了嘛,內存的虛擬化是切蛋糕,你一塊我一塊。

一臺電腦由硬件和軟件兩個部分組成,那麼相應的虛擬機的內存虛擬化技術也有兩個部分組成:影子頁表和PET技術

下面參考資料那裏有更加詳細的講解。

6.1 影子頁表(軟件部分)

參考了:CSDN博主sicofield的《影子頁表》,網址:https://blog.csdn.net/sicofield/article/details/54863202

影子頁表簡化了內存地址映射的問題,讓VMM程序不用每一次找個東西都要n次轉換,加快了速度。對每臺虛擬機,虛擬機管理程序都需要創建一個影子頁表(shadow page table),將虛擬機使用的虛擬頁映射到他分配給虛擬機的實際物理頁上

什麼都沒有的時候,虛擬機內存映射的步驟:
在這裏插入圖片描述


創建了影子頁表之後


在這裏插入圖片描述


通過創建一個影子頁表,虛擬機的內存映射到實際物理內存可以直接兩步到胃


但是影子頁表有點比較撈的一點呢,缺頁異常的時候它的花銷很大。具體詳情可以看下面參考資料。

6.2 EPT技術(硬件部分)

爲了避免處理影子頁表的巨大開銷,芯片生產商添加了嵌套頁表(nested page table)的硬件支持。嵌套頁表是AMD使用的術語,Intel將其稱爲EPT(extend page table,擴展頁表)兩者目的相似,都是在無需陷入的情況下由硬件處理虛擬化引發的額外頁操作,以此降低開銷
在這裏插入圖片描述

7. I/O虛擬化

I/O 虛擬化在虛擬化技術中算是比較複雜,也是最重要的一部分。從整體上看,I/O 虛擬化也包括基於軟件的虛擬化和硬件輔助的虛擬化,軟件虛擬化部分又可以分爲全虛擬化和半虛擬化,如果根據設備類型再細分的話,又可以分爲字符設備 I/O 虛擬化(鍵盤、鼠標、顯示器)、塊設備 I/O 虛擬化(磁盤、光盤)和網絡設備 I/O 虛擬化(網卡)等。

書上沒有特別詳細的說明,我找到了兩個比較nice的文章,講述的比較詳細,可以看一下:

  1. 微信公衆號:Linux雲計算網絡《I/O 虛擬化》,網址:https://mp.weixin.qq.com/s?__biz=MzI1OTY2MzMxOQ==&mid=2247483764&idx=1&sn=93c492e6e72ff941a32033188de1ab02&chksm=ea7435ccdd03bcda43b3e4a9496982a899cddd926ab630da1e864c3ca27ad76a7f40fd271b07&scene=21#wechat_redirect
  2. 簡書博主Linux雲計算網絡的《I/O 虛擬化的三種形式》,網址:https://www.jianshu.com/p/7a656326c439

7.1 I/O虛擬化的三種方式

這裏簡要說一下,I/O虛擬化的三種方式

  1. 全虛擬化(軟件方面):通過純軟件的形式來模擬虛擬機的I/O請求。

以 qemu-kvm 來舉例,內核中的 kvm 模塊負責截獲 I/O 請求,然後通過事件通知告知給用戶空間的設備模型 qemu,qemu 負責完成本次 I/O 請求的模擬。更具體的內容可以翻閱前文。
優點:不需要對操作系統做修改,也不需要改驅動程序,因此這種方式對於多種虛擬化技術的「可移植性」和「兼容性」比較好。缺點:純軟件形式模擬,自然性能不高,另外,虛擬機發出的 I/O 請求需要虛擬機和 VMM 之間的多次交互,產生大量的上下文切換,造成巨大的開銷。

  1. 半虛擬化(軟件方面):使得 Guest 端與 Host 端可以建立連接,直接通信,摒棄了截獲模擬這種方式,從而獲得較高的性能。

優點:性能較 I/O 全虛擬化有了較大的提升。缺點:要修改操作系統內核以及驅動程序,因此會存在移植性和適用性方面的問題,導致其使用受限。

  1. I/O 直通或透傳技術(Direct I/O Access)(硬件方面):直接讓虛擬機獨佔一個物理設備,同時還有軟件加以輔助,具體詳情看鏈接,這裏不過多訴述(最主要是比較麻煩)。

8. 網絡設備的虛擬化

書上沒有,我都是在別人的文章上看的。

網絡虛擬化是讓一個物理網絡能夠支持多個邏輯網絡,虛擬化保留了網絡設計中原有的層次結構、數據通道和所能提供的服務,使得最終用戶的體驗和獨享物理網絡一樣,同時網絡虛擬化技術還可以高效的利用網絡資源如空間、能源、設備容量等。

網絡虛擬化相對計算、存儲虛擬化來說是比較抽象的,以我們在學校書本上學的那點網絡知識來理解網絡虛擬化可能是不夠的。
在我們的印象中,網絡就是由各種網絡設備(如交換機、路由器)相連組成的一個網狀結構,世界上的任何兩個人都可以通過網絡建立起連接。
帶着這樣一種思路去理解網絡虛擬化可能會感覺雲裏霧裏——這樣一個龐大的網絡如何實現虛擬化?
其實,網絡虛擬化更多關注的是數據中心網絡、主機網絡這樣比較「細粒度」的網絡,所謂細粒度,是相對來說的,是深入到某一臺物理主機之上的網絡結構來談的。
如果把傳統的網絡看作「宏觀網絡」的話,那網絡虛擬化關注的就是「微觀網絡」。網絡虛擬化的目的,是要節省物理主機的網卡設備資源。從資源這個角度去理解,可能會比較好理解一點。

這是一個非常複雜的事情,具體可以看下面鏈接

  1. 博客園博主Linux雲計算網絡的《網絡虛擬化》,網址:https://www.cnblogs.com/bakari/p/8037105.html
  2. 博客園博主Linux雲計算網絡的《虛擬機網絡模型詳解,看這篇就夠了(圖文並茂)》,網址:https://www.cnblogs.com/bakari/p/10592421.html
  3. 博客園博主Linux雲計算網絡的《從 Bridge 到 OVS,探索虛擬交換機》,網址:https://www.cnblogs.com/bakari/p/8097439.html

蹭上面博主文章的一個圖片,做裝飾,來源:博客園博主Linux雲計算網絡的《虛擬機網絡模型詳解,看這篇就夠了(圖文並茂)》,網址:https://www.cnblogs.com/bakari/p/10592421.html
在這裏插入圖片描述

9. 存儲設備的虛擬化(硬盤)

這個書上也沒有講解,我也是看別人的文章才弄明白,這裏簡略介紹。


根據網絡存儲工業(Storage Network Industry Association,簡稱SNIA)的定義:通過將存儲系統/子系統的內部功能從應用程序、計算服務器、網絡資源中進行抽象、隱藏或隔離,實現獨立於應用程序、網絡的存儲與數據管理

參考文章:博客園博主世民談雲計算的《虛擬化 - 存儲虛擬化》,網址:https://www.cnblogs.com/sammyliu/articles/4389392.html

10. 雲的介紹

在雲計算令人炫目的崛起背後,虛擬化技術起到了決定性作用。
在這裏插入圖片描述
雲有很多種,一些雲是公有的、可以爲任何付費者提供資源,另外一些則是某個機構私有的。不同雲的功能也有所不同。一些雲允許用戶訪問物理硬件,但大多數雲會將物理環境虛擬化。一些雲除了物理裸機或虛擬裸機外不提供任何軟件,另外一些則提供可隨意組合並直接使用的軟件,或是簡單方便地新服務開發平臺。雲提供商通常提供不同類型地資源,例如既有“大機器”,又有“小機器”。

美國國家標準與技術研究院(National Institute of Standards and Technology)列出雲的五條必要特徵:

  1. 按需自助服務:無需人爲操作就能自動爲用戶提供資源。
  2. 普適的網絡訪問:所有資源都可以通過網絡用標準化的機制訪問,以支持各種異構設備。
  3. 資源池:雲提供商擁有的資源可以服務於多個用戶並動態再分配,用戶通常不知道他們使用的資源的具體位置。
  4. 快速可伸縮:能根據用戶需求彈性甚至是自動的獲取和釋放資源。
  5. 服務可計量:雲提供商按服務類型計量用戶使用的資源

11. 參考資料

  1. CSDN博主逃離地球的小小呆的《虛擬化技術詳解》,網址:https://blog.csdn.net/gui951753/article/details/81045508
  2. CSDN博主sicofield的《影子頁表》,網址:https://blog.csdn.net/sicofield/article/details/54863202
  3. CSDN博主handw的《Xen的敏感指令陷入-《Xen虛擬化技術》學習》,網址:https://blog.csdn.net/handw/article/details/5770554
  4. 博客園博主又是火星人的虛擬化專欄《隨筆分類 - Virtualization》,網址:https://www.cnblogs.com/echo1937/category/1086868.html
  5. 博客園博主公衆號:Linux雲計算網絡的虛擬化專欄《虛擬化》,網址:https://www.cnblogs.com/bakari/tag/%E8%99%9A%E6%8B%9F%E5%8C%96/
  6. 博客園博主世民談雲計算的《虛擬化 - 存儲虛擬化》,網址:https://www.cnblogs.com/sammyliu/articles/4389392.html
  7. 簡書博主要上班的斌哥的《深入理解虛擬內存機制》,網址:https://www.jianshu.com/p/13e337312651
  8. 現代操作系統(原書第四版)P267-P290
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章