學習 KVM 的系列文章:
- (1)介紹和安裝
- (2)CPU 和 內存虛擬化
- (3)I/O QEMU 全虛擬化和准虛擬化(Para-virtulizaiton)
- (4)I/O PCI/PCIe設備直接分配和 SR-IOV
- (5)libvirt 介紹
- (6)Nova 通過 libvirt 管理 QEMU/KVM 虛機
- (7)快照 (snapshot)
- (8)遷移 (migration)
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 架構

- 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 請求的原理:
QEMU-KVM:
KVM:
- 首先初始化內部的數據結構;
- 做好准備后,KVM 模塊檢測當前的 CPU,然后打開 CPU 控制及存取 CR4 的虛擬化模式開關,並通過執行 VMXON 指令將宿主操作系統置於虛擬化模式的根模式;
- 最后,KVM 模塊創建特殊設備文件 /dev/kvm 並等待來自用戶空間的指令。
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 安裝
- Red Hat Enterprise Linux:適用於小的環境,提供數目較少的KVM虛機。最新的版本包括 6.5 和 7.0.
- Red Hat Enterprise Virtualization (RHEV):提供企業規模的KVM虛擬化環境,包括更簡單的管理、HA,性能優化和其它高級功能。最新的版本是 3.0.
- 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 :
可以選擇具體的 KVM 客戶端、平台和工具:
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 工具
使用 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