官术网_书友最值得收藏!

第1章 QEMU與KVM概述

1.1 虛擬化簡介

1.1.1 虛擬化思想

計算機科學家David Wheeler有一句名言:“計算機科學中的任何問題都可以通過增加一個中間層來解決。”這句話簡潔而深刻地說明了虛擬化的思想存在于計算機科學中的各個領域。虛擬化的主要思想是,通過分層將底層的復雜、難用的資源虛擬抽象成簡單、易用的資源,提供給上層使用。本質上,計算機的發展過程也是虛擬化不斷發展的過程。

CPU內部遍布的數字邏輯電路只能夠識別二進制數據0、1,機器碼是計算機唯一能夠識別的數據。匯編語言的出現讓程序員能夠比較簡單地實現CPU的執行和內存訪問。C語言的出現進一步方便了程序員,使得程序員可以從具體CPU架構指令脫離出來,大部分情況下只需要考慮業務即可。Python、Java等現代高級語言更是重新定義了自己的指令,由各個平臺的虛擬機去解釋執行,實現了完全的跨平臺。從機器碼、匯編語言到C語言,再到高級語言,其本質就是一個不斷虛擬的過程,將底層復雜的接口轉變成了上層容易使用的接口。

硬盤由柱面、磁道、扇區構成,里面存放著文件等數據信息,計算機用戶在進行文件訪問的時候并不需要關心這些底層細節。這些細節經過操作系統的抽象,變成了文件與目錄的概念,使得復雜的硬盤數據管理變得簡單方便,應用程序能夠通過文件管理的接口方便地創建、讀取、寫入文件,這本質上也是一種虛擬。

TCP/IP協議棧模型是另一個虛擬化的例子。網卡設備傳遞的都是二進制數據,經過網絡層、傳輸層的抽象之后,應用程序不需要直接跟網絡數據包的收發細節打交道,只需要關心協議棧最上層的接口,也不需要關心其他使用網卡設備的程序,只需要將要發送的數據和地址提供給協議棧,協議棧會自動處理好IP路由、分片等細節。

現代操作系統中都有很多進程,每一個進程都是對計算機的抽象,進程都認為自己獨占整個計算機系統的資源,有著獨立的CPU和內存。但這些都是操作系統呈現給進程的假象,操作系統通過在各個進程之間共享CPU,為每個進程創建獨立的虛擬內存,這不僅能夠實現資源的充分利用,也能夠實現進程之間的安全隔離。

操作系統會提供一組接口給應用程序,方便開發者編寫應用程序,比如創建進程操作文件、發送網絡數據等,這種抽象本質上也是虛擬化的一種體現。開發者只需要關注上層的接口而不需要關心底層的細節實現。這樣底層的實現即使發生了變化,也不會影響上層應用程序的運行,如Wine項目和Cygwin項目,前者能夠讓為Windows編寫的程序運行在Linux上,后者能夠讓為Linux編寫的程序運行在Windows上。

以上的例子都是虛擬化思想的體現。底層的資源或者通過空間的分割,或者通過時間的分割,將下層的資源通過一種簡單易用的方式轉換成另一種資源,提供給上層使用。經典的操作系統書籍Operating Systems:Three Easy Pieces從三個方面講述了操作系統的基本原理,第一部分即是虛擬化思想,其他兩部分是并行和持久化。

1.1.2 虛擬機簡介

上一節闡述了虛擬化的思想,本節介紹一下虛擬機(Virtual Machine,VM)。虛擬機,顧名思義,其重點在“機”上,也就是機器。理論上講,只要能提供一個執行環境,完成用戶指定任務的對象都可以叫作機器。所以可以從多種角度來解釋虛擬機。

最簡單的虛擬機是進程,這種虛擬機太過于普通,以至于很多人都沒有意識到它們是虛擬機。進程可以看作是一組資源的集合,有自己獨立的進程地址空間以及獨立的CPU和寄存器,執行程序員編寫的指令,完成一定的任務。一個進程在執行指令、訪問內存的時候并不會影響其他進程。這是通過操作系統完成的,操作系統把CPU按照時間分配復用,把內存按照空間分配復用,通過管理底層資源,使得進程都能夠使用整個計算機的物理資源,每個進程都認為自己擁有整個機器。操作系統上可以創建很多個進程,每一個進程都可以看成是一個獨立的虛擬機。進程虛擬機如圖1-1所示。

圖1-1 進程虛擬機

模擬器是另一種形式的虛擬機。進程的指令都是可以直接運行在硬件CPU上的,模擬器則不同,它可以使為一種硬件指令集(Instruction Set Architecture,ISA)編譯的程序運行在另一種硬件指令集上。應用程序在源ISA(如ARM)上被編譯出來,在模擬器的幫助下,運行在不同的目標ISA(比如x86)上。模擬器可以通過解釋來實現,即對程序的源ISA指令一條一條進行分析,然后執行相應的ISA指令上的操作。模擬器也可以通過二進制翻譯實現,即首先將程序中所有的源ISA指令翻譯成目標ISA上具有同樣功能的指令,然后在目標ISA指令機器上執行。模擬器的基本原理如圖1-2所示。典型的模擬器有QEMU(Quick Emulator)的用戶態程序模擬、Bochs模擬器等。

高級語言虛擬機在模擬器的基礎上更進一步,將源ISA和目標ISA完全分離開。在高級語言虛擬機中,通常會設計一種全新的虛擬ISA,并在其中定義新的指令集、數據操作、寄存器的使用等類似于物理ISA中的規范。不同于普通程序和模擬器運行的程序,高級語言虛擬機的程序中沒有任何具體物理ISA指令字節,而是自己定義虛擬的指令字節,這些指令字節通常叫作字節碼。任何想要運行這種虛擬ISA指令的物理ISA平臺都需要實現一個虛擬機,該虛擬機能夠執行虛擬機ISA指令到物理ISA指令的轉換。程序員通過使用高級語言編寫程序,不需要考慮其具體的運行平臺,即可非常方便地實現程序的跨平臺分發。高級語言虛擬機如圖1-3所示。典型的高級語言虛擬機有JVM虛擬機、Python虛擬機等。

圖1-2 模擬器原理

圖1-3 高級語言虛擬機

在高級語言虛擬機中,虛擬ISA是公開的規范,每個人都可以獲得,并且可以自己寫出反編譯的工具,通過字節碼來還原程序的源碼。這也是為什么使用Java語言的程序常常需要進行代碼混淆。假設我們自己定義一個虛擬的ISA,但是并不公開其規范,并且可以時不時地修改這些規范,然后將自帶的虛擬機和字節碼合起來一起進行分發,這樣使用基于物理ISA的反編譯工具就無法還原出程序的匯編代碼,這就是軟件保護中虛擬機保護的原理。

進程、模擬器、高級語言虛擬機提供的都是指令的執行環境,而系統虛擬機提供的是一個完整的系統環境。在這個環境中,能夠運行多個用戶的多個進程。通過系統虛擬化技術,能夠在單個的宿主機硬件平臺上運行多個虛擬機,每個虛擬機都有著完整的虛擬機硬件,如虛擬的CPU、內存、虛擬的外設等,并且虛擬機之間能夠實現完整的隔離。早期系統虛擬機誕生的原因主要是大型計算機系統非常龐大且昂貴,需要多個用戶共享,而用戶希望可以自由地運行其需要的操作系統。在系統虛擬化中,管理全局物理資源的軟件叫作虛擬機監控器(Virtual Machine Monitor,VMM),VMM之于虛擬機就如同操作系統之于進程,VMM利用時分復用或者空分復用的辦法將硬件資源在各個虛擬機之間進行分配。系統虛擬機原理如圖1-4所示。典型的系統虛擬化解決方案包括VMware Workstation、QEMU、VirtualBox和HyperV等。

圖1-4 系統虛擬機

1.1.3 系統虛擬化的歷史

虛擬化基本上是與操作系統同時出現的,早在大型機時代就已經存在了,如20世紀60年代IBM的分時系統。那個時候的計算機普遍比較昂貴,系統虛擬化的主要目的是在多用戶之間實現物理資源的共享。隨著之后計算機的不斷發展、計算機價格的下降以及個人計算機的普及,用戶對虛擬化的需求大大減少,系統虛擬化技術的發展也逐漸沒落了下來。

隨著硬件技術的再次發展,普通PC也能夠支持多個系統同時運行,虛擬化又重新出現在人們的視野中,VMware在1998年的成立標志著虛擬化的全面復興,隨后2001年劍橋大學開發了Xen。

隨著云計算概念的提出與實踐的落地,虛擬化更加有了用武之地。虛擬化能夠將一臺小型服務器或者普通PC虛擬出多個虛擬機,每個虛擬機都可以以計算資源的形式出售給租戶,這樣不僅能夠提升資源的利用率,還能夠非常方便地刪除/創建各種規格的虛擬機,提供按需分配的功能。

系統虛擬化在云計算的支持下得到了非常迅速的發展,如之前的x86架構不支持硬件層面的虛擬機,導致VMM的設計和實現都比較麻煩,并且性能也不是很好。為了克服x86架構的虛擬化缺陷,Intel和AMD都相繼在CPU硬件層面增加了虛擬化的支持。隨著用戶對性能需求的不斷提升,內存、外設等也在硬件層面提供了對虛擬化的支持。

2006年,以色列的初創公司Qumranet利用Intel的硬件虛擬化技術在Linux內核上開發了KVM(Kernel Virtual Machine)。KVM架構精簡,與Linux內核天然融合,得以很快進入內核。后來Red Hat收購了Qumranet,全力投入到KVM的建設中。KVM現在已經是一個非常成功的虛擬化VMM,廣泛應用在各種開源云平臺上,成為云計算的基石。

如同操作系統一樣,虛擬化方案也有很多,這里簡單介紹幾個。

● VMware Workstation:VMware最早的產品,至今仍有大量用戶使用。VMware Workstation能夠很方便地在PC上構建一個虛擬機,用戶可以在其上安裝各種操作系統,能夠非常方便地完成多種任務,比如跨平臺的開發測試,不需要再獨立使用一個單獨的宿主機。比如在進行惡意軟件的分析時,一般情況下不需要擔心病毒會破壞自己的計算機。

● VirtualBox:最早由一個德國公司開發,后來被甲骨文收購。它的優點是性能不錯并且開源,能夠很方便地用來實現一些定制需求,但是不如VMware Workstation穩定。

● HyperV:微軟提供的虛擬化解決方案,微軟用它來構建自己的云計算平臺。

● Xen:早期的開源虛擬化方案,出現在各種硬件虛擬化技術之前。它的設計有很多不可避免的問題,比如虛擬機的內存管理需要與Xen一起協作完成,這導致了非常多的安全問題。雖然后來Xen也支持利用硬件虛擬化的虛擬機,但是其發展已經遠不如KVM。即便如此,Xen作為早期的開源VMM,其諸多思想直到今天也在影響著虛擬化社區。

主站蜘蛛池模板: 大石桥市| 武清区| 茌平县| 万全县| 婺源县| 崇礼县| 汨罗市| 新泰市| 阜城县| 华蓥市| 大化| 建湖县| 吴川市| 翁源县| 岑溪市| 阿巴嘎旗| 宁德市| 郑州市| 桓台县| 阳江市| 揭阳市| 左贡县| 成都市| 岳阳市| 望奎县| 阜平县| 永胜县| 林州市| 徐州市| 吴桥县| 上蔡县| 江阴市| 黄平县| 沂南县| 文水县| 观塘区| 黔西县| 泾川县| 金沙县| 深水埗区| 吉林市|