kvm虛擬化原理

名詞描述

如果把操作系統共及其提供的系統調用作爲資源,那麼虛擬化就表現爲操作系統虛擬化。linux容器虛擬化就是一個操作系統上,虛擬化出了多個同樣的操作系統。
如果把物理平臺,包括CPU,內存,外設作爲資源,那麼對應的虛擬化技術就是平臺虛擬化。

VMM(virtual machine monitor) 虛擬機監視器,也叫hypervisor。虛擬機監視器運行的環境叫做host,而虛擬出來的虛擬機成爲guest

虛擬化重要一步,就是截取計算元件對物理資源的訪問,並重定向到虛擬化資源池中。如果是使用純軟件的方式實現這種截取,那麼就稱爲軟件虛擬化,如果是通過硬件方式實現,那麼就稱爲硬件虛擬化。

我的理解

qemu+kqemu就是純軟件的虛擬化,

而qemu+kvm是利用的硬件虛擬化的技術。

利用硬件虛擬化的好處,無需進行二進制轉換,減少性能開銷,極大簡化了VMM的設計,性能更強大。

完整的情況下需要CPU、主板芯片組、BIOS和軟件的支持。即使在只有CPU支持的情況下,性能也會比不支持情況好。

intel virtualizaton Technology(IntelVT)

半虛擬化,爲了解決純軟件虛擬化下,性能的問題,改動guest操作系統,使他可以自己運行在虛擬環境下。本質上,弱化了對虛擬機特殊指令的被動截取要求,將其轉化爲guest操作系統的主動通知。Xen是代表

全虛擬化,不需要對guest操作系統進行任何改動,理論上支持任何可在真是物理平臺上運行的操作系統。隨着硬件虛擬化的出現,全虛擬化的性能已經超過了半虛擬化。

linux kernel通過加載kvm模塊變身成一個hypervisor

KVM是基於虛擬化擴展(intel VT或AMD-V)的X86硬件。是linux完全原生的全虛擬化解決方案。
部分的半虛擬化支持,注意是通過半虛擬網絡驅動程序的形式用於linux和windowsguest系統。
每個虛擬CPU顯示爲一個常規的linux進程。
KVM本身不執行任何模擬,需要用戶空間程序通過/dev/kvm藉口設置一個guest虛擬服務器的地址空間,向他提供模擬的IO,並將它的視頻顯示映射回數組的顯示屏,目前這個應用程序就是QEMU。

KVM原理

架構

在這裏插入圖片描述

內存管理

一個虛擬機的內存與任何其他linux進程的內存一樣進行存儲,可以以大頁面的形式進行交換以實現更高的性能,也可以以磁盤文件的形式共享。NUMA(非一致性內存訪問,針對多處理器的內存設計)支持允許虛擬機有效的訪問大量內存。

KVM支持最新的基於硬件的內存虛擬化功能,支持Intel的擴展頁表(EPT)和AMD的嵌套頁表(NPT,也交快速虛擬化索引-RVI),以實現更低的CPU利用率和更高的吞吐量。

內存頁面共享通過一種名爲內核同頁合併(kernel same-page merging,KSM)的內核功能來支持,KSM掃描每個虛擬機的內存如果虛擬擁有相同的內存頁面,KSM將這些頁面合併到一個虛擬機之間共享的頁面,修改時在獲得專享副本

存儲

KVM能夠使用linux支持的任何存儲來存儲虛擬機鏡像。KVM原聲磁盤格式爲QCOW2,支持快照,允許多級快照,壓縮和加密。

設備驅動程序

KVM支持混合虛擬化,其中準虛擬化的驅動程序安裝在guest os中,允許虛擬機使用優化的IO藉口而不實用模擬的設備,從而爲網絡和快設備提供高性能的IO。這個準虛擬化驅動程序使用IBM和ReadHat聯合linux社區開發的VirtIO標準。它是一個與虛擬機管理程序獨立的、構建設備驅動程序的藉口,允許爲多個虛擬機管理程序使用一組相同的設備驅動程序。(virtIO是安裝在guest os中的模塊)

性能和可伸縮性

KVM虛擬化性能在很多方面(計算能力和原生帶寬)可以達到非虛擬化原生環境的95%以上。RHEL6.x系統一個KVM客戶機可以支持160個虛擬CPU和多大2T內存,一個宿主機支持4096個CPU核心和多達64T內存

原理

虛擬化模型

VMM或Hypervisor的主要職能:管理真是的物理硬件平臺,併爲每個虛擬guest提供對應虛擬硬件平臺。
guest任然可以作爲自己的VMM,稱爲嵌套虛擬化。KVM支持嵌套虛擬化。
在這裏插入圖片描述

KVM架構

兩種架構,類型一,系統上電之後首先加載運行虛擬機監控程序,傳統的操作系統運行在其創建的虛擬機中,可以視爲一個特別爲虛擬化而剪裁過的操作系統內核。一般會提供一個具有一定特權的特殊虛擬機。由這個特權虛擬機提供用戶日常操作和管理使用的操作系統環境。代表Xen,VMware ESX/ESXi和微軟Hyper-V。類型二,上電後仍然運行一般意義上的操作系統,VMM作爲特殊的應用程序,視爲操作系統功能的擴展。其最大優勢在於可以充分利用現有操作系統,不必實現物理資源管理和調度算法。但是會收到訴諸操作系統的一些限制。無法僅僅爲了虛擬機優化,而對操作系統做出修改。

在這裏插入圖片描述

qemu通過/dev/kvm藉口設置一個虛擬客戶機的地址空間,向他提供墨跡IO設備,並將顯示映射回宿主機顯示屏。

KVM模塊

主要功能,初始化CPU硬件,打開虛擬化模式,然後將虛擬客戶機運行在虛擬機模式下,並對虛擬客戶機的運行提供一定的支持。
爲了軟件簡潔,KVM僅支持硬件虛擬化。

KVM先初始化內部數據結構
KVM打開CPU控制寄存器CR4中的虛擬化模式開關,通過執行VMXON指令將host操作系統置於虛擬化模式中的根模式
KVM模塊創建/dev/kvm並等待用戶空間命令。
KVM和qemu通過對/dev/kvm的ioctl系統調用來通信。
針對虛擬處理器的最重要的IOCTL調用就是執行“虛擬處理器”。通過它,用戶空間準備好的虛擬機在KVM模塊支持下,被置於虛擬化模式中的非根模式下,並開始執行二進制指令。在非根模式下,所有敏感的二進制指令都會被處理器捕獲到,處理器在保存現場之後自動切換到根模式,由KVM決定如何進一步處理(要麼由KVM模塊直接處理,要麼反悔用戶空間交由用戶空間程序處理)。
內存虛擬化,在硬件支持二維地址翻譯之前是最複雜的部分。在虛擬機模式下,內存管理單元的頁表必須在一次查詢的時候完成兩次地址轉換。除了要將客戶機虛擬地址轉換爲客戶機物理地址,還需要再轉爲host的物理地址。使用影子頁表機制。通過硬件支持,二維分頁機制。
處理器對設備的訪問主要通過IO指令和MMIO,其中IO指令會被處理器直接接貨,MMIO會通過配置內存虛擬化來捕獲。對性能要求較高的虛擬設備纔會由KVM內核模塊直接負責,比如虛擬終端控制器和虛擬始終,這樣可以大量減少處理器的模式切換開銷。

Qemu設備模型

大部分輸入輸出都交給qemu來負責

qemu虛擬機是一個純軟件的實現,性能底下。qemu的代碼中有整套的虛擬機實現,包括處理器虛擬化,內存虛擬化,以及KVM使用到的虛擬設備模擬(網卡,下卡,存儲控制器和硬盤等)。

KVM在qemu基礎上進行了修改,虛擬機運行期間,qemu會通過KVM模塊提供的系統調用進入內核,由KVM模塊負責將虛擬機置於處理器的特殊模式運行。遇到虛擬機進行輸入輸出操作,kvm從上次的系統調用出口處反悔qemu,由qemu來負責解析和模擬這些設備(是不是可以理解爲,從創建虛擬機後,就交由kvm負責,運行在特殊模式,直到發生了IO操作,切換到用戶態,交由qemu負責)。
從qemu角度來看,使用了KVM模塊的虛擬化功能,爲自己的虛擬機提供硬件虛擬化的枷鎖,極大的提升了虛擬機性能。除此之外,虛擬機的配置和創建,虛擬機運行以來的虛擬設備,虛擬機運行時用戶操作環境和交互,以及一些針對虛擬機的特殊技術(諸如動態歉意),都是由qemu自己實現的。

kvm和qemu都可以選擇其他虛擬機或技術來枷鎖,比如qemu可以選擇xen或者kqemu,而kvm也可以選擇其他應用程序,只要它按照kvm提供的API來設計。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章