1. 程式人生 > 其它 >虛擬機器:KVM

虛擬機器:KVM

1. KVM 介紹

1.0 虛擬化簡史

其中,KVM 全稱是 基於核心的虛擬機器(Kernel-based Virtual Machine),它是Linux 的一個核心模組,該核心模組使得 Linux 變成了一個 Hypervisor:

  • 它由 Quramnet 開發,該公司於 2008年被 Red Hat 收購。
  • 它支援 x86 (32 and 64 位), s390, Powerpc 等 CPU。
  • 它從 Linux 2.6.20 起就作為一模組被包含在 Linux 核心中。
  • 它需要支援虛擬化擴充套件的 CPU。
  • 它是完全開源的。官網

本文介紹的是基於 X86 CPU 的 KVM。

1.1 KVM 架構

  KVM 是基於虛擬化擴充套件(Intel VT 或者 AMD-V)的 X86 硬體的開源的 Linux 原生的全虛擬化解決方案。KVM 中,虛擬機器被實現為常規的 Linux 程序,由標準 Linux 排程程式進行排程;虛機的每個虛擬 CPU 被實現為一個常規的 Linux 執行緒。這使得 KMV 能夠使用 Linux 核心的已有功能。   但是,KVM 本身不執行任何硬體模擬,需要使用者空間程式通過 /dev/kvm 介面設定一個客戶機虛擬伺服器的地址空間,向它提供模擬 I/O,並將它的視訊顯示映射回宿主的顯示屏。目前這個應用程式是 QEMU。   Linux 上的使用者空間、核心空間和虛機:
                    
  • Guest:客戶機系統,包括CPU(vCPU)、記憶體、驅動(Console、網絡卡、I/O 裝置驅動等),被 KVM 置於一種受限制的 CPU 模式下執行。
  • KVM:執行在核心空間,提供 CPU 和記憶體的虛級化,以及客戶機的 I/O 攔截。Guest 的 I/O 被 KVM 攔截後,交給 QEMU 處理。
  • 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 呼叫。其中最重要的是建立虛機。它可以理解成KVM 為了某個特定的虛機建立對應的核心資料結構,同時,KVM 返回一個檔案控制代碼來代表所建立的虛機。       針對該控制代碼的呼叫可以對虛機做相應地管理,比如建立使用者空間虛擬地址和客戶機實體地址、真實實體地址之間的對映關係,再比如建立多個 vCPU。KVM 為每一個 vCPU 生成對應的檔案控制代碼,對其相應地 IOCTL 呼叫,就可以對vCPU進行管理。其中最重要的就是“執行虛擬處理器”。通過它,虛機在 KVM 的支援下,被置於虛擬化模式的非根模式下,開始執行二進位制指令。在非根模式下,所有敏感的二進位制指令都被CPU捕捉到,CPU 在儲存現場之後自動切換到根模式,由 KVM 決定如何處理。       除了 CPU 的虛擬化,記憶體虛擬化也由 KVM 實現。實際上,記憶體虛擬化往往是一個虛機實現中最複雜的部分。CPU 中的記憶體管理單元 MMU 是通過頁表的形式將程式執行的虛擬地址轉換成實際實體地址。在虛擬機器模式下,MMU 的頁表則必須在一次查詢的時候完成兩次地址轉換。因為除了將客戶機程式的虛擬地址轉換了客戶機的實體地址外,還要將客戶機實體地址轉化成真實實體地址。   

2. KVM 的功能列表

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,非一致儲存訪問結構 )

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

4. RedHat Linux KVM 安裝

RedHat 有兩款產品提供 KVM 虛擬化:
  • Red Hat Enterprise Linux:適用於小的環境,提供數目較少的KVM虛機。最新的版本包括 6.5 和 7.0.
  • Red Hat Enterprise Virtualization (RHEV):提供企業規模的KVM虛擬化環境,包括更簡單的管理、HA,效能優化和其它高階功能。最新的版本是 3.0.
   RedHat Linux KVM:
  • KVM 由 libvirt API 和基於該 API的一組工具進行管理和控制
  • KVM 支援系統資源超分,包括記憶體和CPU的超分。RedHat Linux 最多支援物理 CPU 核心總數的10倍數目的虛擬CPU,但是不支援在一個虛機上分配超過物理CPU核心總數的虛擬CPU。
  • 支援 KSM (Kenerl Same-page Merging 核心同頁合併)