其中,KVM 全稱是 基於內核的虛擬機(Kernel-based Virtual Machine),它是Linux 的一個內核模塊,該內核模塊使得 Linux 變成了一個 Hypervisor:python
KVM 是基於虛擬化擴展(Intel VT 或者 AMD-V)的 X86 硬件的開源的 Linux 原生的全虛擬化解決方案。KVM 中,虛擬機被實現爲常規的 Linux 進程,由標準 Linux 調度程序進行調度;虛機的每一個虛擬 CPU 被實現爲一個常規的 Linux 線程。這使得 KMV 可以使用 Linux 內核的已有功能。
可是,KVM 自己不執行任何硬件模擬,須要用戶空間程序經過 /dev/kvm 接口設置一個客戶機虛擬服務器的地址空間,向它提供模擬 I/O,並將它的視頻顯示映射回宿主的顯示屏。目前這個應用程序是 QEMU。
現代 CPU 自己實現了對特殊指令的截獲和重定向的硬件支持,甚至新硬件會提供額外的資源來幫助軟件實現對關鍵硬件資源的虛擬化從而提升性能。以 X86 平臺爲例,支持虛擬化技術的 CPU 帶有特別優化過的指令集來控制虛擬化過程。經過這些指令集,VMM 很容易將客戶機置於一種受限制的模式下運行,一旦客戶機試圖訪問物理資源,硬件會暫停客戶機運行,將控制權交回給 VMM 處理。VMM 還能夠利用硬件的虛級化加強機制,將客戶機在受限模式下對一些特定資源的訪問,徹底由硬件重定向到 VMM 指定的虛擬資源,整個過程不須要暫停客戶機的運行和 VMM 的參與。因爲虛擬化硬件提供全新的架構,支持操做系統直接在上面運行,無需進行二進制轉換,減小了相關的性能開銷,極大簡化了VMM的設計,使得VMM性能更增強大。從 2005 年開始,Intel 在其處理器產品線中推廣 Intel Virtualization Technology 即 IntelVT 技術。
其實 QEMU 本來不是 KVM 的一部分,它本身就是一個純軟件實現的虛擬化系統,因此其性能低下。可是,QEMU 代碼中包含整套的虛擬機實現,包括處理器虛擬化,內存虛擬化,以及 KVM須要使用到的虛擬設備模擬(網卡、顯卡、存儲控制器和硬盤等)。
爲了簡化代碼,KVM 在 QEMU 的基礎上作了修改。VM 運行期間,QEMU 會經過 KVM 模塊提供的系統調用進入內核,由 KVM 負責將虛擬機置於處理的特殊模式運行。當虛機進行 I/O 操做時,KVM 會從上次系統調用出口處返回 QEMU,由 QEMU 來負責解析和模擬這些設備。
從 QEMU 角度看,也能夠說是 QEMU 使用了 KVM 模塊的虛擬化功能,爲本身的虛機提供了硬件虛擬化加速。除此之外,虛機的配置和建立、虛機運行所依賴的虛擬設備、虛機運行時的用戶環境和交互,以及一些虛機的特定技術好比動態遷移,都是 QEMU 本身實現的。
KVM:windows
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 調用。其中最重要的是建立虛機。它能夠理解成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 內核同頁合併)
RedHat Linux KVM 有以下兩種安裝方式:性能優化
4.1 在安裝 RedHat Linux 時安裝 KVM
選擇安裝類型爲 Virtualizaiton Host :服務器
![](http://static.javashuo.com/static/loading.gif)
能夠選擇具體的 KVM 客戶端、平臺和工具:網絡
![](http://static.javashuo.com/static/loading.gif)
4.2 在已有的 RedHat Linux 中安裝 KVM
這種安裝方式要求該系統已經被註冊,不然會報錯:
[root@rh65 ~]# yum install qemu-kvm qemu-img
Loaded plugins: product-id, refresh-packagekit, security, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
Setting up Install Process
Nothing to do
你至少須要安裝 qemu-kvm qemu-img 這兩個包。
# yum install qemu-kvm qemu-img
你還能夠安裝其它工具包:
# yum install virt-manager libvirt libvirt-python python-virtinst libvirt-client
4.3 QEMU/KVM 代碼下載編譯安裝
4.3.1 QEMU/KVM 的代碼結構
QEMU/KVM 的代碼包括幾個部分:
(1)KVM 內核模塊是 Linux 內核的一部分。一般 Linux 比較新的發行版(2.6.20+)都包含了 KVM 內核,也能夠從這裏獲得。好比在個人RedHat 6.5 上:
[root@rh65 isoimages]# uname -r
2.6.32-431.el6.x86_64
[root@rh65 isoimages]# modprobe -l | grep kvm
kernel/arch/x86/kvm/kvm.ko
kernel/arch/x86/kvm/kvm-intel.ko
kernel/arch/x86/kvm/kvm-amd.ko
(2)用戶空間的工具即 qemu-kvm。qemu-kvm 是 KVM 項目從 QEMU 新拉出的一個分支(看這篇文章)。在 QEMU 1.3 版本以前,QEMU 和 QEMU-KVM 是有區別的,可是從 2012 年末 GA 的 QEMU 1.3 版本開始,二者就徹底同樣了。
(3)Linux Guest OS virtio 驅動,也是較新的Linux 內核的一部分了。
(4)Windows Guest OS virtio 驅動,能夠從這裏下載。
4.3.2 安裝 QEMU
RedHat 6.5 上自帶的 QEMU 太老,0.12.0 版本,最新版本都到了 2.* 了。
(1). 參考 這篇文章,將 RedHat 6.5 的 ISO 文件看成本地源
mount -o loop soft/rhel-server-6.4-x86_64-dvd.iso /mnt/rhel6/
vim /etc/fstab
=> /root/isoimages/soft/RHEL6.5-20131111.0-Server-x86_64-DVD1.iso /mnt/rhel6 iso9660 ro,loop
[root@rh65 qemu-2.3.0]# cat /etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt/rhel6/
enabled=1
gpgcjeck=0
yum clean all
yum update
(2). 安裝依賴包包
yum install gcc
yum install autoconf
yum install autoconf automake libtool
yum install -y glib*
yum install zlib*
(3). 從 http://wiki.qemu.org/Download 下載代碼,上傳到個人編譯環境 RedHat 6.5.
tar -jzvf qemu-2.3.0.tar.bz2
cd qemu-2.3.0
./configure
make -j 4
make install
(4). 安裝完成
[root@rh65 qemu-2.3.0]# /usr/local/bin/qemu-x86_64 -version
qemu-x86_64 version 2.3.0, Copyright (c) 2003-2008 Fabrice Bellard
(5). 爲方便起見,建立一個link
ln -s /usr/bin/qemu-system-x86_64 /usr/bin/qemu-kvm
4.3.3 安裝 libvirt
能夠從 libvirt 官網下載安裝包。最新的版本是 0.10.2.
5. 建立 KVM 虛機的幾種方式
5.1 使用 virt-install 命令
virt-install \
--name=guest1-rhel5-64 \
--file=/var/lib/libvirt/images/guest1-rhel5-64.dsk \
--file-size=8 \
--nonsparse --graphics spice \
--vcpus=2 --ram=2048 \
--location=http://example1.com/installation_tree/RHEL5.6-Serverx86_64/os \
--network bridge=br0 \
--os-type=linux \
--os-variant=rhel5.4
5.2 使用 virt-manager 工具
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
使用 VMM GUI 建立的虛機的xml 定義文件在 /etc/libvirt/qemu/ 目錄中。
5.3 使用 qemu-img 和 qemu-kvm 命令行方式安裝
(1)建立一個空的qcow2格式的鏡像文件
qemu-img create -f qcow2 windows-master.qcow2 10G
(2)啓動一個虛機,將系統安裝盤掛到 cdrom,安裝操做系統
qemu-kvm -hda windows-master.qcow2 -m 512 -boot d -cdrom /home/user/isos/en_winxp_pro_with_sp2.iso
(3)如今你就擁有了一個帶操做系統的鏡像文件。你能夠以它爲模板建立新的鏡像文件。使用模板的好處是,它會被設置爲只讀因此能夠免於破壞。
qemu-img create -b windows-master.qcow2 -f qcow2 windows-clone.qcow2
(4)你能夠在新的鏡像文件上啓動虛機了
qemu-kvm -hda windows-clone.qcow2 -m 400
5.4 經過 OpenStack Nova 使用 libvirt API 經過編程方式來建立虛機 (後面會介紹)