kvm介紹

1、KVM概念

一、什麼是KVM?

  KVM 全稱 Kernel-Based Virtual Machine。也就是說 KVM 是基於 Linux 內核實現的,這就使得linux內核自己就至關於一個Hypervisor。html

  Hypervisor是一種運行在物理服務器和操做系統之間的中間軟件層,可容許多個操做系統和應用共享一套基礎物理硬件,所以也能夠看做是虛擬環境中的「元」操做系統,它能夠協調訪問服務器上的全部物理設備和虛擬機,也叫虛擬機監視器(Virtual Machine Monitor),即vmm主要功能就是用來控制生成vm,並管理多個vm的運行,不一樣的vm中能夠安裝不一樣的操做系統,這些操做系統共用一臺硬件主機,linux

  由於直接使用linux內核的調度器進行管理,因此比xen的代碼少不少api

二、爲什麼要用KVM?

  虛擬化是雲計算的基礎之一,而不管是在部署,仍是在研發、測試方面,kvm都是排在第一位的Hypervisor(即vmm,虛擬機監視器)安全

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

三、KVM的功能

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

(1)最主要的功能

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

(2)其他功能

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

2、常見虛擬化模式

  按照Hypervisor的實現方式和位置不一樣,常見的形式分兩種。(詳細見虛擬化介紹數據結構

一、全虛擬化

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

   

二、半虛擬化

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

  

3、KVM架構

  openstack能夠兼容不少虛擬化解決方案,其中最主要的就是針對x86平臺的kvm函數

  KVM 全稱 Kernel-Based Virtual Machine。也就是說 KVM 是基於 Linux 內核實現的,這就使得linux內核自己就至關於一個Hypervisor。

一、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,而且將它的視頻顯示映射回宿主的顯示屏。

  

二、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去作。

三、建立虛擬機流程

  

(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 交互。

(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 模塊被加載的時候,它:

  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 的頁表則必須在一次查詢的時候完成兩次地址轉換。由於除了將客戶機程序的虛擬地址轉換了客戶機的物理地址外,還要將客戶機物理地址轉化成真實物理地址。  

4、KVM工具集合

一、libvirt介紹

  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://root@example.com/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 虛擬化庫剖析 

六、其餘工具

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

5、KVM部署

https://www.cnblogs.com/linhaifeng/p/6411174.html

相關文章
相關標籤/搜索