1. 程式人生 > >openstack項目【day23】:KVM介紹

openstack項目【day23】:KVM介紹

進制 sed 與他 運行 之前 entos strong img 類型

閱讀目錄

  1. 什麽是kvm
  2. 為何要用kvm
  3. kvm的功能
  4. 常見虛擬化模式
  5. KVM架構
  6. KVM工具集合

一 什麽是kvm

KVM 全稱 Kernel-Based Virtual Machine。也就是說 KVM 是基於 Linux 內核實現的,這就使得linux內核本身就相當於一個Hypervisor。

Hypervisor即vmm,主要功能就是用來控制生成vm,並管理多個vm的運行,不同的vm中可以安裝不同的操作系統,這些操作系統共用一臺硬件主機,

因為直接使用linux內核的調度器進行管理,所以比xen的代碼少很多

二 為何要用kvm

虛擬化是雲計算的基礎之一,而無論是在部署,還是在研發、測試方面,kvm都是排在第一位的Hypervisor(即vmm)。

kvm以高性能,可擴展性、高安全性,以及低成本而深受用戶喜愛,這一切也與他基於linux內核實現有關。

三 kvm的功能

kvm用一個個進程來運行虛擬機。

最主要的功能:

  1. 基於kvm,可以執行熱遷移,將一個運行的虛擬機從一個運行vm從一臺物理機移動到另外一臺物理主機,而vm裏的運行不受影響(幾臺部署kvm虛擬化的物理機共享一個存儲,存儲內存放虛擬機的xml文件,這樣在另外一臺主機啟一個虛擬機的進程是很快的,然後關聯上待遷移主機的xml文件,就實現了熱遷移);
  2. 可以保存當前虛擬機的運行狀態到硬盤,然後可以重新啟動虛擬機,這是虛擬機的運行狀態和之前一樣。

其余功能:

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

四 常見虛擬化模式

按照Hypervisor的實現方式和位置不同,常見的形式分兩種

1. 全虛擬化

物理機上首先安裝常規的操作系統( Redhat、Ubuntu 和 Centos等),然後在操作系統上安裝kvm,kvm即Hypervisor,它會 作為 OS 上的一個程序模塊運行,並對管理虛擬機進行管理。除此之外:VirtualBox 和 VMWare Workstation 都屬於這個類型。

技術分享

2. 半虛擬化

Hypervisor 直接安裝在物理機上,多個虛擬機在 Hypervisor 上運行。Hypervisor 實現方式一般是一個特殊定制的 Linux 系統。Xen 和 VMWare 的 ESXi 都屬於這個類型。

技術分享

五 KVM架構

openstack可以兼容很多虛擬化解決方案,其中最主要的就是針對x86平臺的kvm。

KVM 全稱 Kernel-Based Virtual Machine。也就是說 KVM 是基於 Linux 內核實現的,這就使得linux內核本身就相當於一個Hypervisor。

具體的:

基於kvm創建的vm就是一個普通的linux進程,由linux內核調度程序進行調度,vm因此可以使用linux內核已有的功能。vm的執行本質就是vm中cpu的執行,因此vm的每個cpu就是普通的linux進程。

KVM有一個內核模塊叫 kvm.ko,只提供 CPU 和內存的虛擬化,而針對於IO及其他硬件設備(網絡及存儲等)的虛擬化,則是交給qemu實現,qemu運行在用戶態通過/dev/kvm接口設置一個客戶機虛擬機服務器的地址空間,向kvm提供模擬的I/O,並且將它的視頻顯示映射回宿主的顯示屏。

技術分享

其實qemu本身就是一種虛擬化技術,它與kvm的區別如下

技術分享

1. 上圖的左側:完全基於Qemu純軟件(不包含操作系統內核)實現的虛擬化。kqemu是通過kqemu模塊實現內核態的加速,在用戶態的qemu通過訪問/dev/kqemu設備文件接口調用改進加速。不過,此類模式主要針對Guest os與Host os屬於統一cpu架構(比如都是x86的架構)。一個明顯的缺點是性能低下。

2. 上圖的右側:qemu+kvm實現的虛擬化(即qemu-kvm)。具體的,KVM並不能算是一個完整的虛擬化解決方案,kvm只是Linux標準內核加載了一個據說有幾萬行代碼的模塊kvm.ko。也就是說KVM僅可以在VT技術的基礎上,提供虛擬的處理器和虛擬內存,至於IO硬件的模仿都交給qemu去做。
創建虛擬機流程

技術分享

    1. 標準的Linux內核中加入KVM的模塊kvm.ko變身成為一個VMM(VMM Virtual MachineMonitor)
    2. 在原有的用戶模式(工作在ring3)和內核模式(工作在ring0)兩種模式的基礎上增加了新的客戶模式。客戶模式存在的特權級別與ring0-3正交。(也就是說客戶模式也存在4個特權級別)
    3. 用戶創建虛擬機,通過調用用戶模式的qemu程序,qemu與kvm提供的libkvm庫為接口,傳遞創建指令。
    4. 打開/dev/kvm文件並獲得文件描述符fd後,通過ioctl指令寫入KVM_CREATE_KVM,即可創建一個虛擬機,並返回一個fd_vm的虛擬機文件描述符。
    5. 獲得fd_vm後,通過ioctl調用KVM_CREATE_VCPU指令,可以對fd_vm所對應的虛擬機創建vCPU,並對vCPU做初始化操作。
    6. 然後通過KVM_RUN指令對fd_vcpus操作,啟動運行虛擬機。

總結:

  1. Guest OS(此處vm1的linux os):客戶機系統,包括CPU(vCPU)、內存、驅動(Console、網卡、I/O 設備驅動等),被 KVM 置於一種受限制的 CPU 模式下運行。
  2. KVM:運行在內核空間,提供CPU 和內存的虛級化,以及客戶機的 I/O 攔截。Guest 的 I/O 被 KVM 攔截後,交給 QEMU 處理。
  3. QEMU:修改過的為 KVM 虛機使用的 QEMU 代碼,運行在用戶空間,提供硬件 I/O 虛擬化,通過 IOCTL /dev/kvm 設備和 KVM 交互。

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

現代 CPU 本身實現了對特殊指令的‘截獲’和‘重定向’的硬件支持,甚至新的硬件會提供額外的資源來幫助軟件實現對關鍵硬件資源的虛擬化從而提高性能。以 X86 平臺為例,支持虛擬化技術的 CPU 帶有特別優化過的指令集來控制虛擬化過程。通過這些指令集,VMM 很容易將客戶機置於一種受限制的模式下運行,一旦客戶機視圖訪問物理資源,硬件會暫停客戶機的運行,將控制權交回給 VMM 處理。VMM 還可以利用硬件的虛級化增強機制,將客戶機在受限模式下對一些特定資源的訪問,完全由硬件重定向到 VMM 指定的虛擬資源,整個過程不需要暫停客戶機的運行和 VMM 的參與。由於虛擬化硬件提供全新的架構,支持操作系統直接在上面運行,無需進行二進制轉換,減少了相關的性能開銷,極大簡化了VMM的設計,使得VMM性能更加強大。從 2005 年開始,Intel 在其處理器產品線中推廣 Intel Virtualization Technology 即 IntelVT 技術。

QEMU-KVM:

其實 QEMU 原本不是 KVM 的一部分,它自己就是一個純軟件實現的虛擬化系統,所以其性能低下。但是,QEMU 代碼中包含整套的虛擬機實現,包括處理器虛擬化,內存虛擬化,以及 KVM需要使用到的虛擬設備模擬(網卡、顯卡、存儲控制器和硬盤等)。

為了簡化代碼,KVM 在 QEMU 的基礎上做了修改。VM 運行期間,QEMU 會通過 KVM 模塊提供的系統調用進入內核,由 KVM 負責將虛擬機置於處理的特殊模式運行。遇到虛機進行 I/O 操作,KVM 會從上次的系統調用出口處返回 QEMU,由 QEMU 來負責解析和模擬這些設備。

從 QEMU 的角度看,也可以說是 QEMU 使用了 KVM 模塊的虛擬化功能,為自己的虛機提供了硬件虛擬化加速。除此以外,虛機的配置和創建、虛機運行說依賴的虛擬設備、虛機運行時的用戶環境和交互,以及一些虛機的特定技術比如動態遷移,都是 QEMU 自己實現的。

KVM:

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

  1. 首先初始化內部的數據結構;
  2. 做好準備後,KVM 模塊檢測當前的 CPU,然後打開 CPU 控制及存取 CR4 的虛擬化模式開關,並通過執行 VMXON 指令將宿主操作系統置於虛擬化模式的根模式;
  3. 最後,KVM 模塊創建特殊設備文件 /dev/kvm 並等待來自用戶空間的指令。
接下來的虛機的創建和運行將是 QEMU 和 KVM 相互配合的過程。兩者的通信接口主要是一系列針對特殊設備文件 dev/kvm 的 IOCTL 調用(ioctl是設備驅動程序中對設備的I/O通道進行管理的函數)。其中最重要的是創建虛機。它可以理解成KVM 為了某個特定的虛機創建對應的內核數據結構,同時,KVM 返回一個文件句柄來代表所創建的虛機。 針對該句柄的調用可以對虛機做相應地管理,比如創建用戶空間虛擬地址和客戶機物理地址、真實物理地址之間的映射關系,再比如創建多個 vCPU。KVM 為每一個 vCPU 生成對應的文件句柄,對其相應地 IOCTL 調用,就可以對vCPU進行管理。其中最重要的就是“執行虛擬處理器”。通過它,虛機在 KVM 的支持下,被置於虛擬化模式的非根模式下,開始執行二進制指令。在非根模式下,所有敏感的二進制指令都被CPU捕捉到,CPU 在保存現場之後自動切換到根模式,由 KVM 決定如何處理。 除了 CPU 的虛擬化,內存虛擬化也由 KVM 實現。實際上,內存虛擬化往往是一個虛機實現中最復雜的部分。CPU 中的內存管理單元 MMU 是通過頁表的形式將程序運行的虛擬地址轉換成實際物理地址。在虛擬機模式下,MMU 的頁表則必須在一次查詢的時候完成兩次地址轉換。因為除了將客戶機程序的虛擬地址轉換了客戶機的物理地址外,還要將客戶機物理地址轉化成真實物理地址。

四 KVM工具集合

Libvirt:簡單說就是 KVM 的管理工具。並且Libvirt 除了能管理 KVM 這種 Hypervisor,還能同時管理 vmware,XEN,Hyper-v, LXC,QEMU 等多種Hypervisor。

Libvirt 本質就是一組API,通常部署完libvirt後,都會包含 3 樣東西:一個API 庫,一個後臺守護進程libvirtd和一個命令行工具virsh。

  1. API 庫使得其他人可以開發基於 Libvirt 的高級工具,比如 virt-manager,這是個圖形化管理KVM的常用工具。;
  2. libvirtd是服務程序,接收和處理 API 請求;
  3. virsh :基於 libvirt 的 命令行的常用工具 (CLI)。

一:libvirt實現在一臺物理機上同時跑多個虛擬機監控程序vmm

libvirt期初是專門為Xen設計的一種管理API,後來被擴展為可支持多個VMM,libvirt以一組API的形式存在,負責與每個vmm通信,完成API請求

技術分享

左圖是沒有引入libvirt時,一臺機器只能運行一個Hypervisor/vmm,右圖是引入了libvirt時,一臺機器可以同時運行多個Hypervisor/vmm,此時需要註意的是,libvirt把物理主機稱作節點,將來賓操作系統(guest os)稱為域Domain,而libvirt及其應用程序在宿主機Domain 0中運行

二 libvirtd提供從遠程應用程序訪問本地域的方式

技術分享

三 libvrt api與相關驅動程序的層次結構。

技術分享

libvirt 已經為表 1 所列舉出來的的虛擬機監控程序實現了驅動程序。隨著新的虛擬機監控程序在開源社區出現,其他驅動程序無疑也將可用。

技術分享

四 libvirt主要功能總結

  1. Domain(虛擬機)管理:啟動、停止、暫停、保存、恢復和遷移。支持多種涉筆類型的熱插拔,如磁盤、網卡、內存和cpu。
  2. 遠程訪問支持:見圖2,只要在一臺主機上運行libvirtd守護進程,所有的libvirt功能就都可以訪問和使用。支持多種網絡遠程傳播,使用最簡單的SSH,不需要額外的配置工作,比如example.com物理機運行了libvirtd,而且允許SSH訪問,下面命令就可以在遠程的主機上使用virsh命令:virsh -connect qemu+ssh:[email protected]/system
  3. 存儲管理:任何運行了libvirtd的主機都可以用來管理不同類型的存儲,如創建不同格式的文件映像(qcow2,vmdk,raw等),掛接NFS共享、列出現有的LVM卷組、創建新的LVM卷組和邏輯卷、對未處理過的磁盤設備分區、掛在iSCSI共享等等,因為libvirt可以遠程工作,所有這些都可以通過遠程主機來使用。
  4. 網絡接口管理:任何運行了libvirtd的主機都可用來管理物理和邏輯的網絡接口,可以列出現有的接口、配置參數、橋接、VLAN和關聯設備等,也可以創建新的網絡接口。
  5. 虛擬NAT和基於路由的網絡:任何運行了libvirtd的主機都可以用來管理和創建虛擬網絡。libvirt虛擬網絡使用防火墻規則作為路由器,讓虛擬機可以透明訪問主機的網絡。

ps:libvirt使用 C 語言編寫,可以由 Python,Ruby, Perl, PHP, Java 等語言調用,OpenStack 底層也使用 libvirt。更詳細猛擊這裏

除此之外還包含下列工具:
virt-v2v:虛機格式遷移工具
virt-* 工具:包括 virt-install(創建KVM虛機的命令行工具),virt-viewer(連接到虛機屏幕的工具),virt-clone(虛機克隆工具),virt-top 等
sVirt:安全工具

openstack項目【day23】:KVM介紹