KVM的認識

KVM 全稱是 基於內核的虛擬機(Kernel-based Virtual Machine),它是一個 Linux 的一個內核模塊,該內核模塊使得 Linux 變成了一個 Hypervisor(管理程序)。編程

KVM 自己不執行任何硬件模擬,須要客戶空間程序經過 /dev/kvm 接口設置一個客戶機虛擬服務器的地址空間,向它提供模擬的 I/O,並將它的視頻顯示映射回宿主的顯示屏。目前這個應用程序是 QEMU。windows

Guest:客戶機系統,包括CPU(vCPU)、內存、驅動(Console、網卡、I/O 設備驅動等),被 KVM 置於一種受限制的 CPU 模式下運行。api

KVM:運行在內核空間,提供CPU 和內存的虛級化,以及客戶機的 I/O 攔截。Guest 的 I/O 被 KVM 攔截後,交給 QEMU 處理。安全

QEMU:修改過的爲KVM虛機使用的QEMU代碼,運行在用戶空間,提供硬件 I/O 虛擬化,經過 IOCTL /dev/kvm 設備和 KVM 交互。服務器

KVM 內核模塊在運行時按需加載進入內核空間運行。KVM 自己不執行任何設備模擬,須要 QEMU 經過 /dev/kvm 接口設置一個 GUEST OS 的地址空間,向它提供模擬的 I/O 設備,並將它的視頻顯示映射回宿主機的顯示屏。它是KVM 虛機的核心部分,其主要功能是初始化 CPU 硬件,打開虛擬化模式,而後將虛擬客戶機運行在虛擬機模式下,並對虛機的運行提供必定的支持。以在 Intel 上運行爲例,網絡

KVM 模塊被加載的過程:數據結構

  • 首先初始化內部的數據結構;
  • 作好準備後,KVM 模塊檢測當前的 CPU,而後打開 CPU 控制及存取 CR4 的虛擬化模式開關,並經過執行 VMXON 指令將宿主操做系統置於虛擬化模式的根模式;
  • 最後,KVM 模塊建立特殊設備文件 /dev/kvm 並等待來自用戶空間的指令。

KVM 運行期間,QEMU 會經過 KVM 模塊提供的系統調用進入內核,由 KVM 負責將虛擬機置於處理的特殊模式運行。遇到虛機進行 I/O 操做,KVM 會從上次的系統調用出口處返回 QEMU,由 QEMU 來負責解析和模擬這些設備。從 QEMU 的角度看,也能夠說是 QEMU 使用了 KVM 模塊的虛擬化功能,爲本身的虛機提供了硬件虛擬化加速。除此之外,虛機的配置和建立、虛機運行說依賴的虛擬設備、虛機運行時的用戶環境和交互,以及一些虛機的特定技術好比動態遷移,都是 QEMU 本身實現的。 架構

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:安全工具'

爲何須要 CPU 虛擬化

  • X86 操做系統是設計在直接運行在裸硬件設備上的,所以它們自動認爲它們徹底佔有計算機硬件。x86 架構提供四個特權級別給操做系統和應用程序來訪問硬件。 Ring 是指CPU的運行級別,Ring0是最高級別,Ring1次之,Ring2更次之…… 就 Linux+x86 來講,操做系統(內核)須要直接訪問硬件和內存,所以它的代碼須要運行在最高運行級別 Ring0上,這樣它可使用特權指令,控制中斷、修改頁表、訪問設備等等。
  • 應用程序的代碼運行在最低運行級別上ring3上,不能作受控操做。若是要作,好比要訪問磁盤,寫文件,那就要經過執行系統調用(函數),執行系統調用的時候,CPU的運行級別會發生從ring3到ring0的切換,並跳轉到系統調用對應的內核代碼位置執行,這樣內核就爲你完成了設備訪問,完成以後再從ring0返回ring3。這個過程也稱做用戶態和內核態的切換。
  • 那麼,虛擬化在這裏就遇到了一個難題,由於宿主操做系統是工做在 ring0 的,客戶操做系統就不能也在 ring0 了,可是它不知道這一點,之前執行什麼指令,如今仍是執行什麼指令,可是沒有執行權限是會出錯的。因此這時候虛擬機管理程序(VMM)須要避免這件事情發生。

虛機怎麼經過 VMM 實現 Guest CPU 對硬件的訪問,根據其原理不一樣有三種實現技術:
1. 全虛擬化
基於二進制翻譯的全虛擬化(Full Virtualization with Binary Translation
客戶操做系統運行在 Ring 1,它在執行特權指令時,會觸發異常(CPU的機制,沒權限的指令會觸發異常),而後 VMM 捕獲這個異常,在異常裏面作翻譯,模擬,最後返回到客戶操做系統內,客戶操做系統認爲本身的特權指令工做正常,繼續運行。可是這個性能損耗,就很是的大,簡單的一條指令,執行完,了事,如今卻要經過複雜的異常處理過程。

2. 半虛擬化
超虛擬化(或者半虛擬化/操做系統輔助虛擬化 Paravirtualization

半虛擬化的思想就是,修改操做系統內核,替換掉不能虛擬化的指令,經過超級調用(hypercall)直接和底層的虛擬化層hypervisor來通信,hypervisor 同時也提供了超級調用接口來知足其餘關鍵內核操做,好比內存管理、中斷和時間保持。

這種作法省去了全虛擬化中的捕獲和模擬,大大提升了效率。因此像XEN這種半虛擬化技術,客戶機操做系統都是有一個專門的定製內核版本,和x8六、mips、arm這些內核版本等價。這樣以來,就不會有捕獲異常、翻譯、模擬的過程了,性能損耗很是低。這就是XEN這種半虛擬化架構的優點。這也是爲何XEN只支持虛擬化Linux,沒法虛擬化windows緣由,微軟不改代碼啊。

3. 硬件輔助的虛擬化
硬件輔助的全虛擬化
2005年後,CPU廠商Intel 和 AMD 開始支持虛擬化了。 Intel 引入了 Intel-VT (Virtualization Technology)技術。 這種 CPU,有 VMX root operation 和 VMX non-root operation兩種模式,兩種模式都支持Ring 0 ~ Ring 3 共 4 個運行級別。這樣,VMM 能夠運行在 VMX root operation模式下,客戶 OS 運行在VMX non-root operation模式下。

客戶機系統的代碼是如何運行的:

  • 一個普通的 Linux 內核有兩種執行模式:內核模式(Kenerl)和用戶模式 (User)。爲了支持帶有虛擬化功能的 CPU,KVM 向 Linux 內核增長了第三種模式即客戶機模式(Guest),該模式對應於 CPU 的 VMX non-root mode。
  • KVM 內核模塊做爲 User mode 和 Guest mode 之間的橋樑
  • User mode 中的 QEMU-KVM 會經過 ICOTL 命令來運行虛擬機
  • KVM 內核模塊收到該請求後,它先作一些準備工做,好比將 VCPU 上下文加載到 VMCS (virtual machine control structure)等,而後驅動 CPU 進入 VMX non-root 模式,開始執行客戶機代碼

三種模式的分工爲:

  • Guest 模式:執行客戶機系統非 I/O 代碼,並在須要的時候驅動 CPU 退出該模式
  • Kernel 模式:負責將 CPU 切換到 Guest mode 執行 Guest OS 代碼,並在 CPU 退出 Guest mode 時回到 Kenerl 模式
  • User 模式:表明客戶機系統執行 I/O 操做

Libvirt 是什麼

爲何須要Libvirt?

  • Hypervisor 好比 qemu-kvm 的命令行虛擬機管理工具參數衆多,難於使用。
  • Hypervisor 種類衆多,沒有統一的編程接口來管理它們,這對雲環境來講很是重要。
  • 沒有統一的方式來方便地定義虛擬機相關的各類可管理對象。

Libvirt提供了什麼?

  • 它提供統1、穩定、開放的源代碼的應用程序接口(API)、守護進程 (libvirtd)和和一個默認命令行管理工具(virsh)。
  • 它提供了對虛擬化客戶機和它的虛擬化設備、網絡和存儲的管理。
  • 它提供了一套較爲穩定的C語言應用程序接口。目前,在其餘一些流行的編程語言中也提供了對libvirt的綁定,在Python、Perl、Java、Ruby、PHP、OCaml等高級編程語言中已經有libvirt的程序庫能夠直接使用。
  • 它對多種不一樣的 Hypervisor 的支持是經過一種基於驅動程序的架構來實現的。libvirt 對不一樣的 Hypervisor 提供了不一樣的驅動,包括 Xen 的驅動,對QEMU/KVM 有 QEMU 驅動,VMware 驅動等。在 libvirt 源代碼中,能夠很容易找到 qemu_driver.c、xen_driver.c、xenapi_driver.c、vmware_driver.c、vbox_driver.c 這樣的驅動程序源代碼文件。
  • 它做爲中間適配層,讓底層 Hypervisor 對上層用戶空間的管理工具是能夠作到徹底透明的,由於 libvirt 屏蔽了底層各類 Hypervisor 的細節,爲上層管理工具提供了一個統一的、較穩定的接口(API)。
  • 它使用 XML 來定義各類虛擬機相關的受管理對象。

目前,libvirt 已經成爲使用最爲普遍的對各類虛擬機進行管理的工具和應用程序接口(API),並且一些經常使用的虛擬機管理工具(如virsh、virt-install、virt-manager等)和雲計算框架平臺(如OpenStack、OpenNebula、Eucalyptus等)都在底層使用libvirt的應用程序接口。

VMWARE esx:是用來在服務器上搭建虛擬機,本身自己就是一臺操做系統,能夠直接在物理機上安裝,以後訪問WEB頁面進行虛擬機的安裝。

kvm 通常是在 redhatLinux 中部署,若是沒有內核模塊要安裝內核模塊,以後安裝 QEMU, 而後安裝 libvirt 進行配置安裝虛擬機。

相關文章
相關標籤/搜索