1. KVM 介紹
1.0 虛擬化簡(jiǎn)史
其中前塔,KVM 全稱是 基于內(nèi)核的虛擬機(jī)(Kernel-based Virtual Machine),它是一個(gè) Linux 的一個(gè)內(nèi)核模塊诗良,該內(nèi)核模塊使得 Linux 變成了一個(gè) Hypervisor:
- 它由 Quramnet 開(kāi)發(fā)才写,該公司于 2008年被 Red Hat 收購(gòu)。
- 它支持 x86 (32 and 64 位), s390, Powerpc 等 CPU。
- 它從 Linux 2.6.20 起就作為一模塊被包含在 Linux 內(nèi)核中秦驯。
- 它需要支持虛擬化擴(kuò)展的 CPU。
- 它是完全開(kāi)源的挣棕。
本文介紹的是基于 X86 CPU 的 KVM译隘。
1.1 KVM 架構(gòu)
KVM 是基于虛擬化擴(kuò)展(Intel VT 或者 AMD-V)的 X86 硬件的開(kāi)源的 Linux 原生的全虛擬化解決方案。KVM 中洛心,虛擬機(jī)被實(shí)現(xiàn)為常規(guī)的 Linux 進(jìn)程固耘,由標(biāo)準(zhǔn) Linux 調(diào)度程序進(jìn)行調(diào)度;虛機(jī)的每個(gè)虛擬 CPU 被實(shí)現(xiàn)為一個(gè)常規(guī)的 Linux 進(jìn)程词身。這使得 KMV 能夠使用 Linux 內(nèi)核的已有功能厅目。
但是,KVM 本身不執(zhí)行任何硬件模擬偿枕,需要客戶空間程序通過(guò) /dev/kvm 接口設(shè)置一個(gè)客戶機(jī)虛擬服務(wù)器的地址空間璧瞬,向它提供模擬的 I/O户辫,并將它的視頻顯示映射回宿主的顯示屏渐夸。目前這個(gè)應(yīng)用程序是 QEMU。
Linux 上的用戶空間渔欢、內(nèi)核空間和虛機(jī):
Guest:客戶機(jī)系統(tǒng)墓塌,包括CPU(vCPU)、內(nèi)存奥额、驅(qū)動(dòng)(Console苫幢、網(wǎng)卡、I/O 設(shè)備驅(qū)動(dòng)等)垫挨,被 KVM 置于一種受限制的 CPU 模式下運(yùn)行韩肝。
KVM:運(yùn)行在內(nèi)核空間,提供CPU 和內(nèi)存的虛級(jí)化九榔,以及客戶機(jī)的 I/O 攔截哀峻。Guest 的 I/O 被 KVM 攔截后涡相,交給 QEMU 處理。
QEMU:修改過(guò)的為 KVM 虛機(jī)使用的 QEMU 代碼剩蟀,運(yùn)行在用戶空間催蝗,提供硬件 I/O 虛擬化,通過(guò) IOCTL /dev/kvm 設(shè)備和 KVM 交互育特。
**KVM 是實(shí)現(xiàn)攔截虛機(jī)的 I/O 請(qǐng)求的原理:
** 現(xiàn)代 CPU 本身了對(duì)特殊指令的截獲和重定向的硬件支持丙号,甚至新的硬件會(huì)提供額外的資源來(lái)幫助軟件實(shí)現(xiàn)對(duì)關(guān)鍵硬件資源的虛擬化從而提高性能。以 X86 平臺(tái)為例缰冤,支持虛擬化技術(shù)的 CPU 帶有特別優(yōu)化過(guò)的指令集來(lái)控制虛擬化過(guò)程犬缨。通過(guò)這些指令集,VMM 很容易將客戶機(jī)置于一種受限制的模式下運(yùn)行棉浸,一旦客戶機(jī)視圖訪問(wèn)物理資源遍尺,硬件會(huì)暫停客戶機(jī)的運(yùn)行涮拗,將控制權(quán)交回給 VMM 處理乾戏。VMM 還可以利用硬件的虛級(jí)化增強(qiáng)機(jī)制,將客戶機(jī)在受限模式下對(duì)一些特定資源的訪問(wèn)三热,完全由硬件重定向到 VMM 指定的虛擬資源鼓择,整個(gè)過(guò)程不需要暫停客戶機(jī)的運(yùn)行和 VMM 的參與就漾。由于虛擬化硬件提供全新的架構(gòu)呐能,支持操作系統(tǒng)直接在上面運(yùn)行,無(wú)需進(jìn)行二進(jìn)制轉(zhuǎn)換抑堡,減少了相關(guān)的性能開(kāi)銷摆出,極大簡(jiǎn)化了VMM的設(shè)計(jì),使得VMM性能更加強(qiáng)大首妖。從 2005 年開(kāi)始偎漫,Intel 在其處理器產(chǎn)品線中推廣 Intel Virtualization Technology 即 IntelVT 技術(shù)。
**QEMU-KVM:
** 其實(shí) QEMU 原本不是 KVM 的一部分有缆,它自己就是一個(gè)純軟件實(shí)現(xiàn)的虛擬化系統(tǒng)象踊,所以其性能低下。但是棚壁,QEMU 代碼中包含整套的虛擬機(jī)實(shí)現(xiàn)杯矩,包括處理器虛擬化,內(nèi)存虛擬化袖外,以及 KVM需要使用到的虛擬設(shè)備模擬(網(wǎng)卡史隆、顯卡、存儲(chǔ)控制器和硬盤(pán)等)曼验。
為了簡(jiǎn)化代碼泌射,KVM 在 QEMU 的基礎(chǔ)上做了修改头镊。VM 運(yùn)行期間,QEMU 會(huì)通過(guò) KVM 模塊提供的系統(tǒng)調(diào)用進(jìn)入內(nèi)核魄幕,由 KVM 負(fù)責(zé)將虛擬機(jī)置于處理的特殊模式運(yùn)行相艇。遇到虛機(jī)進(jìn)行 I/O 操作,KVM 會(huì)從上次的系統(tǒng)調(diào)用出口處返回 QEMU纯陨,由 QEMU 來(lái)負(fù)責(zé)解析和模擬這些設(shè)備坛芽。
從 QEMU 的角度看,也可以說(shuō)是 QEMU 使用了 KVM 模塊的虛擬化功能翼抠,為自己的虛機(jī)提供了硬件虛擬化加速咙轩。除此以外,虛機(jī)的配置和創(chuàng)建阴颖、虛機(jī)運(yùn)行說(shuō)依賴的虛擬設(shè)備活喊、虛機(jī)運(yùn)行時(shí)的用戶環(huán)境和交互,以及一些虛機(jī)的特定技術(shù)比如動(dòng)態(tài)遷移量愧,都是 QEMU 自己實(shí)現(xiàn)的钾菊。
**KVM:
** KVM 內(nèi)核模塊在運(yùn)行時(shí)按需加載進(jìn)入內(nèi)核空間運(yùn)行。KVM 本身不執(zhí)行任何設(shè)備模擬偎肃,需要 QEMU 通過(guò) /dev/kvm 接口設(shè)置一個(gè) GUEST OS 的地址空間煞烫,向它提供模擬的 I/O 設(shè)備,并將它的視頻顯示映射回宿主機(jī)的顯示屏累颂。它是KVM 虛機(jī)的核心部分滞详,其主要功能是初始化 CPU 硬件,打開(kāi)虛擬化模式紊馏,然后將虛擬客戶機(jī)運(yùn)行在虛擬機(jī)模式下料饥,并對(duì)虛機(jī)的運(yùn)行提供一定的支持。以在 Intel 上運(yùn)行為例朱监,KVM 模塊被加載的時(shí)候岸啡,它:
首先初始化內(nèi)部的數(shù)據(jù)結(jié)構(gòu);
做好準(zhǔn)備后赌朋,KVM 模塊檢測(cè)當(dāng)前的 CPU凰狞,然后打開(kāi) CPU 控制及存取 CR4 的虛擬化模式開(kāi)關(guān)篇裁,并通過(guò)執(zhí)行 VMXON 指令將宿主操作系統(tǒng)置于虛擬化模式的根模式沛慢;
最后,KVM 模塊創(chuàng)建特殊設(shè)備文件 /dev/kvm 并等待來(lái)自用戶空間的指令达布。
接下來(lái)的虛機(jī)的創(chuàng)建和運(yùn)行將是 QEMU 和 KVM 相互配合的過(guò)程团甲。兩者的通信接口主要是一系列針對(duì)特殊設(shè)備文件 dev/kvm 的 IOCTL 調(diào)用。其中最重要的是創(chuàng)建虛機(jī)黍聂。它可以理解成KVM 為了某個(gè)特定的虛機(jī)創(chuàng)建對(duì)應(yīng)的內(nèi)核數(shù)據(jù)結(jié)構(gòu)躺苦,同時(shí)身腻,KVM 返回一個(gè)文件句柄來(lái)代表所創(chuàng)建的虛機(jī)。
針對(duì)該句柄的調(diào)用可以對(duì)虛機(jī)做相應(yīng)地管理匹厘,比如創(chuàng)建用戶空間虛擬地址和客戶機(jī)物理地址嘀趟、真實(shí)物理地址之間的映射關(guān)系,再比如創(chuàng)建多個(gè) vCPU愈诚。KVM 為每一個(gè) vCPU 生成對(duì)應(yīng)的文件句柄她按,對(duì)其相應(yīng)地 IOCTL 調(diào)用,就可以對(duì)vCPU進(jìn)行管理炕柔。其中最重要的就是“執(zhí)行虛擬處理器”酌泰。通過(guò)它,虛機(jī)在 KVM 的支持下匕累,被置于虛擬化模式的非根模式下陵刹,開(kāi)始執(zhí)行二進(jìn)制指令。在非根模式下欢嘿,所有敏感的二進(jìn)制指令都被CPU捕捉到衰琐,CPU 在保存現(xiàn)場(chǎng)之后自動(dòng)切換到根模式,由 KVM 決定如何處理炼蹦。
除了 CPU 的虛擬化碘耳,內(nèi)存虛擬化也由 KVM 實(shí)現(xiàn)。實(shí)際上框弛,內(nèi)存虛擬化往往是一個(gè)虛機(jī)實(shí)現(xiàn)中最復(fù)雜的部分辛辨。CPU 中的內(nèi)存管理單元 MMU 是通過(guò)頁(yè)表的形式將程序運(yùn)行的虛擬地址轉(zhuǎn)換成實(shí)際物理地址。在虛擬機(jī)模式下瑟枫,MMU 的頁(yè)表則必須在一次查詢的時(shí)候完成兩次地址轉(zhuǎn)換斗搞。因?yàn)槌藢⒖蛻魴C(jī)程序的虛擬地址轉(zhuǎn)換了客戶機(jī)的物理地址外,還要將客戶機(jī)物理地址轉(zhuǎn)化成真實(shí)物理地址慷妙。
2. KVM 的功能列表
KVM 所支持的功能包括:
- 支持CPU 和 memory 超分(Overcommit)
- 支持半虛擬化I/O (virtio)
- 支持熱插拔 (cpu僻焚,塊設(shè)備、網(wǎng)絡(luò)設(shè)備等)
- 支持對(duì)稱多處理(Symmetric Multi-Processing膝擂,縮寫(xiě)為 SMP )
- 支持實(shí)時(shí)遷移(Live Migration)
- 支持 PCI 設(shè)備直接分配和 單根I/O 虛擬化 (SR-IOV)
- 支持 內(nèi)核同頁(yè)合并 (KSM )
- 支持 NUMA (Non-Uniform Memory Access虑啤,非一致存儲(chǔ)訪問(wèn)結(jié)構(gòu) )
3. KVM 工具集合
libvirt:操作和管理KVM虛機(jī)的虛擬化 API,使用 C 語(yǔ)言編寫(xiě)架馋,可以由 Python,Ruby, Perl, PHP, Java 等語(yǔ)言調(diào)用狞山。可以操作包括 KVM叉寂,vmware萍启,XEN,Hyper-v, LXC 等 Hypervisor。
Virsh:基于 libvirt 的 命令行工具 (CLI)
Virt-Manager:基于 libvirt 的 GUI 工具
virt-v2v:虛機(jī)格式遷移工具
virt-* 工具:包括 Virt-install (創(chuàng)建KVM虛機(jī)的命令行工具)勘纯, Virt-viewer (連接到虛機(jī)屏幕的工具)局服,Virt-clone(虛機(jī)克隆工具),virt-top 等
sVirt:安全工具
4. RedHat Linux KVM 安裝
RedHat 有兩款產(chǎn)品提供 KVM 虛擬化:
- Red Hat Enterprise Linux:適用于小的環(huán)境驳遵,提供數(shù)目較少的KVM虛機(jī)淫奔。最新的版本包括 6.5 和 7.0.
2. Red Hat Enterprise Virtualization (RHEV):提供企業(yè)規(guī)模的KVM虛擬化環(huán)境,包括更簡(jiǎn)單的管理堤结、HA搏讶,性能優(yōu)化和其它高級(jí)功能。最新的版本是 3.0.
RedHat Linux KVM:
KVM 由 libvirt API 和基于該 API的一組工具進(jìn)行管理和控制霍殴。
KVM 支持系統(tǒng)資源超分媒惕,包括內(nèi)存和CPU的超分。RedHat Linux 最多支持物理 CPU 內(nèi)核總數(shù)的10倍數(shù)目的虛擬CPU来庭,但是不支持在一個(gè)虛機(jī)上分配超過(guò)物理CPU內(nèi)核總數(shù)的虛擬CPU妒蔚。
支持 KSM (Kenerl Same-page Merging 內(nèi)核同頁(yè)合并)
RedHat Linux KVM 有如下兩種安裝方式:
4.1 在安裝 RedHat Linux 時(shí)安裝 KVM
選擇安裝類型為 Virtualizaiton Host :
可以選擇具體的 KVM 客戶端、平臺(tái)和工具:
4.2 在已有的 RedHat Linux 中安裝 KVM
這種安裝方式要求該系統(tǒng)已經(jīng)被注冊(cè)月弛,否則會(huì)報(bào)錯(cuò):
[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 這兩個(gè)包肴盏。
# 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 的代碼結(jié)構(gòu)
QEMU/KVM 的代碼包括幾個(gè)部分:
(1)KVM 內(nèi)核模塊是 Linux 內(nèi)核的一部分。通常 Linux 比較新的發(fā)行版(2.6.20+)都包含了 KVM 內(nèi)核帽衙,也可以從(https://www.kernel.org/)得到菜皂。比如在我的RedHat 6.5 上:
[root@rh65 isoimages]# uname -r2.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 項(xiàng)目從 QEMU 新拉出的一個(gè)分支(http://wiki.qemu.org/KVM)厉萝。在 QEMU 1.3 版本之前恍飘,QEMU 和 QEMU-KVM 是有區(qū)別的,但是從 2012 年底 GA 的 QEMU 1.3 版本開(kāi)始谴垫,兩者就完全一樣了章母。
(3)Linux Guest OS virtio 驅(qū)動(dòng),也是較新的Linux 內(nèi)核的一部分了翩剪。
(4)Windows Guest OS virtio 驅(qū)動(dòng)乳怎,可以從(http://www.linux-kvm.org/page/WindowsGuestDrivers/Download_Drivers)下載。
4.3.2 安裝 QEMU
RedHat 6.5 上自帶的 QEMU 太老前弯,0.12.0 版本蚪缀,最新版本都到了 2.* 了。
(1). 參考 這篇文章(http://www.yimiju.com/articles/531.html)恕出,將 RedHat 6.5 的 ISO 文件當(dāng)作本地源
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=1gpgcjeck=01丨yum clean all<br>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 下載代碼询枚,上傳到我的編譯環(huán)境 RedHat 6.5.
tar -jzvf qemu-2.3.0.tar.bz2 cd qemu-2.3.0./configure make -j 4make 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). 為方便起見(jiàn),創(chuàng)建一個(gè)link
ln -s /usr/bin/qemu-system-x86_64 /usr/bin/qemu-kvm
4.3.3 安裝 libvirt
可以從 libvirt 官網(wǎng)下載安裝包剃根。最新的版本是 0.10.2.
5. 創(chuàng)建 KVM 虛機(jī)的幾種方式
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 創(chuàng)建的虛機(jī)的xml 定義文件在 /etc/libvirt/qemu/ 目錄中哩盲。
5.3 使用 qemu-img 和 qemu-kvm 命令行方式安裝
(1)創(chuàng)建一個(gè)空的qcow2格式的鏡像文件
qemu-img create -f qcow2 windows-master.qcow2 10G
(2)啟動(dòng)一個(gè)虛機(jī),將系統(tǒng)安裝盤(pán)掛到 cdrom狈醉,安裝操作系統(tǒng)
qemu-kvm -hda windows-master.qcow2 -m 512 -boot d -cdrom /home/user/isos/en_winxp_pro_with_sp2.iso
(3)現(xiàn)在你就擁有了一個(gè)帶操作系統(tǒng)的鏡像文件廉油。你可以以它為模板創(chuàng)建新的鏡像文件。使用模板的好處是苗傅,它會(huì)被設(shè)置為只讀所以可以免于破壞抒线。
qemu-img create -b windows-master.qcow2 -f qcow2 windows-clone.qcow2
(4)你可以在新的鏡像文件上啟動(dòng)虛機(jī)了
qemu-kvm -hda windows-clone.qcow2 -m 400
5.4 通過(guò) OpenStack Nova 使用 libvirt API 通過(guò)編程方式來(lái)創(chuàng)建虛機(jī) (后面會(huì)介紹)
作者:劉世民(sammyli)