日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

虚拟化技术基础知识

發(fā)布時間:2023/12/9 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 虚拟化技术基础知识 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

關(guān)于虛擬化技術(shù)的相關(guān)知識,例如KVM,QEMU,網(wǎng)絡(luò)上的現(xiàn)有介紹、相關(guān)blog、課程視頻也有很多,零零整整,對于初學(xué)者來說,需要我們廣泛涉略,形成自己的總結(jié)筆記。本篇博文記錄我作為一個零基礎(chǔ)小白對現(xiàn)有虛擬化資料學(xué)習(xí)后的學(xué)習(xí)筆記,“但當(dāng)涉獵,見往事耳”,愿與大家一起進(jìn)步。因本人初學(xué),如有錯誤,歡迎大家批評指正!

摘要:本文介紹了虛擬化技術(shù)的基本概念和基本要求。隨后引出由于早期的x86架構(gòu)不支持虛擬化,各家軟件廠商只能通過軟件模擬的形式來實現(xiàn)虛擬化,其代表是早期的VMware WorkStation、QEMU和Xen。

不過純粹依靠軟件的方式畢竟有性能的瓶頸,Intel和AMD及時推出了CPU硬件層面的虛擬化支持,軟件廠商迅速跟進(jìn)適配,極大的改善了虛擬化的性能體驗。這一時期的代表有新版本的VMware WorkStation、Hyper-V、KVM等。

目錄

1、什么是虛擬化,虛擬化的思想?

2、虛擬機(jī)

3、虛擬化技術(shù)分類

4、系統(tǒng)虛擬化發(fā)展歷史

5、進(jìn)一步理解系統(tǒng)虛擬化

6、(系統(tǒng))虛擬化實現(xiàn)方式

?6.1 純軟件仿真

6.2 虛擬化層翻譯(重點)

6.2.1 全虛擬化

?趣味故事

6.2.2 半虛擬化

趣聞故事

6.2.3 硬件輔助的虛擬化(效率高)

趣味故事

硬件輔助虛擬化的發(fā)展(以KVM為代表)

6.3 容器技術(shù)(LXC和Docker)

既然要學(xué)習(xí)虛擬化,就不得不提“云計算”,虛擬化技術(shù)是云計算欣欣向榮的一個重要的功臣,可以說,沒有虛擬化技術(shù),就沒有云計算。

云計算(cloud computing)是分布式計算的一種,指的是通過網(wǎng)絡(luò)“云”將巨大的數(shù)據(jù)計算處理程序分解成無數(shù)個小程序,然后,通過多部服務(wù)器組成的系統(tǒng)進(jìn)行處理和分析這些小程序得到結(jié)果并返回給用戶。云計算早期,簡單地說,就是簡單的分布式計算,解決任務(wù)分發(fā),并進(jìn)行計算結(jié)果的合并。因而,云計算又稱為網(wǎng)格計算。通過這項技術(shù),可以在很短的時間內(nèi)(幾秒鐘)完成對數(shù)以萬計的數(shù)據(jù)的處理,從而達(dá)到強(qiáng)大的網(wǎng)絡(luò)服務(wù)。

現(xiàn)階段所說的云服務(wù)已經(jīng)不單單是一種分布式計算,而是分布式計算、效用計算、負(fù)載均衡、并行計算、網(wǎng)絡(luò)存儲、熱備份冗雜和虛擬化等計算機(jī)技術(shù)混合演進(jìn)并躍升的結(jié)果。

接下來開始重點介紹虛擬化技術(shù)

1、什么是虛擬化,虛擬化的思想?

維基百科中的解釋是這樣的:虛擬化(技術(shù))是一種資源管理技術(shù),是將計算機(jī)的各種實體資源(CPU、內(nèi)存、磁盤空間、網(wǎng)絡(luò)適配器等),予以抽象、轉(zhuǎn)換后呈現(xiàn)出來并可供分割、組合為一個或多個電腦配置環(huán)境。

虛擬化的主要思想是:通過分層將底層的復(fù)雜、難用的資源虛擬抽象成簡單、易用的資源,提供給上層使用。計算機(jī)發(fā)展的過程本質(zhì)也是一個不斷虛擬的過程,將底層復(fù)雜的接口轉(zhuǎn)換成上層容易使用的接口。

2、虛擬機(jī)

理論上來說,只要能提供一個執(zhí)行環(huán)境,完成用戶指定任務(wù)的對象都可以叫做機(jī)器。

虛擬機(jī)介紹
進(jìn)程-最簡單的虛擬機(jī)(圖2-1)

進(jìn)程可以看做是一組資源的集合,有自己獨立的進(jìn)程地址空間以及獨立的CPU和寄存器,執(zhí)行程序員編寫的指令,完成一定的任務(wù)。一個進(jìn)程在執(zhí)行指令,訪問內(nèi)存時并不會影響其他進(jìn)程。操作系統(tǒng)把CPU按照時間分配復(fù)用,把內(nèi)存按照空間分配復(fù)用,通過管理底層資源,使得進(jìn)程都能夠使用整個計算機(jī)的物理資源,每個進(jìn)程都認(rèn)為自己擁有整個機(jī)器。

操作系統(tǒng)可以創(chuàng)建很多個進(jìn)程,每一個進(jìn)程都可以看做是一個獨立的虛擬機(jī)。

模擬器(圖2-2)

模擬器可以使為一種硬件指令集(Instruction Set Architecture,ISA)編譯的程序運行在另一種硬件指令集上。應(yīng)用程序在源ISA(如ARM)上被編譯出來,在模擬器的幫助下,運行在不同的目標(biāo)ISA(比如x86)上。

模擬器可以通過解釋來實現(xiàn),即對程序的源ISA指令一條一條進(jìn)行分析,然后執(zhí)行相應(yīng)的ISA指令上的操作。模擬器也可以通過二進(jìn)制翻譯實現(xiàn),即首先將程序中所有的源ISA指令翻譯成目標(biāo)ISA上具有同樣功能的指令,然后在目標(biāo)ISA指令機(jī)器上執(zhí)行。

典型的模擬器有:QEMU的用戶態(tài)模擬、Bochs模擬器等。

高級語言虛擬機(jī)(圖2-3)

將源ISA和目標(biāo)ISA完全分離開。在高級語言虛擬機(jī)中,通常會設(shè)計一種全新的虛擬ISA,并在其中定義新的指令集、數(shù)據(jù)操作、寄存器的使用等類似于物理ISA中的規(guī)范。不同于普通程序和模擬器運行的程序,高級語言虛擬機(jī)的程序中沒有任何具體物理ISA指令字節(jié),而是自己定義的虛擬指令字節(jié),通常稱為字節(jié)碼。

任何需要運行這種虛擬ISA指令的物理ISA平臺都需要實現(xiàn)一個虛擬機(jī),該虛擬機(jī)能夠執(zhí)行虛擬機(jī)ISA指令到物理ISA指令的轉(zhuǎn)化。

典型的高級語言虛擬機(jī)有:JVM虛擬機(jī)、Python虛擬機(jī)

補(bǔ)充:在高級語言虛擬機(jī)中,虛擬ISA是公開的規(guī)范,每個人都可以獲得,并且可以寫出反編譯工具,通過字節(jié)碼還原程序源碼。因此使用java語言的程序通常需要進(jìn)行代碼混淆。假設(shè)我們自己定義一個虛擬的ISA,不公開其規(guī)范,并且不時修改這些規(guī)范,然后將自帶的虛擬機(jī)和字節(jié)碼一起分發(fā),這樣使用基于物理ISA的反編譯工具就無法還原出程序的匯編代碼。

?圖2-1 進(jìn)程虛擬機(jī)

??圖2-2 模擬器原理

?圖2-3 高級語言虛擬機(jī)

???進(jìn)程、模擬器、高級語言虛擬機(jī)提供的都是指令的執(zhí)行環(huán)境,而系統(tǒng)虛擬機(jī)提供的是一個完整的系統(tǒng)環(huán)境。在這個環(huán)境中,能夠運行多個用戶的多個進(jìn)程。通過系統(tǒng)虛擬化技術(shù),能夠在單個宿主機(jī)硬件平臺上運行多個虛擬機(jī),每個虛擬機(jī)都有著完整的虛擬機(jī)硬件,如虛擬的CPU、內(nèi)存、虛擬的外設(shè)等,并且虛擬機(jī)之間能夠?qū)崿F(xiàn)完整的隔離。

3、虛擬化技術(shù)分類

  • 系統(tǒng)虛擬化
  • 存儲虛擬化
  • 網(wǎng)絡(luò)虛擬化
  • GPU虛擬化
  • 軟件虛擬化
  • 硬件支持虛擬化
  • 本博客主要記錄系統(tǒng)虛擬化相關(guān)內(nèi)容。后面所述“虛擬化”無特殊說明均指“系統(tǒng)虛擬化”。

    4、系統(tǒng)虛擬化發(fā)展歷史

    系統(tǒng)虛擬化:

    1、這種虛擬化通常表現(xiàn)為在單一系統(tǒng)上運行多個操作系統(tǒng)

    2、這些虛擬操作系統(tǒng)同時運行,每個操作系統(tǒng)又是相互獨立

    ??圖3-1 系統(tǒng)虛擬機(jī)原理

    5、進(jìn)一步理解系統(tǒng)虛擬化

    一句話概括(系統(tǒng))虛擬化:一套硬件設(shè)備上,同時運行多個操作系統(tǒng)

    (系統(tǒng))虛擬化目的:將物理資源邏輯化,擺脫物理資源的束縛,提高物理資源利用率

    Hypervisor是一個軟件層或子系統(tǒng):

    ? ? ? ? 也稱為VMM(Virtual Machine Monitor,虛擬機(jī)監(jiān)視器)

    ? ? ? ? 用于管理全局物理資源,VMM之于虛擬機(jī)如同操作系統(tǒng)之于進(jìn)程,VMM利用時分復(fù)用或者空分復(fù)用的辦法將硬件資源在各個虛擬機(jī)之間進(jìn)行分配

    補(bǔ)充:為什么需要VMM監(jiān)控上面的VM?

    虛擬化實現(xiàn)的目標(biāo)看起來很簡單,就是原來在一套硬件上運行一個操作系統(tǒng),現(xiàn)在在一套硬件上運行多個操作系統(tǒng)而已,但是實現(xiàn)起來是非常復(fù)雜的,具有一定的技術(shù)挑戰(zhàn)。例如:最初x86的CPU并沒有考慮虛擬化(虛擬化是在x86架構(gòu)之后才提出來的,這是一切方法被提出的根本原因!)。

    因此,想要實現(xiàn)虛擬化:實現(xiàn)VMM即可

    VMM也稱為host OS 宿主機(jī),OS1,OS2,OS3也稱為guest OS客戶機(jī)

    虛擬機(jī)廠商需要實現(xiàn)的是host OS,guest OS是我們自己根據(jù)需要安裝的

    ?Hypervisor分為兩類:I型虛擬化和II型虛擬化

    Type I: 直接凌駕于硬件之上,構(gòu)建出多個隔離的操作系統(tǒng)環(huán)境:VMware ESXi

    Type II: 依賴于宿主操作系統(tǒng),在其上構(gòu)建出多個隔離的操作系統(tǒng)環(huán)境:VMware WorkStation

    6、(系統(tǒng))虛擬化實現(xiàn)方式

    1、純軟件仿真

    2、虛擬化層翻譯

    3、容器技術(shù)

    ?6.1 純軟件仿真

    通過模擬完整的硬件環(huán)境來虛擬化客戶機(jī)

    模擬x86,ARM,PowerPC等多種CPU

    缺點:效率較低

    代表產(chǎn)品或方案:QEMU,Bochs,PearPC

    6.2 虛擬化層翻譯(重點)

    一個典型的做法是——陷阱 & 模擬技術(shù):簡單來說就是正常情況下直接把虛擬機(jī)中的代碼指令放到物理的CPU上去執(zhí)行,一旦執(zhí)行到一些敏感指令,就觸發(fā)異常,控制流程交給VMM,由VMM來進(jìn)行對應(yīng)的處理,以此來營造出一個虛擬的計算機(jī)環(huán)境。

    如圖是x86處理器的Ring0-Ring3四個“環(huán)”,操作系統(tǒng)內(nèi)核代碼運行在最高權(quán)限的Ring0狀態(tài),應(yīng)用程序工作于最外圍權(quán)限最低的Ring3狀態(tài),剩下的Ring1和Ring2主流的操作系統(tǒng)都基本上沒有使用。

    這里所說的權(quán)限,有兩個層面的約束:

    • 能訪問的內(nèi)存空間
    • 能執(zhí)行的特權(quán)指令

    關(guān)注第二點:特權(quán)指令

    CPU指令集中有一些特殊的指令,用于進(jìn)行硬件I/O通信、內(nèi)存管理、中斷管理等等功能,這一些指令只能在Ring0狀態(tài)下執(zhí)行,被稱為特權(quán)指令。這些操作顯然是不能讓應(yīng)用程序隨便執(zhí)行的。處于Ring3工作狀態(tài)的應(yīng)用程序如果嘗試執(zhí)行這些指令,CPU將自動檢測到并拋出異常。

    虛擬化是將計算資源進(jìn)行邏輯或物理層面的切割劃分,構(gòu)建出一個個獨立的執(zhí)行環(huán)境。按照陷阱 & 模擬手段,可以讓虛擬機(jī)中包含操作系統(tǒng)在內(nèi)的程序統(tǒng)一運行在低權(quán)限的Ring3狀態(tài)下,一旦虛擬機(jī)中的操作系統(tǒng)進(jìn)行內(nèi)存管理、I/O通信、中斷等操作時,執(zhí)行特權(quán)指令,從而觸發(fā)異常,物理機(jī)將異常派遣給VMM,由VMM進(jìn)行對應(yīng)的模擬執(zhí)行。

    這本來是一個實現(xiàn)虛擬化很理想的模式,不過x86架構(gòu)的CPU在這里遇到了一個跨不過去的坎。到底是什么問題呢?

    回顧一下前面描繪的理想模式,要這種模式能夠?qū)崿F(xiàn)的前提是執(zhí)行敏感指令的時候能夠觸發(fā)異常,讓VMM有機(jī)會介入,去模擬一個虛擬的環(huán)境出來。

    但現(xiàn)實是,x86架構(gòu)的CPU指令集中有那么一部分指令不是特權(quán)指令,Ring3狀態(tài)下也能夠執(zhí)行,但這些指令對于虛擬機(jī)來說卻是敏感的不能讓它們直接執(zhí)行。一旦執(zhí)行,沒法觸發(fā)異常,VMM也就無法介入,這結(jié)果將導(dǎo)致虛擬機(jī)中的代碼指令出現(xiàn)無法預(yù)知的錯誤,更嚴(yán)重的是影響到真實物理計算機(jī)的運行,虛擬化所謂的安全隔離、等價性也就無從談起。

    怎么解決這個問題,讓x86架構(gòu)CPU也能支持虛擬化呢?

    6.2.1 全虛擬化

    ?基于二進(jìn)制翻譯的全虛擬化:

    Hypervisor運行在Ring0,Guest OS運行在Ring1

    機(jī)制:異常、捕獲,翻譯

    eg:VMware Workstation,QEMU,Virtual PC

    VMware和QEMU走出了兩條不同的路。

    VMware創(chuàng)造性的提出了一個二進(jìn)制翻譯技術(shù)。VMM在虛擬機(jī)操作系統(tǒng)和宿主計算機(jī)之間扮演一個橋梁的角色,將虛擬機(jī)中的要執(zhí)行的指令“翻譯”成恰當(dāng)?shù)闹噶钤谒拗魑锢碛嬎銠C(jī)上執(zhí)行,以此來模擬執(zhí)行虛擬機(jī)中的程序。可以簡單理解成Java虛擬機(jī)執(zhí)行Java字節(jié)碼的過程,不同的是Java虛擬機(jī)執(zhí)行的是字節(jié)碼,而VMM模擬執(zhí)行的是CPU指令。

    另外也并非所有的指令都是模擬執(zhí)行的,VMware在這里做了不少的優(yōu)化,對一些“安全”的指令,就讓它直接執(zhí)行。所以VMware的二進(jìn)制翻譯技術(shù)也融合了部分的直接執(zhí)行。

    對于虛擬機(jī)中的操作系統(tǒng),VMM需要完整模擬底層的硬件設(shè)備,包括處理器、內(nèi)存、時鐘、I/O設(shè)備、中斷等等,換句話說,VMM用純軟件的形式“模擬”出一臺計算機(jī)供虛擬機(jī)中的操作系統(tǒng)使用。

    這種完全模擬一臺計算機(jī)的技術(shù)也稱為全虛擬化,這樣做的好處顯而易見,虛擬機(jī)中的操作系統(tǒng)感知不到自己是在虛擬機(jī)中,代碼無需任何改動,直接可以安裝。而缺點也是可以想象:完全用軟件模擬,轉(zhuǎn)換翻譯執(zhí)行,性能堪憂!

    而QEMU則是完全軟件層面的“模擬”,乍一看和VMware好像差不多,不過實際本質(zhì)是完全不同的。VMware是將原始CPU指令序列翻譯成經(jīng)過處理后的CPU指令序列來執(zhí)行。而QEMU則是完全模擬執(zhí)行整個CPU指令集,更像是“解釋執(zhí)行”,兩者的性能不可同日而語。

    ?趣味故事

    QEMU是主機(jī)上的一個VMM,通過動態(tài)二進(jìn)制翻譯來模擬 CPU,內(nèi)存,硬盤,網(wǎng)卡等外設(shè)。VM認(rèn)為自己是直接和硬件打交道的,但是實際上VM是和QEMU這個仿真模擬器模擬出來的設(shè)備打交道。當(dāng)VM需要使用硬件的時候,QEMU將VM調(diào)用硬件的操作,通過二進(jìn)制翻譯成HOST OS的指令,之后交給在真正的硬件處理。(由于所有虛擬機(jī)調(diào)用硬件的指令都需要將經(jīng)過QEMU的翻譯,所以效率較低,但是也是可以實現(xiàn)虛擬化的)

    如果用戶態(tài)程序做事情,就將扳手掰到第3等級,一旦要申請使用更多的資源,就需要申請將扳手掰到第0等級,內(nèi)核才能在高權(quán)限訪問這些資源,申請完資源,返回到用戶態(tài),扳手再掰回去。

    這個程序一直非常順利的運行著,直到虛擬機(jī)的出現(xiàn)。

    如果大家用過Vmware桌面版,你可以用這個虛擬化軟件創(chuàng)建虛擬機(jī),在虛擬機(jī)里面安裝一個Linux或者windows,外面的操作系統(tǒng)也可以是Linux或者Windows。

    當(dāng)你使用虛擬機(jī)軟件的時候,和你的excel一樣,是一個普通的應(yīng)用。

    當(dāng)你進(jìn)入虛擬機(jī)的時候,虛擬機(jī)里面的excel也是一個普通的應(yīng)用。

    但是當(dāng)你設(shè)身處地的站在虛擬機(jī)里面的內(nèi)核的角度思考一下人生,你就困惑了,我到底個啥?

    在硬件上的操作系統(tǒng)來看,我是一個普通的應(yīng)用,只能運行在用戶態(tài)。可是我是個內(nèi)核啊,應(yīng)該運行在內(nèi)核態(tài),當(dāng)虛擬機(jī)里面的excel要訪問網(wǎng)絡(luò)的時候,向我請求,我的代碼就要努力的去操作網(wǎng)絡(luò)資源,我努力,但是我做不到,我沒有權(quán)限!

    虛擬化層,也就是Vmware需要幫我解決這個問題。

    第一種方式,全虛擬化,其實就是騙我。虛擬化軟件(QEMU)模擬假的CPU,內(nèi)存,網(wǎng)絡(luò),硬盤給我,讓我自我感覺良好,終于又像個內(nèi)核了。

    但是真正的工作模式是這樣的:

    ????????虛擬機(jī)內(nèi)核:我要在CPU上跑一個指令!

    ????????QEMU:沒問題,你是內(nèi)核嘛,可以跑

    ????????QEMU去找物理機(jī)內(nèi)核:報告管家,我管理的虛擬機(jī)里面的一個要執(zhí)行一個CPU指令,幫忙來一小段時間空閑的CPU時間,讓我代他跑個指令。

    ????????物理機(jī)內(nèi)核:你等著,另一個跑著呢。好嘞,他終于跑完了,該你了。

    ????????QEMU:我代他跑,終于跑完了,出來結(jié)果了

    ????????QEMU轉(zhuǎn)頭給虛擬機(jī)內(nèi)核:跑完了,結(jié)果是這個,我說你是內(nèi)核吧,絕對有權(quán)限,沒問題,下次跑指令找我啊。

    ????????虛擬機(jī)內(nèi)核:看來我真的是內(nèi)核呢。可是哥,好像這點指令跑的有點慢啊。

    ????????QEMU:這就不錯啦,好幾個排著隊跑呢。

    內(nèi)存的申請模式如下:

    ????????虛擬機(jī)內(nèi)核:我啟動需要4G內(nèi)存,我好分給我上面的應(yīng)用。

    ????????QEMU:沒問題,才4G,你是內(nèi)核嘛,馬上申請好。

    ????????QEMU轉(zhuǎn)頭給物理機(jī)內(nèi)核:報告,管家,我啟動了一個虛擬機(jī),需要4G內(nèi)存,給我4個房間唄。

    ????????物理機(jī)內(nèi)核:怎么又一個虛擬機(jī)啊,好吧,給你90,91,92,93四個房間。

    ????????QEMU轉(zhuǎn)頭給虛擬機(jī)內(nèi)核:內(nèi)存有了,0,1,2,3這個四個房間都是你的,你看,你是內(nèi)核嘛,獨占資源,從0編號的就是你的。

    ????????虛擬機(jī)內(nèi)核:看來我真的是內(nèi)核啊,能從頭開始用。那好,我就在房間2的第三個柜子里面放個東西吧。

    ????????QEMU:要放東西啊,沒問題。心里想:我查查看,這個虛擬機(jī)是90號房間開頭的,他要在房間2放東西,那就相當(dāng)于在房間92放東西。

    ????????QEMU轉(zhuǎn)頭給物理機(jī)內(nèi)核:報告,管家,我上面的虛擬機(jī)要在92號房間的第三個柜子里面放個東西。

    網(wǎng)絡(luò)和硬盤也是類似,都是虛擬化軟件(?QEMU)模擬一個給虛擬機(jī)內(nèi)核看的,其實啥事兒都需要虛擬化軟件轉(zhuǎn)一遍。

    這種方式一個壞處,就是慢,往往慢到不能忍受

    6.2.2 半虛擬化

    半虛擬化(超虛擬化、操作系統(tǒng)輔助虛擬化):

    Hypervisor運行在Ring0

    Guest OS不能直接運行在Ring0,需要修改Guest OS內(nèi)核,將運行在Ring0上的指令轉(zhuǎn)為調(diào)用Hypervisor

    Guest OS上的APP運行在Ring3

    eg:Xen

    Xen早期是在x86架構(gòu)上直接完成的虛擬化,需要修改虛擬機(jī)內(nèi)部的操作系統(tǒng),使得Xen的整個VMM非常復(fù)雜,缺陷也比較多

    前面說由于敏感指令的關(guān)系,全虛擬化的VMM需要捕獲到這些指令并完整模擬執(zhí)行這個過程,實現(xiàn)既滿足虛擬機(jī)操作系統(tǒng)的需要,又不至于影響到物理計算機(jī)。

    但說來簡單,這個模擬過程實際上相當(dāng)?shù)膹?fù)雜,涉及到大量底層技術(shù),并且如此模擬費時費力。

    而試想一下,如果把操作系統(tǒng)中所有執(zhí)行敏感指令的地方都改掉,改成一個接口調(diào)用(HyperCall),接口的提供方VMM實現(xiàn)對應(yīng)處理,省去了捕獲和模擬硬件流程等一大段工作,性能將獲得大幅度提升。

    這就是半虛擬化,這項技術(shù)的代表就是Xen,一個誕生于2003年的開源項目。

    這項技術(shù)一個最大的問題是:需要修改gest OS內(nèi)核,做相應(yīng)的適配工作。這對于像Linux這樣的開源軟件還能接受,充其量多了些工作量罷了。但對于Windows這樣閉源的商業(yè)操作系統(tǒng),修改它的代碼,無異于癡人說夢。

    趣聞故事

    為了取得更高的性能,讓虛擬機(jī)內(nèi)核從代碼層面就重新定位自己的身份,不能像訪問物理機(jī)一樣訪問網(wǎng)絡(luò)或者硬盤,而是用一種特殊的方式:我知道我不是物理機(jī)內(nèi)核,我知道我是虛擬機(jī),我沒那么高的權(quán)限,我很可能和很多虛擬機(jī)共享物理資源,所以我要學(xué)會排隊,我寫硬盤其實寫的是一個物理機(jī)上的文件,那我的寫文件的緩存方式是不是可以變一下,我發(fā)送網(wǎng)絡(luò)包,根本就不是發(fā)給真正的網(wǎng)絡(luò)設(shè)備,而是給虛擬的設(shè)備,我可不可以直接在內(nèi)存里面拷貝給他,等等。

    一旦我知道我不是物理機(jī)內(nèi)核,痛定思痛,只好重新認(rèn)識自己,反而能找出很多方式來優(yōu)化我的資源訪問。

    這叫做類虛擬化或者半虛擬化。

    6.2.3 硬件輔助的虛擬化(效率高)

    核心思想:為CPU本身增加對虛擬化的支持

    Intel VTAMD-V創(chuàng)建一個新的Ring-1單獨給Hypervisor使用

    Guest OS 可以直接使用Ring0無需修改

    eg:VMware ESXi,Microsoft Hyper-V,Xen3.0,KVM

    硬件輔助虛擬化細(xì)節(jié)較為復(fù)雜,簡單來說,新一代CPU在原先的Ring0-Ring3四種工作狀態(tài)之下,再引入了一個叫工作模式的概念,有VMX root operation?和?VMX non-root operation?兩種模式,每種模式都具有完整的Ring0-Ring3四種工作狀態(tài),前者是VMM運行的模式,后者是虛擬機(jī)中的OS運行的模式。

    VMM運行的層次,有些地方將其稱為Ring -1,VMM可以通過CPU提供的編程接口,配置對哪些指令的劫持和捕獲,從而實現(xiàn)對虛擬機(jī)操作系統(tǒng)的掌控。

    換句話說,原先的VMM為了能夠掌控虛擬機(jī)中代碼的執(zhí)行,不得已采用“中間人”來進(jìn)行翻譯執(zhí)行,現(xiàn)在新的CPU告訴VMM:不用那么麻煩了,你提前告訴我你對哪些指令哪些事件感興趣,我在執(zhí)行這些指令和發(fā)生這些事件的時候就通知你,你就可以實現(xiàn)掌控了。完全由硬件層面提供支持,性能自然高了不少。

    上面只是硬件輔助虛擬化技術(shù)的一個簡單理解,實際上還包含更多的要素,提供了更多的便利給VMM,包括內(nèi)存的虛擬、I/O的虛擬等等,讓VMM的設(shè)計開發(fā)工作大大的簡化,VMM不再需要付出昂貴的模擬執(zhí)行成本,整體虛擬化的性能也有了大幅度的提升

    Intel和AMD在2005年開始在CPU層面提供對系統(tǒng)虛擬化的支持,叫做硬件虛擬化。Intel在x86指令集的基礎(chǔ)上增加了一套VMX擴(kuò)展指令VT-x,為CPU增加了新的運行模式,完成了x86虛擬化漏洞的修補(bǔ)。通過新的硬件虛擬化指令,可以非常方便的構(gòu)造VMM,并且x86虛擬機(jī)中的代碼能夠原生的運行在物理CPU上。此外還有,AMD的AMD-v系列技術(shù)。

    趣味故事

    為了讓虛擬化軟件(VMM)不當(dāng)傳話筒,還是要讓虛擬機(jī)內(nèi)核正視自己的身份,你不是物理機(jī),你是虛擬機(jī)。

    但是怎么解決權(quán)限等級的問題呢?于是Intel的VT-x和AMD的AMD-V從硬件層面幫上了忙。另弄一個新的標(biāo)志位,表示當(dāng)前是在虛擬機(jī)狀態(tài)下,還是真正的物理機(jī)內(nèi)核下。

    對于虛擬機(jī)內(nèi)核來講,只要將標(biāo)志位設(shè)為虛擬機(jī)狀態(tài),則可以直接在CPU上執(zhí)行大部分的指令,不需要虛擬化軟件在中間轉(zhuǎn)述,除非遇到特別敏感的指令,才需要將標(biāo)志位設(shè)為物理機(jī)內(nèi)核態(tài)運行,這樣大大提高了效率。

    所以安裝虛擬機(jī)的時候,務(wù)必要將物理CPU的這個標(biāo)志位打開,是否打開對于Intel可以查看grep?"vmx" /proc/cpuinfo,對于AMD可以查看grep "svm" /proc/cpuinfo

    這叫做硬件輔助虛擬化。

    硬件輔助虛擬化的發(fā)展(以KVM為代表)

    有了硬件輔助虛擬化的加持,虛擬化技術(shù)開始呈現(xiàn)井噴之勢。這其中在云計算領(lǐng)域聲名鵲起的當(dāng)屬開源的KVM技術(shù)了。

    KVM全稱for Kernel-based Virtual Machine,意為基于內(nèi)核的虛擬機(jī)。

    在虛擬化底層技術(shù)上,KVM和VMware后續(xù)版本一樣,都是基于硬件輔助虛擬化的實現(xiàn)。不同的是VMware作為獨立的第三方軟件可以安裝在Linux、Windows、MacOS等多種不同的操作系統(tǒng)之上,而KVM作為一項虛擬化技術(shù)已經(jīng)集成到Linux內(nèi)核之中,可以認(rèn)為Linux內(nèi)核本身就是一個HyperVisor,這也是KVM名字的含義,因此該技術(shù)只能在Linux服務(wù)器上使用

    KVM本身基于硬件輔助虛擬化(通過內(nèi)核模塊kvm.ko來實現(xiàn)核心虛擬化功能),僅僅實現(xiàn)CPU和內(nèi)存的虛擬化,有了KVM之后,Guest OS的CPU指令不用再經(jīng)過QEMU轉(zhuǎn)譯便可直接運行,大大提高了運行速度。但一臺計算機(jī)不僅僅有CPU和內(nèi)存,還需要各種各樣的I/O設(shè)備,所以它必須結(jié)合QEMU才能構(gòu)成一個完整的虛擬化技術(shù)。這個時候,QEMU就和KVM搭上了線,經(jīng)過改造后的QEMU,負(fù)責(zé)外部設(shè)備的虛擬,KVM負(fù)責(zé)底層執(zhí)行引擎和內(nèi)存的虛擬,兩者彼此互補(bǔ),成為新一代云計算虛擬化方案的寵兒(稱為KVM-QEMU架構(gòu))。?

    注:在x86架構(gòu)CPU的硬件輔助虛擬化技術(shù)誕生之前,QEMU就已經(jīng)采用全套軟件模擬的辦法來實現(xiàn)虛擬化,只不過這種方案下的執(zhí)行性能非常低下(全虛擬化)。

    ?QEMU現(xiàn)在的主要用途已經(jīng)不是作為一個模擬器了,而是作為以?QEMU-KVM為基礎(chǔ)的為云計算服務(wù)的系統(tǒng)虛擬化軟件。不僅僅KVM將?QEMU作為應(yīng)用層組件,Xen后來支持的硬件虛擬機(jī)也使用?QEMU作為其用戶態(tài)組件來完成虛擬機(jī)的設(shè)備模擬。

    6.3 容器技術(shù)(LXC和Docker)

    ?一種輕量級/操作系統(tǒng)虛擬化方式,由Linux內(nèi)核支持

    起源:chroot系統(tǒng)調(diào)用,對當(dāng)前程序及其子進(jìn)程改變根目錄

    優(yōu)勢:更快的交付和部署、更高效的虛擬化、更輕松的遷移和擴(kuò)展、更簡單的管理

    無論是基于翻譯和模擬的全虛擬化技術(shù)、半虛擬化技術(shù),還是有了CPU硬件加持下的全虛擬化技術(shù),其虛擬化的目標(biāo)都是一臺完整的計算機(jī)(即:系統(tǒng)虛擬化),擁有底層的物理硬件、操作系統(tǒng)和應(yīng)用程序執(zhí)行的完整環(huán)境。而虛擬機(jī)中的程序或許只是想要一個單獨的執(zhí)行執(zhí)行環(huán)境,不需要虛擬出一個完整的計算機(jī)來。

    不同于虛擬化技術(shù)要完整虛擬化一臺計算機(jī),容器技術(shù)更像是操作系統(tǒng)層面的虛擬化,它只需要虛擬出一個操作系統(tǒng)環(huán)境。

    LXC技術(shù)就是這種方案的一個典型代表,全稱是LinuX Container,通過Linux內(nèi)核的Cgroups技術(shù)和namespace技術(shù)的支撐,隔離操作系統(tǒng)文件、網(wǎng)絡(luò)等資源,在原生操作系統(tǒng)上隔離出一個單獨的空間,將應(yīng)用程序置于其中運行。舉個例子,一套原來是三居室的房子,被改造成三個一居室的套間,每個一居室套間里面都配備了衛(wèi)生間和廚房,對于住在里面的人來說就是一套完整的住房。

    Docker技術(shù)底層原理與LXC并無本質(zhì)區(qū)別,甚至在早期Docker就是直接基于LXC的高層次封裝。Docker在LXC的基礎(chǔ)上更進(jìn)一步,將執(zhí)行執(zhí)行環(huán)境中的各個組件和依賴打包封裝成獨立的對象,更便于移植和部署。

    容器技術(shù)的好處是輕量,所有隔離空間的程序代碼指令不需要翻譯轉(zhuǎn)換,就可以直接在CPU上執(zhí)行,大家底層都是同一個操作系統(tǒng),通過軟件層面上的邏輯隔離形成一個個單獨的空間。

    容器技術(shù)的缺點是安全性不如虛擬化技術(shù)高,畢竟軟件層面的隔離比起硬件層面的隔離要弱得多。隔離環(huán)境系統(tǒng)和外面的主機(jī)共用的是同一個操作系統(tǒng)內(nèi)核,一旦利用內(nèi)核漏洞發(fā)起攻擊,程序突破容器限制,實現(xiàn)逃逸,危及宿主計算機(jī),安全也就不復(fù)存在。

    記在最后:這篇博文嚴(yán)格來說只是找到了虛擬化的“門”,并不算是“入了門”,筆者接下來準(zhǔn)備將調(diào)研重點放在“?QEMU”上,具體包括?QEMU的二進(jìn)制翻譯實現(xiàn)原理,安裝,代碼閱讀等。

    君子以坦蕩立于世間,必將步步生花,一路繁華,加油!

    注:本篇博文內(nèi)容是作者對網(wǎng)上的眾多資料學(xué)習(xí)后,形成的閱讀筆記,現(xiàn)將部分參考資料備注如下:

    QEMU/KVM源碼解析與應(yīng)用 -- 李強(qiáng) -京東閱讀-在線閱讀

    開源虛擬化KVM入門(KVM架構(gòu)+KVM基本管理)視頻課程【共34課時】_虛擬化課程-51CTO學(xué)堂

    我是虛擬機(jī)內(nèi)核我困惑?!

    懂了!VMware、KVM、Docker原來是這么回事兒 - 知乎

    QEMU/KVM源碼解析與應(yīng)用(第一章)_都怪這夜色的博客-CSDN博客_qemukvm源碼解析與應(yīng)用pdf

    QEMU-KVM介紹_虛擬化系列視頻課程(二)------KVM虛擬機(jī)實戰(zhàn)篇_虛擬化視頻-51CTO學(xué)堂Qemu,KVM,Virsh傻傻的分不清

    總結(jié)

    以上是生活随笔為你收集整理的虚拟化技术基础知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。