一、KVM概念
1、什麼是KVM?
KVM 全稱 Kernel-Based Virtual Machine。也就是說 KVM 是基于 Linux 核心實作的,這就使得linux核心本身就相當于一個Hypervisor。
Hypervisor是一種運作在實體伺服器和作業系統之間的中間軟體層,可允許多個作業系統和應用共享一套基礎實體硬體,是以也可以看作是虛拟環境中的“元”作業系統,它可以協調通路伺服器上的所有實體裝置和虛拟機,也叫虛拟機螢幕(Virtual Machine Monitor),即vmm。主要功能就是用來控制生成vm,并管理多個vm的運作,不同的vm中可以安裝不同的作業系統,這些作業系統共用一台硬體主機,
因為直接使用linux核心的排程器進行管理,是以比xen的代碼少很多
2、為何要用KVM?
虛拟化是雲計算的基礎之一,而無論是在部署,還是在研發、測試方面,kvm都是排在第一位的Hypervisor(即vmm,虛拟機螢幕)。
kvm以高性能,可擴充性、高安全性,以及低成本而深受使用者喜愛,這一切也與他基于linux核心實作有關。
3、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。
1、KVM細節
基于kvm建立的vm就是一個普通的linux程序,由linux核心排程程式進行排程,vm是以可以使用linux核心已有的功能。vm的執行本質就是vm中cpu的執行,是以vm的每個cpu就是普通的linux程序。
KVM有一個核心子產品叫 kvm.ko,隻提供 CPU 和記憶體的虛拟化,而針對于IO及其他硬體裝置(網絡及存儲等)的虛拟化,則是交給qemu實作,qemu運作在使用者态通過/dev/kvm接口設定一個客戶機虛拟機伺服器的位址空間,向kvm提供模拟的I/O,并且将它的視訊顯示映射回宿主的顯示屏。
2、qemu介紹
其實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去做。
3、建立虛拟機流程
(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操作,啟動運作虛拟機。
4、總結
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 互動。
(1)KVM 是實作攔截虛機的 I/O 請求的原理
現代 CPU 本身實作了對特殊指令的‘截獲’和‘重定向’的硬體支援,甚至新的硬體會提供額外的資源來幫助軟體實作對關鍵硬體資源的虛拟化進而提高性能。以 X86 平台為例,支援虛拟化技術的 CPU 帶有特别優化過的指令集來控制虛拟化過程。通過這些指令集,VMM 很容易将客戶機置于一種受限制的模式下運作,一旦客戶機視圖通路實體資源,硬體會暫停客戶機的運作,将控制權交回給 VMM 處理。VMM 還可以利用硬體的虛級化增強機制,将客戶機在受限模式下對一些特定資源的通路,完全由硬體重定向到 VMM 指定的虛拟資源,整個過程不需要暫停客戶機的運作和 VMM 的參與。由于虛拟化硬體提供全新的架構,支援作業系統直接在上面運作,無需進行二進制轉換,減少了相關的性能開銷,極大簡化了VMM的設計,使得VMM性能更加強大。從 2005 年開始,Intel 在其處理器産品線中推廣 Intel Virtualization Technology 即 IntelVT 技術。
(2)QEMU-KVM:
其實 QEMU 原本不是 KVM 的一部分,它自己就是一個純軟體實作的虛拟化系統,是以其性能低下。但是,QEMU 代碼中包含整套的虛拟機實作,包括處理器虛拟化,記憶體虛拟化,以及 KVM需要使用到的虛拟裝置模拟(網卡、顯示卡、存儲控制器和硬碟等)。
為了簡化代碼,KVM 在 QEMU 的基礎上做了修改。VM 運作期間,QEMU 會通過 KVM 子產品提供的系統調用進入核心,由 KVM 負責将虛拟機置于處理的特殊模式運作。遇到虛機進行 I/O 操作,KVM 會從上次的系統調用出口處傳回 QEMU,由 QEMU 來負責解析和模拟這些裝置。
從 QEMU 的角度看,也可以說是 QEMU 使用了 KVM 子產品的虛拟化功能,為自己的虛機提供了硬體虛拟化加速。除此以外,虛機的配置和建立、虛機運作說依賴的虛拟裝置、虛機運作時的使用者環境和互動,以及一些虛機的特定技術比如動态遷移,都是 QEMU 自己實作的。
(3)KVM:
KVM 核心子產品在運作時按需加載進入核心空間運作。KVM 本身不執行任何裝置模拟,需要 QEMU 通過 /dev/kvm 接口設定一個 GUEST OS 的位址空間,向它提供模拟的 I/O 裝置,并将它的視訊顯示映射回主控端的顯示屏。它是KVM 虛機的核心部分,其主要功能是初始化 CPU 硬體,打開虛拟化模式,然後将虛拟客戶機運作在虛拟機模式下,并對虛機的運作提供一定的支援。以在 Intel 上運作為例,KVM 子產品被加載的時候,它:
- 首先初始化内部的資料結構;
- 做好準備後,KVM 子產品檢測目前的 CPU,然後打開 CPU 控制及存取 CR4 的虛拟化模式開關,并通過執行 VMXON 指令将宿主作業系統置于虛拟化模式的根模式;
- 最後,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工具集合
1、libvirt介紹
Libvirt:簡單說就是 KVM 的管理工具。并且Libvirt 除了能管理 KVM 這種 Hypervisor,還能同時管理 vmware,XEN,Hyper-v, LXC,QEMU 等多種Hypervisor。
Libvirt 本質就是一組API,通常部署完libvirt後,都會包含 3 樣東西:一個API 庫,一個背景守護程序libvirtd和一個指令行工具virsh。
- API 庫使得其他人可以開發基于 Libvirt 的進階工具,比如 virt-manager,這是個圖形化管理KVM的常用工具。;
- libvirtd是服務程式,接收和處理 API 請求;
- virsh :基于 libvirt 的 指令行的常用工具 (CLI)。
2、libvirt實作在一台實體機上同時跑多個虛拟機監控程式vmm
libvirt期初是專門為Xen設計的一種管理API,後來被擴充為可支援多個VMM,libvirt以一組API的形式存在,負責與每個vmm通信,完成API請求
左圖是沒有引入libvirt時,一台機器隻能運作一個Hypervisor/vmm,右圖是引入了libvirt時,一台機器可以同時運作多個Hypervisor/vmm,此時需要注意的是,libvirt把實體主機稱作節點,将來賓作業系統(guest os)稱為域Domain,而libvirt及其應用程式在主控端Domain 0中運作。
3、libvirtd提供從遠端應用程式通路本地域的方式
4、libvrt api與相關驅動程式的層次結構
libvirt 已經為表 1 所列舉出來的的虛拟機監控程式實作了驅動程式。随着新的虛拟機監控程式在開源社群出現,其他驅動程式無疑也将可用。
5、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。更詳細見:Libvirt 虛拟化庫剖析
6、其他工具
除此之外還包含下列工具:
virt-v2v:虛機格式遷移工具
virt-* 工具:包括 virt-install(建立KVM虛機的指令行工具),virt-viewer(連接配接到虛機螢幕的工具),virt-clone(虛機克隆工具),virt-top 等
sVirt:安全工具
五、KVM部署
https://www.cnblogs.com/linhaifeng/p/6411174.html