本章爲讀者提供了Linux虛擬化中流行技術的深入看法,以及相較於其餘同類技術的優點特色。本書共有14章,囊括了KVM虛擬化中的各個方面,從KVM的內部構造開始,幷包括了諸如軟件定義網絡(SDN),性能調節和優化以及P2V(physical to virtual migration)等高級內容。node
在本章中,咱們將學習如下內容:linux
TIP:在開始學習以前,你能夠前往本書的主頁,查看相關的更新,技巧和更新狀況 http://bit.ly/mkvmvirtgit
在哲學概念中,虛擬意味着「某些並不是真實存在的東西(something that is not real)」。在計算機科學中,虛擬的意思「一個並不是物理存在的硬件環境(a hardware environment that is not real)」。在這裏,咱們複用物理硬件的功能,並用來運行操做系統。用來建立此類環境的相關技術,咱們稱之爲「虛擬化技術」,簡稱「虛擬化」。運行虛擬化軟件(Hypervisor或者叫VMM,虛擬機監視器)的物理設施咱們稱之爲Host,安裝在Hypervisor之上的虛擬機稱爲Guest。安全
User-mode Linux (UML) 是首個出如今Linux上的虛擬化技術。如今Linux上已經有許多種虛擬化技術可供選擇,能夠將一臺主機虛擬成多臺使用。比較流行的虛擬化技術包括KVM,XEN,QEMU以及VirtualBox。本書主要聚焦的是KVM虛擬化。服務器
開放性,靈活性和性能是Linux虛擬化吸引用戶的幾個主要因素。和其餘的開源同樣,Linux虛擬化技術是在一種合做的模式下獲得發展的,這間接地使用戶享受了開源軟件便利和優點。舉例來講,相較於閉源模式,開源能夠從社區得到普遍輸入,間接幫助下降研究和開發支出,提高了效率,性能和生產力。開源模式鼓勵創新。下面是一些開源帶來的其餘好處和優點:網絡
簡而言之,虛擬化是虛擬 硬件、網絡、存儲、程序、訪問等資源的過程。所以,虛擬化技術能夠應用在以上提到的多個內容當中。架構
例如:app
儘管如此,在本書的內容中,咱們主要討論基於Hypervisor的軟件虛擬化方面的內容。從這個視角來看,虛擬化隱藏了底層物理硬件,使其能夠被多個操做系統共享和使用。這也被稱爲平臺虛擬化。簡而言之,這代表了在底層硬件和運行在它上面的操做系統間,有一個稱爲hypervisor/VMM的中間層。運行在Hypervisor之上的操做系統被稱爲Guest或者VM。負載均衡
讓咱們來討論一下虛擬化的一些好處:dom
正如咱們在前一節所討論的,儘管虛擬化能夠在不一樣的領域實現,但我想更多地討論操做系統虛擬化和軟件虛擬化。
OS虛擬化技術容許同一物理主機服務不一樣的工做負載,並隔離每一個工做負載。請注意,這些工做負載在相同的操做系統上獨立運行。這容許物理服務器運行多個獨立的操做系統實例,稱爲容器。這被稱爲基於容器的虛擬化技術也沒有什麼不對。此類虛擬化技術的優點是,Host的操做系統不須要模擬和自身OS不一樣的的系統調用接口。因爲上述接口不存在,所以在這種虛擬化中,其餘操做系統沒法被虛擬化或支持。這是此類虛擬化的常見且易於理解的限制。Solaris containers、FreeBSD jails和Parallel的OpenVZ都屬於這一類虛擬化。在使用這種方法時,全部的工做負載都運行在單個系統上。進程隔離和資源管理由內核提供。雖然全部的虛擬機/容器在同一個內核中運行,它們也有本身獨立的文件系統、進程、內存、設備等等。從另外一個角度來看,同一物理主機上的Windows、Unix和Linux工做負載的混合,並非這種虛擬化的一部分。可是性能和效率上帶來的好處遠超過該技術的侷限性,由於一個操做系統就能夠支持全部的虛擬環境。此外,從一個分區切換到另外一個分區的速度很是快。
在咱們進一步討論虛擬化和深刻到下一種虛擬化類型以前(hypervisor-based /軟件虛擬化),瞭解計算機科學中的一些術語是頗有用的。話雖如此,咱們仍是從「protection rings」開始吧。在計算機科學中,存在着各類分級保護域(hierarchical protection domains)/特權環(privileged rings)。在訪問計算機系統中的資源時,這種安全機制用於保護數據或錯誤(These are the mechanisms that protect data or faults based on the security enforced when accessing the resources in a computer system.)。這些保護域有助於計算機系統的安全性。
如以前的圖片顯示,protection rings從最高特權到最低特權進行編號。ring 0是最高特權等級,它直接與物理硬件交互,例如CPU和內存等。諸如內存,IO端口和CPU指令的資源經過特權ring受到保護。ring 1和ring 2一般不被使用。大多數通用操做系統只使用兩個ring,即便它們運行的硬件提供了更多的CPU模式。這兩個主要的CPU模式被稱爲內核模式(kernel mode)和用戶模式(user mode)。從操做系統的角度來看,Ring 0被稱爲kernel mode/supervisor mode,而Ring 3是user mode。正如你所想的同樣,應用程序運行在Ring 3。
諸如Linux和Windows這樣的操做系統使用supervisor/kernel 和 user mode。用戶模式在沒有調用內核狀況下,幾乎不能作任何事,由於它被限制了對內存、CPU和I/O端口的訪問。內核能夠在特權模式下運行,這意味着它們能夠在ring 0上運行。爲執行特定的函數,用戶模式代碼(全部應用程序運行在ring 3)必須執行supervisor mode或內核空間的系統調用,操做系統的可信代碼將執行所需的任務並將執行結果返回給用戶空間。簡而言之,正常環境下OS運行在ring 0下。它須要最高特權級別來進行資源管理並提供對硬件的訪問。如下圖片解釋了這一點:
ring大於0時在稱爲unprotected的處理器模式下運行指令。hypervisor/VMM須要訪問主機的內存、CPU和I/O設備。由於,只有在ring 0中運行的代碼才能執行這些操做,它須要運行在最高特權的ring 0,而且放置在靠近內核的地方。若是沒有特定的硬件虛擬化支持,hypervisor/VMM運行在ring 0中,這基本上阻止了虛擬機操做系統運行在ring 0。因此VM的操做系統必須運行在ring1。在VM中安裝的操做系統也須要訪問全部資源,由於它並不能感知虛擬化層。爲了實現這一點,它必須和VMM同樣運行在ring 0中。因爲同一時間只有一個內核能夠運行在ring 0,因此Guest OS必須在另外一個具備更少特權的ring中,或者必須修改以在用戶模式下運行。
這致使須要引入稱爲全虛擬化和半虛擬化的虛擬化方法,咱們將在下面的部分中進行討論。
在全虛擬化中,經過模擬特權指令來克服由Guest OS運行在ring1和VMM運行在ring 0中所產生的限制。全虛擬化在第一代x86 VMM中普遍採用。它依靠例如二進制轉譯(binary translation)來捕獲和虛擬化某些敏感和沒法虛擬化的指令。也就是說,在二進制轉換中,一些系統調用被解釋執行和動態重寫。下圖描述了「Guest OS如何在ring 1下訪問主機硬件,執行特權指令」以及「非特權指令是如何在無ring 1參與的狀況下得到執行」。
經過這種方法,關鍵指令就會在運行時(靜態或動態地)發現,取而代之的是陷入VMM中以軟件仿真的方式執行。與運行在原生虛擬化架構上的虛擬機相比,二進制轉換可能會帶來巨大的性能開銷。
然而,如前面的圖像所示,當咱們使用全虛擬化時,咱們可使用未修改的客戶操做系統。這意味着咱們沒必要改變運行在VMM上的Guest OS 內核。當Guest OS內核執行特權操做時,VMM提供CPU仿真來處理和修改受保護的CPU操做,可是正如前面提到的,與其餘虛擬化模式(稱爲半虛擬化)相比,這會將致使較大的性能開銷。
在半虛擬化中,須要對Guest OS進行修改,以容許這些指令訪問ring 0。換句話說,OS須要經過修改,以「hypercalls」的方式實現VMM/hypervisor和Guest OS的通訊。
NOTE:請注意,咱們也能夠稱VMM爲hypervisor。
半虛擬化技術中hypervisor提供API接口,通過修改的Guest OS能夠調用該接口。特權指令調用與VMM提供的API接口完成信息交換。在這種狀況下,修改後的Guest OS能夠在ring 0中運行。
正如你所見,在這種技術下Guest 內核須要通過修改而運行在VMM上。換句話說,虛擬化對Guest kernel是可感知的。本應在ring 0中運行的特權指令/操做已經被VMM提供的hypercalls所替代。hypercalls調用VMM執行本來由Guest OS完成的工做。因爲Guest kernel有能力經過hypercalls直接與VMM進行通訊,所以與全虛擬化相比,這種技術的有更大的性能優點。然而這須要Guest kernel進行定製化以感知半虛擬化技術,須要軟件支持。
Intel和AMD意識到x86架構(這本書的範圍僅限於x86體系結構中,咱們將主要討論這個架構的演變)全虛擬化和半虛擬化的主要挑戰是性能開銷問題和虛擬化解決方案在設計與維護上的複雜性。Intel和AMD各自獨立地建立了新的x86架構的處理器擴展,分別稱爲Intel VT-x和AMD-v。在Itanium架構上,硬件輔助虛擬化稱爲VT-i。硬件輔助虛擬化是一種平臺虛擬化技術,旨在有效地利用硬件功能執行全虛擬化。不一樣的廠商對此技術有不一樣的命名,包括虛擬化加速、硬件虛擬機和原生虛擬化。
爲了更好地支持虛擬化,Intel和AMD分別引入了虛擬化技術(VT)和安全虛擬機(SVM),做爲IA-32指令集的擴展。這些擴展容許VMM/hypervisor能夠在較低的ring中,運行本來須要運行在內核模式下的Guest OS。硬件輔助虛擬化不只提出了新的指令,還引入了一個新的特權訪問級別ring -1,用以運行hypervisor/VMM,所以Guest OS能夠在運行在ring 0。此外,在硬件輔助虛擬化下,VMM/hypervisor與前面提到的其餘技術相比能夠執行更少的工做,從而下降了性能開銷。
簡單來講,這種虛擬化感知的硬件提供了構建VMM的支持,並確保了客戶操做系統的隔離。這有助於實現更好的性能,並避免了虛擬化解決方案設計上的複雜性。現代虛擬化技術利用這個特性提供虛擬化。一個例子是KVM,咱們將在本書的範圍內詳細討論它。
顧名思義,VMM或hypervisor是負責監視和控制VM或Guest OS的軟件。hypervisor/VMM負責確保不一樣的虛擬化管理任務,例如提供虛擬硬件、VM生命週期管理、VM遷移、實時分配資源、定義虛擬機管理策略等。VMM/hypervisor還負責有效地控制物理平臺資源,例如內存轉換和I / O映射。虛擬化軟件的主要優勢之一是它可以在同一物理系統或硬件上的運行多個客戶機。多個客戶機系統能夠在相同的操做系統或不一樣的操做系統上。例如,能夠有多個Linux Guest OS做爲客戶機運行在同一物理系統上。VMM負責分配這些Guest OS請求的資源。系統硬件(如處理器、內存等)必須根據它們的配置分配給這些客戶操做系統,VMM負責處理這個任務。所以,VMM是虛擬化環境中的一個關鍵組件。
根據VMM/hypervisor的位置,能夠被歸類爲type 1或type 2型。
hypervisor主要被歸類爲Type 1和Type 2型(基於它們駐留在系統中的位置)。可是對於Type 1和Type 2型hypervisor並無明確或標準的定義。若是VMM/hypervisor直接運行在硬件之上,它一般被認爲是一個Type 1的hypervisor。若是有一個操做系統存在,VMM/hypervisor做爲一個單獨的層運行,它將被認爲是一個Type 2 hypervisor。再一次申明,這個概念是開放的,沒有標準的定義。
Type 1型的hypervisor直接與系統硬件交互;它不須要任何主機操做系統。您能夠直接將其安裝在裸金屬系統上,用以運行虛擬機。類型1的管理程序也稱爲裸金屬、嵌入式或原生hypervisor。
oVirt-node是Type 1型的Linux hypervisor的例子。下圖提供對Type 1型hypervisor設計概念圖:
如下是Type 1型hypervisor的優勢:
然而,Type 1 hypervisor不支持自定義。通常狀況下,您不能安裝任何第三方應用程序或驅動程序。
另外一方面,Type 2 hypervisor駐留在操做系統之上,容許您進行大量的自定義。Type 2 hypervisor也被稱爲hosted hypervisor。Type 2 hypervisor依賴於主機操做系統的操做。Type 2 hypervisor的主要優勢是普遍的硬件支持,由於它由底層主機操做系統控制硬件訪問。下面的圖提供了Type 2 hypervisor設計概念的說明:
決定使用哪一類hypervisor主要取決於您在何處部署虛擬化的基礎設施。
還有一點是,與Type 2 hypervisor相比,Type 1 hypervisor執行性能更好,由於它們直接運行在硬件之上。沒有對Type 1和Type 2 hypervisor的正式定義,評估性能沒有多大意義。
下表列出了Linux中的開源虛擬化項目:
Project | Virtualization Type | Project URL |
KVM (Kernel-based Virtual Machine) | Full virtualizatio | http://www.linux-kvm.org/ |
VirtualBox | Full virtualizatio | https://www.virtualbox.org/ |
Xen | Full and paravirtualization | http://www.xenproject.org/ |
Lguest | Paravirtualization | http://lguest.ozlabs.org/ |
UML (User Mode Linux) | http://user-mode-linux.sourceforge.net/ | |
Linux-VServer | http://www.linux-vserver.org/Welcome_to_Linux-VServer.org |
在接下來的部分中,咱們將討論Xen和KVM,這是Linux中領先的開源虛擬化解決方案。
Xen起源於劍橋大學的一個研究項目,初版在2003年正式對外發布。以後,劍橋大學負責這個項目的主管,Lan Pratt,與另一位來自劍橋大學的Simon Crosby合做創辦了公司XenSource。這家公司開始以開源的方式開發這個項目。在2013年4月15日,Xen做爲一個協做項目被移入Linux基金會。Linux基金會爲Xen項目推出了一個新商標,以區分該項目與舊Xen商標的任何商業用途。更多細節能夠在xenproject.org網站找到。
Xen hypervisor已經移植到一些處理器家族中,例如,Intel IA-32/64,x86_64,PowerPC,ARM,MIPS等等。
Xen能夠在半虛擬化和硬件輔助或全虛擬化(HVM)上運行,HVM容許運行未經修改的Guest。Xen hypervisor運行Guest OS的組件稱爲Domains。在XEN中主要有兩種類型的Domains:
Dom U是無特權域或客戶系統(guest system)。Dom 0也被稱爲特權域或特殊客戶(special guest),具備擴展功能。Dom U由Dom 0管理。Dom 0包含系統中全部設備的驅動程序。Dom 0還包含一個控制堆棧來管理虛擬機的建立、銷燬和配置。Dom 0還具備直接訪問硬件的特權;它能夠處理對系統I/O功能的全部訪問,並能夠與其餘虛擬機進行交互。Dom 0設置Dom Us,使用虛擬驅動與硬件設備通訊。Dom 0對外提供控制接口,能夠經過該接口控制整個系統。Dom 0是系統啓動的第一個VM,是Xen hypervisor的必備域。
基於內核的虛擬機(KVM)表明了最新的開源虛擬化技術。這個項目的目標是建立一個現代化的hypervisor,它創建在前幾代技術的經驗之上,並利用當今可用的現代硬件技術(VT-x,AMD-v)。
當您安裝了KVM內核模塊,KVM輕鬆的將Linux內核轉換爲一個hypervisor。儘管如此,因爲hypervisor是一個標準的Linux內核,使得它能夠從標準內核的更新中受益(內存支持,調度等)。對這些Linux組件的優化(如3.1內核中的新調度器)不只讓hypervisor從中受益,也有利於Linux Guest OS。在I/O仿真方面,KVM使用了一個用戶態軟件QEMU;Qemu是一個負責硬件仿真的用戶程序。
它負責模擬處理器和一長串外圍設備:磁盤、網絡、VGA、PCI、USB、串口/並行端口等,從而構建一個完整的虛擬硬件,能夠安裝Guest OS,並經過KVM的支持變得更增強大。
下圖給出了KVM的用戶模式和內核模式組件的高級概述:
在系統管理實用程序(如virsh和virt-manager)的請求下,libvirtd爲每一個虛擬機啓動了一個單獨的qemu-kvm進程。虛擬機的屬性(cpu數量、內存大小、I/O設備配置)是在單獨的XML文件中定義的,這些文件位於/etc/libvirt/qemu目錄中,libvirtd使用這些XML文件的詳細信息來傳遞給qemu-kvm進程的參數列表。舉例:
qemu 14644 9.8 6.8 6138068 1078400 ? Sl 03:14 97:29 /usr/bin/qemu-system-x86_64 -machine accel=kvm -name guest1 -S -machine pc--m 5000 -realtime mlock=off -smp 4,sockets=4,cores=1,threads=1 -uuid 7a615914-ea0d-7dab-e709-0533c00b921f -no-user-config -nodefaults -chardev socket,id=charmonitor-drive file=/dev/vms/hypervisor2,if=none,id=drive-virtio-disk0,format=raw,cache=none,aio=native -device id=net0,mac=52:54:00:5d:be:06
在此處,相似於-m 5000的一個參數爲虛擬機指定了5GB的內存,--smp=4指定了4個vCPU,它的拓撲結構爲四個vSocket,每一個Socket有一個核心。
關於libvirt和qemu是什麼以及它們是如何相互通訊的詳細內容,將在第2章中進行了解釋。
多年來,Linux已經成爲開發雲計算方案的首選。許多成功的公共雲提供商使用Linux虛擬化來爲底層基礎設施提供助力。例如,亞馬遜(Amazon)是最大的IaaS雲提供商,它使用Xen虛擬化來爲其EC2提供動力,一樣KVM爲Digital Ocean的發展提供了助力。Digital Ocean是世界上第三大雲供應商。Linux虛擬化一樣也在私有云領域佔據主導地位。
如下是使用Linux虛擬化構建IaaS軟件的開源雲軟件的列表:
在本章中,您瞭解了Linux虛擬化、它的優勢以及不一樣類型的虛擬化方法。咱們還討論了hypervisor的類型,而後介紹了Xen和KVM的高級架構,以及流行的開源Linux虛擬化技術。
在下一章中,咱們將討論libvirt、qemu和KVM的內部工做機理,並瞭解這些組件如何相互通訊以實現虛擬化。