天天看點

Linux -- 建構KVM虛拟化環境

硬體系統的配置

硬體和BIOS中虛拟化技術的支援是KVM運作的先決條件。

在x86-64架構的處理器中,KVM必需的硬體虛拟化擴充分别為:Intel的虛拟化技術(Intel VT)和AMD的AMD-V技術。

一般在BIOS中,VT的選項通過“Advanced →Processor Configuration”來檢視和設定,它的辨別通常為“Intel(R) Virtualization Technology”或“Intel VT”等類似的文字說明。

除了支援必需的處理器虛拟化擴充以外,如果伺服器晶片還支援VT-d,就建議在BIOS中将其打開,因為後面一些相對進階的裝置的直接配置設定功能會需要硬體VT-d技術的支援。VT-d(Virtualization Technology for Directed I/O)是對裝置I/O的虛拟化硬體支援,在BIOS中的位置可能為“Advanced→Processor Configuration”或“Advanced→System Agent (SA) Configuration”,它一般在BIOS中的标志一般為“Intel(R) VTfor Directed I/O”或“Intel VT-d”等。

下面以一台Intel Romley-EP平台的伺服器為例來說明在BIOS中的設定。

1)BIOS中的Advanced選項,如圖3-1所示。

Linux -- 建構KVM虛拟化環境

2)BIOS中的VT和VT-d選項,如圖3-2所示。

Linux -- 建構KVM虛拟化環境

對于不同平台或不同廠商的BIOS,VT和VT-d等設定的位置可能是不一樣的,需要根據實際的硬體情況和BIOS中的選項來靈活設定。

設定好了VT和VT-d的相關選項,儲存BIOS的設定并退出,系統重新開機後生效。在Linux系統中,可以通過檢查/proc/cpuinfo檔案中的CPU特性标志(flags)來檢視CPU目前是否支援硬體虛拟化。在x86和x86-64平台中,Intel系列CPU支援虛拟化的标志為“vmx”,AMD系列CPU的标志為“svm”,是以可以用如下指令行檢視“vmx”或者“svm”标志。

[root@jay-linux ~]# grep -E '(vmx|svm)' /proc/cpuinfo  

flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge  

mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall  

nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl  

xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl  

vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt  

tsc_deadline_timer aes xsave avx lahf_lm ida arat epb xsaveopt pln pts  

dts tpr_shadow vnmi flexpriority ept vpid  

<!-–此處省略多行其餘CPU或core的flags輸出資訊 --> 

2. 主控端(Host)作業系統的安裝

KVM是基于核心的虛拟化技術,要運作KVM虛拟化環境,安裝一個Linux作業系統的主控端(Host)是必需的。

KVM作為流行的開源虛拟機之一,它可以在絕大多數流行的Linux系統上編譯和運作,是以依然可以選擇RHEL之外的其他Linux發行版,CentOS、Fedora、Ubuntu、Debian、OpenSuse等系統都是不錯的選擇。

普通Linux安裝的基本過程這裡就不再較長的描述,這裡主要說明安裝過程中一些值得注意的地方。

在選擇哪種類型的伺服器時,選擇“Software Development Workstation”即可(如圖3-3所示),然後選中目前頁面的“Customize now”,單擊“Next”按鈕進入下一步去選擇具體需要安裝的元件并設定所需要的各個RPM包。

在選擇了“Software Development Workstation”之後,在選擇具體元件的界面就可以看到預設已經選擇了很多的元件(如圖3-4所示),這裡主要需要檢查一下Development這個選項中預設已經勾選了的很多的開發元件。其中,最好選中Development選項中的Development tools和Additional Development這兩個元件,因為在本書的KVM編譯過程中以及其他實驗中可能會用到,其中包括一些比較重要的軟體包,比如:gcc、git、make等(一般被預設選中)。

3. KVM的編譯與安裝 (重要)

  下載下傳KVM源代碼

KVM作為Linux kernel中的一個module而存在,是從Linux2.6.20版本開始被完全正式加入到核心的主幹開發和正式釋出代碼中。是以,隻需要下載下傳2.6.20版本之後Linux kernel代碼即可編譯和使用KVM。當然,如果是學習KVM,推薦使用最新正式釋出或者正在開發中的kernel版本,如果是實際部署到生産環境中,還需要自己選擇适合的穩定版本進行詳盡的功能和性能測試。如果你想使用最新的處于開發中的KVM代碼,你需要自己下載下傳KVM的代碼倉庫,本節就是以此為例來講解的。

總的來說,下載下傳最新KVM源代碼,主要有如下三種方式:

下載下傳KVM項目開發中的代碼倉庫kvm.git。

下載下傳Linux核心的代碼倉庫linux.git。

打包下載下傳Linux核心的源代碼(Tarball[3]格式)。

3.1. 下載下傳kvm.git

KVM項目的代碼是托管在Linux核心官方源碼網站http://git.kernel.org上的,可以到上面去檢視和下載下傳。該網頁上virt/kvm/kvm.git即是KVM項目的代碼,它是最新的功能最豐富的KVM源代碼庫(盡管并非最穩定的)。目前,kvm.git的最主要維護者(maintainer)是來自Redhat公司的Gleb Natapov和PaoloBonzini。從http://git.kernel.org/?p=virt/kvm/kvm.git網頁可以看到,kvm.git下載下傳連結有如下3個URL,可用于下載下傳最新的KVM的開發代碼倉庫。

從這3個URL下載下傳的内容完全一緻,根據自己實際情況選擇其中任一個下載下傳即可。Linux核心相關的項目一般都使用Git[4]作為源代碼管理工具,KVM當然也是用Git管理源碼的。可以使用git clone指令來下載下傳KVM的源代碼,也可以使用Git工具的其他指令對源碼進行各種管理,這裡不詳述Git的各種指令。

kvm.git的下載下傳方式和過程,為如下指令行所示:

3.2. 下載下傳linux.git

Linux核心的官方網站為http://kernel.org,其中源代碼管理網為http://git.kernel.org,可以在此網站上找到最新的linux.git代碼。在源碼管理網站上,我們看到有多個linux.git,我們選擇Linus Torvalds[5]的源碼庫(也即是Linux核心的主幹)。在核心源碼的網頁http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git中可以看到,其源碼倉庫也有如下3個連結可用:

這3個URL中源碼内容是完全相同的,可以用用git clone指令複制到本地,其具體操作方式與前一種(kvm.git)的下載下傳方式完全一樣。

3.3. 下載下傳Linux的Tarball

在Linux官方網站(http://kernel.org/)上,也提供Linux核心的Tarball檔案下載下傳;除了在其首頁上單擊一些Tarball之外,也可以到如下網址下載下傳Linux核心的各個版本的Tarball。

kernel.org還提供一種rsync的方式下載下傳,此處不詳細叙述,請參見其官網首頁的提示。

以用wget下載下傳linux-3.4.1.tar.gz為例,有如下的指令行代碼:

3.4. 通過kernel.org的鏡像站點下載下傳

由于Linux的源代碼量比較大,如果隻有美國一個站點可供下載下傳,那麼速度會較慢,伺服器壓力也較大。是以,kernel.org在世界上多個國家和地區都有一些鏡像站點,而且一些Linux開源社群的愛好者們也自發建立了不少kernel.org的鏡像,在中國的鏡像站點中,推薦大家從如下兩個鏡像站點下載下傳Linux相關的代碼及其他源碼(在本書寫作之時,它們并沒有提供git形式的代碼倉庫kvm.git或linux.git的下載下傳),通路速度比較快。

一個是清華大學開源鏡像站:http://mirror.tuna.tsinghua.edu.cn/,其中的連結位址http://mirror.tuna.tsinghua.edu.cn/kernel/linux/kernel/與http://www.kernel.org/pub/linux/kernel/就是同步的,用起來比較友善。

另外一個是北京交通大學的一個開源鏡像站:

還有如下兩個鏡像站可以推薦給大家:

網易開源鏡像站,http://mirrors.163.com/

搜狐開源鏡像站,http://mirrors.sohu.com/

(在本書寫作之時,網易和搜狐的兩個鏡像站主要提供了一些Linux發行版的ISO及其軟體倉庫,而沒有提供linux kernel的×××。)

配置KVM

上面三種方式下載下傳的源代碼都是可以同樣地進行配置和編譯,本章以開發中的最新源代碼倉庫kvm.git來講解KVM的配置和編譯等。KVM是作為Linux核心中的一個module存在的,而kvm.git是一個包含了最新的KVM子產品開發中代碼完整的Linux核心源碼倉庫。它的配置方式,與普通的Linux核心配置完全一樣,隻是需要注意将KVM相關的配置選擇為編譯進核心或者編譯為子產品。

在kvm.git(Linux kernel)代碼目錄下,運作“make help”指令可以得到一些關于如何配置和編譯kernel的幫助手冊,指令行如下:

對KVM或Linux核心配置時常用的配置指令的一些解釋如下:

(1)make config

基于文本的最為傳統的也是最為枯燥的一種配置方式,但是它可以适用于任何情況之下,這種方式會為每一個核心支援的特性向使用者提問,如果使用者回答“y”,則把特性編譯進核心;回答“m”,則該特性作為子產品進行編譯;回答“n”,則表示不對該特性提供支援。輸入“?”則顯示該特性的幫助資訊,在了解之後再決定處理該特性的方式;在回答每個問題前,必須考慮清楚,如果在配置過程中因為失誤而給了錯誤的回答,就隻能按“ctrl+c”強行退出然後重新配置了。

(2)make oldconfig

make oldconfig和make config類似,但是它的作用是在現有的核心設定檔案基礎上建立一個新的設定檔案,隻會向使用者提供有關新核心特性的問題,在新核心更新的過程中,make oldconfig非常有用,使用者将現有的配置檔案.config複制到新核心的源碼中,執行make oldconfig,此時,使用者隻需要回答那些針對新增特性的問題。

(3)make silentoldconfig

和上面make oldconfig一樣,但在螢幕上不再出現已在.config中配置好的選項。

(4)make menuconfig

基于終端的一種配置方式,提供了文本模式的圖形使用者界面,使用者可以通過光标移動來浏覽所支援的各種特性。使用這用配置方式時,系統中必須安裝有ncurses庫,否則會顯示“Unable to find the ncurses libraries”的錯誤提示。其中“y”、“n”、“m”、“?”鍵的選擇功能與前面make config中介紹的一緻。

(5)make xconfig

基于XWindow的一種配置方式,提供了漂亮的配置視窗,不過隻有能夠在X Server上運作X桌面應用程式時才能夠使用,它依賴于QT,如果系統中沒有安裝QT庫,則會出現“Unable to find any QT installation”的錯誤提示。

(6)make gconfig

與make xconfig類似,不同的是make gconfig依賴于GTK庫。

(7)make defconfig

按照核心代碼中提供的預設配置檔案對核心進行配置(在Intel x86_64平台上,預設配置為arch/x86/configs/x86_64_defconfig),生成.config檔案可以用作初始化配置,然後再使用make menuconfig進行定制化配置。

(8)make allyesconfig

盡可能多地使用“y”設定核心選項值,生成的配置中包含了全部的核心特性。

(9)make allnoconfig

除必須的選項外,其他選項一律不選 (常用于嵌入式Linux系統的編譯)。

(10)make allmodconfig

盡可能多地使用“m”設定核心選項值來生成配置檔案。

(11)make localmodconfig

會執行 lsmod 指令檢視目前系統中加載了哪些子產品 (Modules),并将原來的.config中不需要的子產品去掉,僅保留前面 lsmod 指令查出來的這些子產品,進而簡化了核心的配置過程。這樣做确實友善了很多,但是也有個缺點:該方法僅能使編譯出的核心支援目前核心已經加載的子產品。因為該方法使用的是 lsmod 查詢得到的結果,如果有的子產品目前沒有加載,那麼就不會編到新的核心中。

下面以make menuconfig為例介紹一下如何選擇KVM相關的配置。運作make menuconfig後顯示的界面如圖3-6所示。

Linux -- 建構KVM虛拟化環境

選擇了Virtualization之後,進入其中進行詳細配置,包括選中KVM、選中對處理器的支援(比如:KVM for Intel processors support,KVM for AMD processors support)等,如圖3-7所示。

在配置完成之後,就會在kvm.git的目錄下面生成一個.config檔案,最好檢查一下KVM相關的配置是否正确。在本次配置中,與KVM直接相關的幾個配置項的主要情況如下:

Linux -- 建構KVM虛拟化環境

編譯KVM

在對KVM源代碼進行了配置之後,編譯KVM就是一件比較容易的事情了。它的編譯過程就完全是一個普通Linux核心編譯的過程,需要經過編譯kernel、編譯bzImage和編譯module等三個步驟。編譯bzImage這一步不是必須的,在本章示例中,config中使用了initramfs,是以這裡需要這個bzImage用于生成initramfs p_w_picpath。另外,在最新的Linux kernel代碼中,根據Makefile中的定義可以看出,直接執行“make”或“make all”指令就可以将這裡提及的3個步驟全部包括在内。本節是為了更好地展示編譯的過程,才将編譯的步驟分為這三步來來解釋。

第一步,編譯kernel的指令為“make vmlinux ”,其編譯指令和輸出如下:

其中,編譯指令中“-j”參數并非必須的,它是讓make工具用多程序來編譯,比如上面指令中提到的“-j 20”,會讓make工具最多建立20個GCC程序同時來執行編譯任務。在一個比較空閑的系統上面,有一個推薦值作為-j參數的值,即大約為2倍于系統上的CPU的core的數量(CPU超線程也算core)。

第二步,執行編譯bzImage的指令“make bzImage”,其輸出如下:

第三步,編譯kernel和bzImage之後編譯核心的子產品,指令為“make modules”,其指令行輸出如下:

安裝KVM

編譯完KVM之後,下面介紹如何安裝KVM。

KVM的安裝包括兩個步驟:module的安裝、kernel與initramfs的安裝。

(1)安裝module

通過“make modules_install”指令可以将編譯好的module安裝到相應的目錄之中,在預設情況下module被安裝到/lib/modules/$kernel_version/kernel目錄之中。

安裝好module之後,可以檢視一下相應的安裝路徑,可看到kvm子產品也已經安裝,如下所示:

(2)安裝kernel和initramfs

通過“make install”指令可以安裝kernel和initramfs,指令行輸出如下:

可見,在/boot目錄下生成了核心(vmlinuz)和initramfs等核心啟動所需的檔案。

在運作make install之後,grub配置檔案(如:/boot/grub/grub.conf)中也自動添加了一個grub選項,如下所示:

檢查了grub之後,重新啟動系統,選擇剛才為了KVM而編譯、安裝的核心啟動。

系統啟動後,登入進入系統,在通常情況下,系統啟動時預設已經加載了kvm和kvm_intel這兩個子產品;如果沒有加載,請手動用modprobe指令依次加載kvm和kvm_intel子產品。

确認KVM相關的子產品加載成功後,檢查/dev/kvm這個檔案,它是kvm核心子產品提供給使用者空間的qemu-kvm程式使用的一個控制接口,它提供了客戶機(Guest)作業系統運作所需要的模拟和實際的硬體裝置環境。

4. qemu-kvm的編譯與安裝 (重要)

除了在核心空間的kvm子產品之外,在使用者空間需要QEMU[6]來模拟所需要CPU和裝置模型以及用于啟動客戶機程序,這樣才有了一個完整的KVM運作環境。而qemu-kvm是為了針對KVM專門做了修改和優化的QEMU分支[7],在本書寫作的2012年,qemu-kvm分支裡面的小部分特性還沒有完全合并進入到qemu的主幹代碼之中,是以本書中采用qemu-kvm來講解。

下載下傳qemu-kvm源代碼

目前的QEMU項目針對KVM的代碼分支qemu-kvm也是由Redhat公司的Gleb Natapov和Paolo Bonzini作維護者(Maintainer),代碼也是托管在kernel.org上。

qemu-kvm開發代碼倉庫的網頁連接配接為:http://git.kernel.org/?p=virt/kvm/qemu-kvm.git

其中,可以看到有如下3個URL連接配接可供下載下傳開發中的最新qemu-kvm的代碼倉庫。

可以根據自己實際需要選擇3個中任一個用git clone指令下載下傳即可,它們是完全一樣的。

另外,可以到sourceforge.net的如下連結中根據需要下載下傳qemu-kvm各個釋出版本的代碼壓縮包(筆者建議使用最新的正式釋出版本,因為它的功能更多,同時也比較穩定):

在本節後面講解編譯時,是以下載下傳開發中的最新的qemu-kvm.git為例的,擷取其代碼倉庫過程如下:

配置和編譯qemu-kvm

qemu-kvm的配置并不複雜,在通常情況下,可以直接運作代碼倉庫中configure檔案進行配置即可。當然,如果對其配置并不熟悉,可以運作“./configure --help”指令檢視配置的一些選項及其幫助資訊。

顯示配置的幫助手冊資訊如下:

執行configure檔案進行配置的過程如下:

需要注意的是,上面指令行輸出的KVM相關的選項需要是配置為yes,另外,一般VNC的支援也是配置為yes的(因為通常需要用VNC連接配接到客戶機中)。

經過配置之後,進行編譯就很簡單了,直接執行make即可進行編譯,如下所示:

可以看到,最後有編譯生成qemu-system-x86_64檔案,它就是我們常用的qemu-kvm的指令行工具(在多數Linux發行版中自帶的qemu-kvm軟體包的指令行是qemu-kvm,隻是名字不同而已)。

安裝qemu-kvm

編譯完成之後,運作“make install”指令即可安裝qemu-kvm,其過程如下:

qemu-kvm安裝過程的主要任務有這幾個:建立qemu的一些目錄,複制一些配置檔案到相應的目錄下,複制一些firmware檔案(如:sgabios.bin, kvmvapic.bin)到目錄下以便qemu-kvm的指令行啟動時可以找到對應的固件提供給客戶機使用,複制keymaps到相應的目錄下以便在客戶機中支援各種所需鍵盤類型,複制qemu-system-x86_64、qemu-img等可執行程式到對應的目錄下。下面的一些指令行檢查了qemu-kvm被安裝了之後的系統狀态。

由于qemu-kvm是使用者空間的程式,安裝之後不用重新開機系統,直接用qemu-system-x86_64、qemu-img這樣的指令行工具即可使用qemu-kvm了。

5.客戶機(Guest)的安裝

安裝客戶機(Guest)之前,我們需要建立一個鏡像檔案或者磁盤分區等來存儲客戶機中的系統和檔案,關于客戶機鏡像有很多種的制作和存儲方式(将在後面的第4章中進行詳細的介紹),本節隻是為了快速地示範安裝一個客戶機,采用了本地建立一個鏡像檔案,然後讓鏡像檔案作為客戶機的硬碟,将客戶機作業系統(以RHEL6.3為例)安裝在其中。

首先,需要建立一個鏡像檔案,可以使用dd工具,如下的指令行建立了一個8GB大小的鏡像檔案rhel6u3.img:

然後,準備一個RHEL6.3安裝所需的ISO檔案,如下所示:

啟動客戶機,并在其中用準備好的ISO安裝系統,指令行如下:

其中,-m 2048是給客戶機配置設定2048MB記憶體,-smp 4是給客戶機配置設定4個CPU,-boot order=cd是指定系統的啟動順序為光驅(c: CD-ROM)、硬碟(d:hard Disk),-hda **是配置設定給客戶機的IDE硬碟(即前面準備的鏡像檔案),-cdrom **是配置設定客戶機的光驅。在預設情況下,QEMU會啟動一個VNC server端口(如上面的::1:5900),可以用vncviewer[8]工具來連接配接到QEMU的VNC端口檢視客戶機。

通過啟動時的提示,這裡可以使用“vncviewer :5900”指令連接配接到QEMU啟動的視窗。根據指令行制定的啟動順序,當有CDROM時,客戶機預設會從光驅引導,啟動後即可進入到客戶機系統安裝界面如圖3-8所示。

Linux -- 建構KVM虛拟化環境

可以選擇Install安裝客戶機作業系統,和安裝普通Linux系統類似,根據需要做磁盤分區、選擇需要的軟體包等,安裝過程中的一個快照如圖3-9所示。

Linux -- 建構KVM虛拟化環境

在系統安裝完成後,客戶機中安裝程式提示,如圖3-10所示。

Linux -- 建構KVM虛拟化環境

和安裝普通的Linux系統一樣,完成安裝後,重新開機系統即可進入到剛才安裝的客戶機作業系統。

6.啟動屬于你的第一個KVM客戶機

在安裝好了系統之後,就可以使用鏡像檔案來啟動并登入到自己安裝的系統之中了。通過如下的指令行即可啟動一個KVM的客戶機。

用vncviewer指令(此處指令為vncviewer :5900)檢視客戶機的啟動情況,客戶機啟動過程中的狀态,如圖3-11所示。

客戶機啟動完成後的登入界面如圖3-12所示。

在通過VNC連結到QEMU視窗後,可以按快捷鍵“Ctrl+Alt+2”切換到QEMU螢幕視窗,在螢幕視窗中可以執行一些指令,比如執行“info kvm”指令來檢視目前QEMU是否使用着KVM,如圖3-13所示(顯示為kvm support: enabled)。

Linux -- 建構KVM虛拟化環境

用快捷鍵“Ctrl+Alt+1”切換回普通的客戶機檢視視窗,就可以登入或繼續使用客戶機系統了。至此,你就已經啟動了屬于自己的第一個KVM客戶機,盡情享受KVM虛拟化帶來的快樂吧!

備注:

編譯kvm和qemu-kvm是掌握KVM必須的最基礎也是不可或缺的技能。其中的配置和編譯kvm(或Linux kernel)是最複雜也是非常重要的環節,了解這環節對Linux kernel相關技術(包括KVM)的學習具有非常重要的價值。

參考: http://book.51cto.com/art/201311/416155.htm 

繼續閱讀