虛擬化的定義
虛擬化是一種資源管理技術,它將計算機的各種實體資源(CPU、內存、存儲、網絡等)予以抽象和轉化出來,並提供分割、重新組合,以達到最大化利用物理資源的目的。
為了達到虛擬化,需要引入一個層:VMM(Virtual Machine Monitor)虛擬機監控器,也稱為Hypervisor層。它向下掌控實際的物理資源(相當於原本的操作系統);向上呈現給虛擬機N份邏輯的資源。
虛擬化技術的實現方式
主要有軟件虛擬化和硬件虛擬化兩種。
軟件虛擬化,顧名思義,就是通過軟件模擬來實現VMM層,通過純軟件的環境來模擬執行客戶機里的指令。最純粹的軟件虛擬化實現當屬QEMU。
硬件虛擬化技術就是指計算機硬件本身提供能力讓客戶機指令獨立執行,而不需要(嚴格來說是不完全需要)VMM截獲重定向。Intel從2005年就開始在其x86 CPU中加入硬件虛擬化的支持——IntelVirtualization Technology,簡稱Intel VT。
半虛擬化和全虛擬化
讓客戶機意識到自己是運行在虛擬化環境里,並做相應修改以配合VMM,這就是半虛擬化(Para-Virtualization)。一方面,可以提升性能和簡化VMM軟件復雜度;另一方面,也不需要太依賴硬件虛擬化的支持。
與半虛擬化相反的,對於全虛擬化(Full Virtualization),客戶機操作系統完全不需要改動,所有軟件都能在虛擬機中運行。因此,全虛擬化需要模擬出完整的、和物理平台一模一樣的平台給客戶機,這在達到了第一個目標的同時也增加了虛擬化層(VMM)的復雜度。
Type1和Type2虛擬化
從軟件框架的角度上,根據虛擬化層是直接位於硬件之上還是在一個宿主操作系統之上,將虛擬化划分為Typel和Type2。
Type1(類型1)Hypervisor也叫native或bare-metal Hypervisor。這類虛擬化層直接運行在硬件之上,沒有所謂的宿主機操作系統。它們直接控制硬件資源以及客戶機。典型地如Xen和VMware ESX。
Type2(類型2)Hypervisor運行在一個宿主機操作系統之上,如VMwareWorkstation;或系統里,如KVM。這類Hypervisor通常就是宿主機操作系統的一個應用程序,像其他應用程序一樣受宿主機操作系統的管理。
KVM簡介
KVM全稱是Kernel-based Virtual Machine,即基於內核的虛擬機,是采用硬件虛擬化技術的全虛擬化解決方案。
它以內核模塊的形式加載之后,就將Linux內核變成了一個Hypervisor,但硬件管理等還是通過Linuxkernel來完成的,所以它是一個典型的Type 2 Hypervisor。
一個KVM客戶機對應於一個Linux進程,每個vCPU則是這個進程下的一個線程,還有單獨的處理IO的線程,也在一個線程組內。
KVM的功能特性
1.內存管理
一個KVM客戶機就是一個普通的Linux進程,所以,客戶機的“物理內存”就是宿主機內核管理的普通進程的虛擬內存。
2.存儲和客戶機鏡像的格式
嚴格來說,這是QEMU的功能特性。KVM能夠使用Linux支持的任何存儲來存儲虛擬機鏡像,包括具有IDE、SCSI和SATA的本地磁盤,網絡附加存儲(NAS)(包括NFS和SAMBA/CIFS),或者支持iSCSI和光線通道的SAN。
3.實時遷移
KVM支持實時遷移,這提供了在宿主機之間轉移正在運行的客戶機而不中斷服務的能力,實時遷移對用戶是透明的。
4.設備驅動程序
KVM支持混合虛擬化,其中半虛擬化的驅動程序安裝在客戶機操作系統中,允許虛擬機使用優化的I/O接口而不使用模擬的設備,從而為網絡和塊設備提供高性能的I/O。
5.性能和可伸縮性
KVM繼承了Linux的性能和可伸縮性。KVM在CPU、內存、網絡、磁盤等虛擬化性能上表現出色,大多都在原生系統的95%以上。KVM的伸縮性也非常好,支持擁有多達288個vCPU和4TB RAM的客戶機,對於宿主機上可以同時運行的客戶機數量,軟件上無上限。
KVM的現狀
得益於與Linux天然一體以及Redhat的傾力打造,KVM已經成為Openstack用戶選擇的最主流的Hypervisor(因為KVM是Openstack的默認Hypervisor)。來自Openstack的調查顯示,KVM占到87%以上的部署份額,並且(筆者認為)還會繼續增大。可以說,KVM已經主宰了公有雲部署的Hypervisor市場。
KVM的展望
(1)大規模部署尚有挑戰。(2)實時性(Realtime)。(3)安全是永恆的主題/話題。(4)性能調優。
KVM架構概述
硬件虛擬化技術包括對CPU、內存、I/O等硬件的虛擬化,KVM就是在硬件輔助虛擬化技術之上構建起來的虛擬機監控器。當然,並非要所有這些硬件虛擬化都支持才能運行KVM虛擬化,KVM對硬件最低的依賴是CPU的硬件虛擬化支持,而其他的內存和I/O的硬件虛擬化支持,會讓整個KVM虛擬化下的性能得到更多的提升。
KVM虛擬化的核心主要由以下兩個模塊組成:
1)KVM內核模塊,它屬於標准Linux內核的一部分,是一個專門提供虛擬化功能的模塊,主要負責CPU和內存的虛擬化,包括:客戶機的創建、虛擬內存的分配、CPU執行模式的切換、vCPU寄存器的訪問、vCPU的執行。
2)QEMU用戶態工具,它是一個普通的Linux進程,為客戶機提供設備模擬的功能,包括模擬BIOS、PCI/PCIE總線、磁盤、網卡、顯卡、聲卡、鍵盤、鼠標等。同時它通過ioctl系統調用與內核態的KVM模塊進行交互。
在KVM虛擬化架構下,每個客戶機就是一個QEMU進程,在一個宿主機上有多少個虛擬機就會有多少個QEMU進程;客戶機中的每一個虛擬CPU對應QEMU進程中的一個執行線程;一個宿主機中只有一個KVM內核模塊,所有客戶機都與這個內核模塊進行交互。

KVM內核模塊
KVM內核模塊是標准Linux內核的一部分,由於KVM的存在讓Linux本身就變成了一個Hypervisor,可以原生地支持虛擬化功能。
KVM內核模塊由兩部分組成:
-
一個是處理器架構無關的部分,用lsmod命令中可以看到,叫作kvm模塊;
-
另一個是處理器架構相關的部分,在Intel平台上就是kvm_intel這個內核模塊。
KVM的主要功能是初始化CPU硬件,打開虛擬化模式,然后將虛擬客戶機運行在虛擬機模式下,並對虛擬客戶機的運行提供一定的支持。
最后,KVM模塊創建特殊設備文件/dev/kvm並等待來自用戶空間的命令。接下來,虛擬機的創建和運行將是一個用戶空間的應用程序(QEMU)和KVM模塊相互配合的過程。
/dev/kvm這個設備可以被當作一個標准的字符設備,KVM模塊與用戶空間QEMU的通信接口主要是一系列針對這個特殊設備文件的loctl調用。
針對/dev/kvm文件的最重要的loctl調用就是“創建虛擬機”;針對虛擬處理器的最重要的loctl調用就是“執行虛擬處理器”。
一般來說,只有對性能要求比較高的虛擬設備才會由KVM內核模塊來直接負責,比如虛擬中斷控制器和虛擬時鍾,這樣可以大量減少處理器模式切換的開銷。而大部分的輸入輸出設備交給用戶態程序QEMU來負責。
QEMU用戶態工具
QEMU原本就是一個著名的開源虛擬機軟件項目,而不是KVM虛擬化軟件的一部分。
與KVM不同,QEMU最初實現的虛擬機是一個純軟件的實現,通過二進制翻譯來實現虛擬化客戶機中的CPU指令模擬,所以性能比較低。但是,其優點是跨平台。
作為一個存在已久的虛擬機監控器軟件,QEMU的代碼中有完整的虛擬機實現,包括處理器虛擬化、內存虛擬化,以及KVM也會用到的虛擬設備模擬(比如網卡、顯卡、存儲控制器和硬盤等)。
通過與KVM的密切結合,讓虛擬化的性能提升得非常高,在真實的企業級虛擬化場景中發揮重要作用,所以我們通常提及KVM虛擬化時就會說“QEMU/KVM”這樣的軟件棧。
與QEMU/KVM結合的組件
1.vhost-net
vhost-net是Linux內核中的一個模塊,它用於替代QEMU中的virtio-net用戶態的virtio網絡的后端實現。使用vhost-net時,還支持網卡的多隊列,整體來說會讓網絡性能得到較大提高。
2.Open vSwitch
Open vSwitch是一個高質量的、多層虛擬交換機,使用開源Apache2.0許可協議,主要用可移植性強的C語言編寫的。在KVM虛擬化中,要實現軟件定義網絡(SDN),那么Open vSwitch是一個非常好的開源選擇。
3.DPDK
DPDK全稱是Data Plane Development Kit。它專注於網絡應用中數據包的高性能處理。具體體現在DPDK應用程序是運行在用戶空間上,利用自身提供的數據平面庫來收發數據包,繞過了Linux內核協議棧對數據包處理過程。在KVM架構中,為了達到非常高的網絡處理能力(特別是小包處理能力),可以選擇DPDK與QEMU中的vhost-user結合起來使用。
4.SPDK
SPDK全稱是Storage Performance Development Kit,它可為編寫高性能、可擴展的、用戶模式的存儲程序提供一系列工具及開發庫。它與DPDK非常類似,其主要特點是:將驅動放到用戶態從而實現零拷貝、用輪詢模式替代傳統的中斷模式、在所有的I/O鏈路上實現無鎖設計,這些設計會使其性能比較高。在KVM中需要非常高的存儲I/O性能時,可以將QEMU與SPDK結合使用。
5.Ceph
Ceph是Linux上一個著名的分布式存儲系統,能夠在維護POSIX兼容性的同時加入復制和容錯功能。在OpenStack的雲平台解決方案中,Ceph是一個非常常用的存儲后端。
6.libguestfs
libguestfs是用於訪問和修改虛擬機的磁盤鏡像的一組工具集合。是管理KVM磁盤鏡像的首選工具。
KVM上層管理工具
1.libvirt
libvirt是使用最廣泛的對KVM虛擬化進行管理的工具和應用程序接口,已經是事實上的虛擬化接口標准,作為通用的虛擬化API,libvirt不但能管理KVM,還能管理VMware、Hyper-V、Xen、VirtualBox等其他虛擬化方案。
2.virsh
virsh是一個常用的管理KVM虛擬化的命令行工具,對於系統管理員在單個宿主機上進行運維操作,virsh命令行可能是最佳選擇。virsh是用C語言編寫的一個使用libvirt API的虛擬化管理工具,其源代碼也是在libvirt這個開源項目中的。
3.virt-manager
virt-manager是專門針對虛擬機的圖形化管理軟件,底層與虛擬化交互的部分仍然是調用libvirt API來操作的。在管理的機器數量規模較小時,virt-manager是很好的選擇。因其圖形化操作的易用性,成為新手入門學習虛擬化操作的首選管理軟件。
4.OpenStack
OpenStack是一個開源的基礎架構即服務(IaaS)雲計算管理平台,可用於構建共有雲和私有雲服務的基礎設施。OpenStack仍然使用libvirt API來完成對底層虛擬化的管理。