KVM原理介紹-01

虛擬化介紹

我們都知道,所謂雲,就是不是在本地的,比如我們經常聽的阿里雲,如果你的公司使用阿里雲,給你提供了一臺服務器,到購買的時候你會發現它讓你有很多選擇,選擇CPU的型號,內存大小,硬盤大小,帶寬多少等等等,就先我麼自己組裝一個服務一樣,那麼最後真正給你的這臺服務器真的就是真實存在的麼?好比你選擇了因特爾的I5CPU,是否真的就是給你了那?答案是不是的,那麼,那我們選的CPU啊什麼的,是怎麼來的那,對,就是虛擬化而來的。那麼大家想一想,爲什麼會有虛擬化,我們打個比方,我現在要一臺電腦,要能夠滿足我學習,娛樂的要求,特別是喜歡玩大型遊戲的同學,對顯卡要求極高,那麼又有一部分同學說 了,我要求不高,只要能夠給我提供簡單的上網,能夠進行文檔的操作就可以了,我們買一個電腦都會有各種不同的需求,服務器在面臨的各個行業的公司,更是不一樣,那麼它不會傻到把所有型號的產品都買上,然後供不同需求的人使用,而是直接用我們的虛擬化技術來實現,而真正的提供服務的物理機,顯然不可能是單一的,而是集羣狀態的,並且是分佈式的,那麼虛擬化通過在一個物理平臺上虛擬出更多的虛擬平臺,其中每一個虛擬平臺都可以作爲獨立的終端加入雲端給大家提供服務,筆記其直接使用物理機平臺、虛擬化在資源的有效利用、動態調配和高可靠性方面有巨大的優勢。所以又說會那句話,虛擬化是雲端技術,是雲計算必不可少的基礎。

當然到底什麼是雲計算,太大,太雜,那麼我們首先從最基礎的也是最重要的一個環節入手,那就是虛擬化,說到虛擬化,大家可能首先想到的並不是KVM,而是這幾年炒的很熱的docker,k8s,但殊不知,在docker出名之前,虛擬化產品則是VMware天下,也就是咱們自己所用的虛擬機,雖然說docker是很熱的虛擬化產品,後期會在csdn上介紹,但是目前還有很多公司在某個方面會用到KVM技術,比如果,之前有接觸過docker的同學肯定都知道,docker這種虛擬化技術是基於你真正的dockerhost機器,也就是說,假設在虛擬化方面,如果你對linux內核方面有需求,那麼這種情況下,docker是不能夠使用的,因爲docker容器的內核跟dockerhosts是一樣的,所以,KVM還是有需求的,還是值得我們來學習,研究,並且使用的。

虛擬化發展史

在這裏插入圖片描述

市面上主流服務器虛擬化整體解決方案:

  • 商用方案:
    1、VMware vSphere
    2、Microsoft Hyper-v
  • 開源方案:
    1、KVM(紅帽、ubuntu等)
    2、Xen(思傑、華爲等)
    這裏要明確的是開源軟件不等於免費

其實說了這麼一大堆,最終說道我們的KVM的時候,我們又不得不再去說點別的,而且在說別的一切之前,要說一句話,那就是,在LINUX系統看來,一切皆是資源,包括我們外置的鍵盤、鼠標、硬盤、內存等等,爲什麼會說道這句話那?因爲我們要知道一件事,那就是我們要做虛擬化之前,知否我們要真正知道,它原來的東西是怎麼回事,打一個不太恰當的比方,比如我們的虛擬機就好像是我們要買一個山寨的蘋果X,是吧,我們既然要做是不是的先對他的一個外貌,尺寸等等各方面都要有所瞭解,我們的虛擬化亦是如此,那麼我們就先從來說一聲我們熟悉的linux系統,瞭解一下,linux系統的原理,它和我們的虛擬化的聯繫在哪裏。
Linux系統實現的原理

  • 要知道,我們的linux系統,它的設計是直接運行在裸硬件設備上的,因此它們自己認爲它們完全佔有 計算機硬件。x86 架構提供四個特權級別給操作系統和應用程序來訪問硬件。 Ring 是指 CPU 的運行級別,Ring 0是高級別,Ring1次之,Ring2更次之…… 就 Linux+x86 來 說, 操作系統(內核)需要直接訪問硬件和內存,因此它的代碼需要運行在高運行級別 Ring0上,這樣它可以使用特權指令,控制中斷、修改頁表、訪問設備等等。
  • 應用程序的代碼運行在低運行級別上Ring3上,不能做受控操作。如果要做,比如要 訪問磁盤,寫文件,那就要通過執行系統調用(函數),執行系統調用的時候,CPU的運行 級別會發生從ring3到ring0的切換,並跳轉到系統調用對應的內核代碼位置執行,這樣內核 就爲你完成了設備訪問,完成之後再從ring0返回ring3。這個過程也稱作用戶態和內核態的 切換。
    在這裏插入圖片描述

在這裏插入圖片描述

  • RING設計的初衷是將系統權限與程序分離出來,使之能夠讓OS更好的管理當前系統資源,也使得系統更加穩定。
  • 舉個RING權限的最簡單的例子:一個停止響應的應用程式,它運行在比RING0更低的指令環上,你不必大費周章的想着如何使系統回覆運作,這期間,只需要啓動任務管理器便能輕鬆終止它,因爲它運行在比程式更低的RING0指令環中,擁有更高的權限,可以直接影響到RING0以上運行的程序,當然有利就有弊
  • RING保證了系統穩定運行的同時,也產生了一些十分麻煩的問題。比如一些OS虛擬化技術,在處理RING指令環時便遇到了麻煩,系統是運行在RING0指令環上的,但是虛擬的OS畢竟也是一個系統,也需要與系統相匹配的權限。而RING0不允許出現多個OS同時運行在上面,最早的解決辦法便是使用虛擬機,把OS當成一個程序來運行。
  • 那麼,虛擬化在這裏就遇到了一個難題,因爲宿主操作系統是工作在 ring0 的,客戶 操作系統就不能也在 ring0了,但是它不知道這一點,以前執行什麼指令,現在還是執行什麼指令,但是沒有執行權限是會出錯的。所以這時候虛擬機管理程序(VMM)需要避免這 件事情發生。
  • VMM一般指虛擬機監視程序
    監控系統行爲是虛擬機系統的核心任務監控系統可用於調度任務、負載均衡、向管理員報告軟硬件故障,並廣泛控制系統的使用情況

虛擬化實現的幾種方式

虛擬機如何通過VMM實現 Guest CPU 對硬件的訪問,根據其原理不同有三 種實現技術: 1. 全虛擬化 2. 半虛擬化 3. 硬件輔助的虛擬化

基於二進制翻譯的全虛擬化

在全虛擬化的情況下,VMM工作在Ring 0 ,虛擬機裏的OS(Guest OS)工作在Ring 1 ,應用程序工作在Ring 3。這時候Guest OS是不知道自己工作在虛擬機裏的,VMM可以仿真出一個目標平臺呈現給Guest OS,讓它以爲自己獨佔硬件資源,認爲自己還是工作在Ring 0 ,所以它還是按照Ring 0級別產生指令,可實際上這時候Guest OS已經工作在Ring 1 ,Guest OS產生的每一條指令都會被VMM截取,並翻譯成宿主機平臺的指令,然後交給實際的物理平臺執行,由於每一條指令都需要這麼翻譯一下,所有這種虛擬化性能比較差。
在這裏插入圖片描述
在這裏插入圖片描述
####### 超虛擬化(或者半虛擬化/操作系統輔助虛擬化 Paravirtualization)
半虛擬化的思想就是,修改Guest OS操作系統內核,替換掉不能虛擬化的指令,通過超級調用 (hypercall)直接和底層的虛擬化層hypervisor(虛擬機監視程序)來通訊,hypervisor 同時也提供了超級調用接口來滿足其他關鍵內核操作,比如內存管理、中斷和時間保持。這種做法省去了全虛擬化中的捕獲和模擬,大大提高了效率。所以像XEN這種半虛擬 化技術,客戶機操作系統都是有一個專門的定製內核版本,和x86、mips、arm這些內核版 本等價。這樣以來,就不會有捕獲異常、翻譯、模擬的過程了,性能損耗非常低。這就是 XEN這種半虛擬化架構的優勢。這也是爲什麼XEN只支持虛擬化Linux,無法虛擬化 windows原因,微軟不改代碼。
在這裏插入圖片描述
在這裏插入圖片描述

硬件輔助的全虛擬化

硬件虛擬化技術提供non-root 模式供客戶機運行,在絕大多數情況下,客戶機在此模式下運行與原生系統在非虛擬化環境中運行性能一樣,不需要像全虛擬化那樣每條指令都要先翻譯再執行;VMM運行在root模式,擁有完整的硬件訪問控制權限,在少數必要的時候,某些客戶機指令的運行才需要被VMM截獲並做相應處理。
在硬件虛擬化中,cpu指令環多了一個-1環,把0換給Guest OS的內核,當進行系統調用的時候,Guest OS會調用0環的特權指令0環上的特權指令是假的,被Host的內核捕獲,進而轉換調用-1環的特權指令,這些過程都是有硬件進行的,這種模式和半虛擬化類似
在這裏插入圖片描述
在這裏插入圖片描述

三種虛擬化技術的對比
利用二進制翻譯的全虛擬化 硬件輔助虛擬化 操作系統協助/半虛擬化
實現技術 BT和直接執行 遇到特權指令轉到root模式執行 Hypercall
客戶操作系統 修改/兼容性 無需修改客戶操作系統,最佳兼容性 客戶操作系統需要修改來hypercall,因此它不能運行在物理硬件本身或其他的hypervisor上,兼容性差,不支持windows
性能 全虛擬化下,CPU需要在兩種模式之間切換,帶來性能開銷;但是,其性能在逐漸逼近半虛擬化 好,半虛擬化下cpu性能開銷幾乎爲0,虛擬機的性能接近於物理機
應用廠商 VMware Workstations /QEMU/Virtual PC VMware ESXi/Miscrosoft Hyper-V/Xen3.0 KVM Xen

KVM介紹

KVM虛擬機技術(Kernel-based Virtual Machine),全稱是基於內核的虛擬機。那是linux內核原生支持的,起初並不是這樣,最初它是一家以色列的公司開發出來,然後在2006將其開源並推向linux內核社區,到10月份,linux社區接受,並在2007年正式發佈第一個帶有KVM模塊的內核,是後來的redhat,紅帽將那家公司收購,並加大對KVM的研發力度,直到我們熟悉的redhat6中真正成爲操作系統默認的虛擬化方案。

  • 它由 Quramnet 開發,該公司於 2008年被 Red Hat 收購。
  • 它支持 x86 (32 and 64 位), s390, Powerpc 等 CPU。
    S390:處理器是由美國IBM 開發的面向大型機應用的處理器 。
    Powerpc:應用在網絡設備、視頻系統、工業系統等領域。
  • 它從 Linux 2.6.20 起就作爲一模塊被包含在 Linux 內核中。
  • 它需要支持虛擬化擴展的 CPU。
  • 它是完全開源的。kvm官網

KVM架構

  • KVM 是基於虛擬化擴展(Intel VT 或者 AMD-V)的 X86 硬件的開源的 Linux 原生的全虛擬化解決方案。KVM 中,虛擬機被實現爲常規的 Linux 進程,由標準 Linux 調度程序進行調度;虛機的每個虛擬 CPU 被實現爲一個常規的 Linux 進程。這使得 KMV 能夠使用 Linux 內核的已有功能。
    但是,KVM 本身不執行任何硬件模擬,需要客戶空間程序通過 /dev/kvm 接口設置一個客戶機虛擬服務器的地址空間,向它提供模擬的 I/O,並將它的視頻顯示映射回宿主的顯示屏。目前這個應用程序是 QEMU。
    在這裏插入圖片描述
  • Guest:客戶機系統,包括CPU(vCPU)、內存、驅動(Console、網卡、I/O 設備驅動等),被 KVM 置於一種受限制的 CPU 模式下運行。
  • KVM:運行在內核空間,提供CPU 和內存的虛級化,以及客戶機的 I/O 攔截。Guest 的 I/O 被 KVM 攔截後,交給 QEMU 處理。
  • QEMU:修改過的爲 KVM 虛機使用的 QEMU 代碼,運行在用戶空間,提供硬件 I/O 虛擬化,通過 IOCTL /dev/kvm 設備和 KVM 交互。

KVM 實現攔截虛機的 I/O 請求的原理:

  • 現代CPU本身實現了對特殊指令的截獲和重定向的支持。
    以x86平臺爲例,支持虛擬化技術的CPU帶有特別優化過的指令集來控制虛擬化過程。通過這些指令集,VMM將客戶機置於一種受限制的模式下運行,一旦客戶機視圖訪問物理資源,硬件會暫停客戶機的運行,將控制權交回給 VMM 處理。
  • 簡單理解爲:當虛擬機需要操作的指令爲底層硬件不能虛擬化的指令是,取消虛擬機暫時運行的權限,交給VMM去進行控制
  • VMM 還可以利用硬件的虛級化增強機制,將客戶機在受限模式下對一些特定資源的訪問,完全由硬件重定向到 VMM 指定的虛擬資源,整個過程不需要暫停客戶機的運行和 VMM 的參與。由於虛擬化硬件提供全新的架構,支持操作系統直接在上面運行,無需進行二進制轉換,減少了相關的性能開銷,極大簡化了VMM的設計,使得VMM性能更加強大。

QEMU-KVM組件

  • 其實QEMU原本不是KVM的一部分,它自己就是一個純軟件實現的虛擬化系統,所以其性能低下。但是,QEMU代碼中包含整套的虛擬機實現,包括處理器虛擬化,內存虛擬化,以及 KVM需要使用到的虛擬設備模擬(網卡、顯卡、存儲控制器和硬盤等)。
  • 爲了簡化代碼,KVM 在 QEMU 的基礎上做了修改。VM 運行期間,QEMU 會通過 KVM 模塊提供的系統調用進入內核,由 KVM 負責將虛擬機置於處理的特殊模式運行。
  • 遇到虛機進行I/O 操作,KVM 會從上次的系統調用出口處返回 QEMU,由QEMU來負責解析和模擬這些設備。從QEMU的角度看,也可以說是QEMU使用了KVM模塊的虛擬化功能,爲自己的虛機提供了硬件虛擬化加速。除此以外,虛機的配置和創建、虛機運行所依賴的虛擬設備、虛機運行時的用戶環境和交互,以及一些虛機的特定技術比如動態遷移,都是QEMU自己實現的。KVMKVM內核模塊在運行時按需加載進入內核空間運行。
  • KVM本身不執行任何設備模擬,需要QEMU通過 /dev/kvm 接口設置一個GUEST OS的地址空間,向它提供模擬的 I/O設備,並將它的視頻顯示映射回宿主機的顯示屏。它是KVM虛機的核心部分,其主要功能是初始化CPU硬件,打開虛擬化模式,然後將虛擬客戶機運行在虛擬機模式下,並對虛機的運行提供一定的支持。

KVM虛機的創建過程

在這裏插入圖片描述

  • 以在Intel上運行爲例,KVM模塊被加載的時候,它做的事情如下:
    首先初始化內部的數據結構;

    做好準備後,KVM 模塊檢測當前的 CPU,然後打開CPU控制及存取CR4的虛擬化開關,並通過執行VMXON指令(開啓cpu虛擬化後需要執行操作指令)將宿主操作系統置於虛擬化模式的根模式;

    最後,KVM模塊創建特殊設備文件/dev/kvm並等待來自用戶空間的指令

    接下來的虛機的創建和運行將是QEMU和KVM相互配合的過程。兩者的通信接口主要是一系列針對特殊設備文件/dev/kvm的IOCTL調用。其中最重要的是創建虛機。它可以理解成KVM 爲了某個特定的虛機創建對應的內核數據結構,同時,KVM 返回一個文件句柄來代表所創建的虛機。

    在計算機中,ioctl(input/output control)是一個專用於設備輸入輸出操作的系統調用,該調用傳入一個跟設備有關的請求碼,系統調用的功能完全取決於請求碼。例如:CD-ROM驅動程序可以彈出光驅,它就提供了一個對應的Ioctl請求碼

    針對該句柄的調用可以對虛機做相應地管理,比如創建用戶空間虛擬地址和客戶機物理地址、真實物理地址之間的映射關係,再比如創建多個vCPU。KVM爲每一個vCPU生成對應的文件句柄,對其相應地IOCTL 調用,就可以對vCPU進行管理。其中最重要的就是“執行虛擬處理器”。通過它,虛機在KVM的支持下,被置於虛擬化模式的非根模式下,開始執行二進制指令。在非根模式下,所有敏感的二進制指令都被CPU捕捉到,CPU在保存現場之後自動切換到根模式,由KVM決定如何處理

    除了CPU的虛擬化,內存虛擬化也由KVM實現。實際上,內存虛擬化往往是一個虛機實現中最複雜的部分。CPU 中的內存管理單元MMU是通過頁表的形式將程序運行的虛擬地址轉換成實際物理地址。在虛擬機模式下,MMU的頁表則必須在一次查詢的時候完成兩次地址轉換。因爲除了將客戶機程序的虛擬地址轉換了客戶機的物理地址外,還要將客戶機物理地址轉化成真實物理地址

VMM 內存虛擬化的實現方式:

  • 軟件方式:通過軟件實現內存地址的翻譯,比如 Shadow page table (影子頁表)技術
    • 硬件實現:基於CPU的輔助虛擬化功能,比如AMD的NPT和Intel的EPT技術KVM 中,虛擬機的物理內存即爲qemu-kvm進程所佔用的內存空間。
  • KVM使用CPU輔助的內存虛擬化方式。在Intel和AMD平臺,其內存虛擬化的實現方式分別爲:AMD 平臺上的 NPT (Nested Page Tables) 技術,Intel 平臺上的 EPT (Extended Page Tables)

KVM的功能列表

KVM 所支持的功能包括:

  • 支持CPU 和 memory 超分(Overcommit)
  • 支持半虛擬化I/O (virtio)
  • 支持熱插拔 (cpu,塊設備、網絡設備等)
  • 支持對稱多處理(Symmetric Multi-Processing,縮寫爲 SMP )
  • 支持實時遷移(Live Migration)
  • 支持 PCI 設備直接分配和 單根I/O 虛擬化 (SR-IOV)
  • 支持 內核同頁合併 (KSM )
  • 支持 NUMA (Non-Uniform Memory Access,非一致存儲訪問結構 )

KVM 工具集合

  • libvirt:操作和管理KVM虛機的虛擬化 API,使用 C 語言編寫,可以由 Python,Ruby, Perl, PHP, Java 等語言調用。可以操作包括 KVM,vmware,XEN,Hyper-v, LXC 等 Hypervisor。
  • Virsh:基於 libvirt 的 命令行工具 (CLI)
  • Virt-Manager:基於 libvirt 的 GUI 工具
  • virt-v2v:虛機格式遷移工具
  • virt-* 工具:包括 Virt-install (創建KVM虛機的命令行工具), Virt-viewer - - (連接到虛機屏幕的工具),Virt-clone(虛機克隆工具),virt-top 等
  • sVirt:安全工具和selinux相關
    在這裏插入圖片描述

KVM虛機創建過程

在這裏插入圖片描述
KVM的整體結構:
從GUI到Linux內核,包括以下五個組件:

  1. virt-manager
    一個用來管理VM的GUI/CUI用戶接口;它使用libvirt調用VM的各種功能。
  2. libvirt
    一個工具及接口,作爲較通用的服務器虛擬化軟件,它支持Xen,VMware ESX/GSX,當然,還有QEMU/KVM。
  3. QEMU
    一個和KVM內核模塊交互的模擬器,處理多種客戶機系統請求如I/O;一個QEMU進程對應一個客戶機系統。
  4. KVM內核模塊
    從狹義上來說,KVM是一個Linux內核模塊,處理客戶機系統的VM Exits和執行VM Entry指令。
  5. Linux內核
    既然QEMU作爲一個普通的用戶進程運行,相應客戶機系統的調度就由Linux內核自己來處理。所有的組件都是開放源碼軟件(OSS)。
發佈了16 篇原創文章 · 獲贊 6 · 訪問量 2861
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章