2011年5月1日 星期日

Linux 核心虛擬技術 - KVM(Kernel-based Virtual Machine)

KVM, 全名為 Kernel-based Virtual Machine ,自 2006 年 12 月起,就屬於 Linux 核心架構下的一部分,簡單來說,就是以後 Linux 系統核心,就具備支援虛擬化的功能,並且是以核心模組化的方式載入執行,只要硬體搭配得宜(此指 CPU 支援虛擬化技術,也就是 lntel VT 或 AMD-V ),再安裝 KVM 這一套虛擬系統,就可以直接在現有的 Linux 系統架構之下,建構裸機式( Bare-Metal )虛擬系統平台。

所以,首先,我們必須知道手上的電腦 / 伺服器的 CPU 是否可執行 KVM,也就是是否支援 lntel VT 或 AMD-V ,不過,如果沒有 CPU 的相關資訊(如型號或是說明文件),該如何知道 CPU 有沒有 lntel VT 或 AMD-V 呢?有以下幾種方式可以知道:

# 備註1:這邊所謂的〝可否執行 KVM〞,並不代表,若 CPU 不支援 Intel VT 或 AMD-V 就不可以使用 KVM,這邊指的是有沒有核心模組可以來釋放 KVM 全部的效能,若 CPU 不支援虛擬化技術,還是可以安裝與使用 KVM,不過,這時實際在運作的,就不是 KVM 了,而是 QEMU。


開始檢查

方法一:若電腦 / 伺服器已經安裝 Linux 系統,在此以 Ubuntu 10.04 LTS 版本為例,只要開啟終端機,直接輸入以下指令:

$ kvm-ok

按下 Enter 鍵之後,若看到〝INFO: Your CPU supports KVM extensions〞的字串,這就表示 CPU 支援虛擬化技術。

# 備註2:若系統為 RedHat 或是 CentOS ,必須注意 SELinux 是開啟的狀態,否則之後一些動作(vitr-install)將不會正常運作,請利用〝system-config-securitylevel〞指令來確認 SELinux 的狀態,確認之後,將指令置換為〝egrep '(vmx | svm)' --color=always /proc/cpuinfo〞,或簡單一點〝egrep '(vmx | svm)' /proc/cpuinfo〞,來查看 CPU 相關訊息,如果什麼資訊都沒有,那就表示此電腦的 CPU 不支援虛擬化技術了。

方法二:取得 Ubuntu LiveCD ,以此光碟開機,進入系統之後,再由終端機輸入〝kvm-ok〞,就可以得知 CPU 是否支援虛擬化技術。

# 備註3:再次強調,若 CPU 沒有支援虛擬化技術, 還是可以安裝 KVM 套件, 只是系統會以 QEMU 來執行虛擬主機 (速度很慢)。

方法三:直接上 CPU 硬體廠商的官方網站,查詢 CPU 相關訊息即可得知。

# 備註4: Intel:http://www.intel.com/products/processor_number/
AMD:http://www.amd.com/tw/products/Pages/processors.aspx


安裝 Linux KVM

確認 CPU 是否支援虛擬化技術之後,接著就是要安裝 KVM 套件,請開啟終端機並輸入:

$ sudo apt-get install kvm

(按下 enter 鍵之後,若系統提示需要輸入密碼,請輸入管理者密碼,系統提示是否安裝套件時,請輸入〝y〞)

而 KVM 相關的安裝套件所下圖所示:


不過,一股腦的裝了一堆套件之後,怎知道 KVM 是否有在運作?其實,只要輸入以下指令,就可以知道了:

$ lsmod | grep kvm

只要看到以下的輸出結果,就可以確認 KVM 有正常在運作:

kvm_intel 44896 2
kvm 159656 1 kvm_intel

# 備註5:〝kvm_intel〞,表示 CPU 的廠商為 Intel ,若是 AMD ,則會顯示〝kvm_amd〞

還記得,前面有提到,KVM 是以模組化的方式,讓系統核心可以執行虛擬化,那到底是哪些模組呢?讓我們關心一下吧;在終端機輸入以下指令:

$ modprobe -l | grep kvm

按下 Enter 鍵之後,畫面會顯示以下訊息:

kernel/arch/x86/kvm/kvm.ko
kernel/arch/x86/kvm/kvm-intel.ko
kernel/arch/x86/kvm/kvm-amd.ko

沒錯,這三個 .ko 的檔案,就是 KVM 相關的核心模組。

# 備註6:筆者在撰寫此文章時,所接觸的 Linux 核心版本為 2.6.28 ~ 2.6.32 ,由於 KVM 是 Linux 核心支援的原生虛擬化技術,所以上述所查看到的三個 .ko 的檔案,並非因為安裝 kvm 之後才一併安裝近來的模組,而是一開始就存在於系統之內的核心模組!

KVM 安裝完成之後,與一般虛擬系統(如 VMware )最大的不同,在於套件本身並沒有包含 GUI 套件,也就是沒有視窗介面的操作環境,必須完全在終端機下,以指令與相關參數的配合,來建置與運行虛擬電腦,我想,看到這段說明,大概會使得許多人對於 KVM 退避三舍吧,但別擔心,自由軟體的好處,就是擁有無限的可能性,原生套件所沒有的東西,在許多人的努力之下,總是會慢慢成形的,也就是說, KVM 還是有相關的 GUI 套件可以安裝使用。不過,GUI 介面的相關操作,背後還是憑藉相關指令與參數的組合,來達到虛擬電腦的創建與操作,所以在使用 GUI 套件之前,還是先來熟悉一下指令的操作與參數的運用吧。

既然,需要使用指令來操作虛擬電腦的建立與運作,那 KVM 到底提供了哪些指令呢?用以下的指令,就可以查詢到 KVM 的相關操作指令:

$ ls -la / usr/bin | grep kvm

查詢之後的結果如下圖:


而這六個指令,就是之後操作 KVM 所會用的到的相關操作指令了。


你的第一個虛擬電腦

基本上,要建立一個虛擬電腦,有以下的基本順序:

第一,要分割(建立)一個硬碟空間來安裝作業系統,不過,在虛擬環境下,所謂的硬碟空間,其實只是一個檔案,安裝的作業系統與所有的資料,都存在這一個檔案裡面。

第二、以光碟開機,安裝作業系統,當然,也可以用掛載映像檔(ISO 檔案)的方式,來安裝。

第三、安裝完成,啟動作業系統,開始使用虛擬電腦。

這看起來似乎很簡單,沒錯,就是這麼簡單,要架構一個基本的虛擬電腦,差不多三個步驟就可以完成,只是需要在終端機下,以指令的方式來完成上述的三大步驟,不過別擔心,照著以下的步驟,就會發現,其實,使用基本的 KVM ,並沒有很困難。

建立硬碟檔案(或硬碟映像檔)

回到終端機畫面,在游標提示列輸入以下指令:

$ kvm-img create -f qcow2 us1042.qcow 4G
  • kvm-img:KVM 建立硬碟檔案的指令
  • create:建立的參數
  • -f qcow2 :指定硬碟檔案的格式(以此為例, qcow2 為 QEMU 第二版的檔案格式,且是採用〝隨需擴增〞的模式)
  • us1042.qcow:硬碟檔案名稱,其中,〝.qcow〞的副檔名,只是方便辨識,也可以任意設定
  • 4G:指定硬碟檔案的大小,這樣設定,表示最終硬碟檔案的大小最大只到 4G,且預設採用的是動態增加使用空間,直到 4G ,而不是一次劃分出 4G 來使用。

按下 Enter 鍵之後,若看到以下回應訊息,則代表硬碟檔案建立成功:

Formatting 'factory.img', fmt=qcow2 size=4294967296 encryption=off cluster_size=0

安裝作業系統

接著就要在虛擬電腦內安裝作業系統了,接著輸入以下指令:

$ kvm -m 512 -localtime -hda us1042.qcow -cdrom ubuntu-10.04-desktop-i386.iso -boot d
  • kvm:執行 KVM
  • -m 512 :指定虛擬電腦的記憶體為 512 MB
  • -localtime:指定以實體電腦的時間為虛擬電腦的時間
  • -hda us1042.qcow:指定硬碟檔案,也就是前一步驟所建立的檔案,若檔案不在當前的執行目錄內,記得要給完整的檔案所在路徑。
  • -cdrom ubuntu-10.04.2-desktop-i386.iso:指定要安裝的光碟(或映像檔)
  • -boot d :指定以光碟開機

按下 Enter 鍵之後,就會看到跳出一個黑色視窗,不一會就會進入作業系統的安裝畫面,接著按照此作業系統的安裝步驟,一部一部的依序設定安裝,就可以啦~

大 部分的作業系統,安裝完成之後,都會要求重新開機,所安裝的虛擬電腦也不例外,不過,重新開機之後,大家應該都會傻眼,重新開機之後的視窗,怎會顯示找不 到開機檔案呢?剛剛不是才把作業系統安裝完成嗎?怎麼馬上就不能使用呢?別擔心,讓我們回想一下,剛剛在虛擬電腦內安裝作業系統時,不是指定以光碟開機 嗎?重新開機之後,光碟檔案就卸載,沒有了光碟,當然開不了機,虛擬電腦也就會跟使用者反應,無法開機嘛~

啟動虛擬電腦

讓我們先關掉虛擬電腦的運作視窗,再回到終端機畫面,並輸入以下指令:

$ kvm -m 512 -localtime -hda us1042.qcow -boot c
  • -boot c:指定硬碟(硬碟檔案)開機

再按下 enter 鍵之後,虛擬電腦的運作視窗會重新開啟,就會發現,已經可以正常開啟,並登入剛剛安裝好的虛擬電腦了~


KVM 運作架構

操作了一堆指令,雖然已經學會利用 KVM 的相關指令,來架構與安裝虛擬電腦,不過,到底 KVM 是怎樣運作的呢?由以下的架構圖,可以略窺一二:


先簡單說明一下圖中相關名稱的意思:
  • Hardware:這邊指的是實體電腦的硬體架構, CPU 有支援虛擬化技術( Inter VT-x or AMD V Pacifica )
  • OS / VM:代表虛擬電腦
  • Memory & CPU Paravirtualized(橘線): 這邊,主要要強調,由於 KVM 的虛擬化技術是 Linux 核心所支援的,所以虛擬電腦的 CPU 核心指令與記憶體的使用,可以直接通透到實體電腦的 CPU 之內,並直接進行解析與動作,不需要再透過一個轉譯的動作來傳達虛擬電腦與實體電腦之間的 CPU 核心命令
  • Emulated Storage & Network(紅線、 QEMU ):這邊指的是虛擬電腦的週邊裝置,如硬碟、網路卡、顯示卡等,都是透過 QEMU 來模擬並與實體電腦進行溝通


所 以由上圖所示,可以得知 KVM 內的虛擬電腦,主要有兩大部分,第一是 CPU 與記憶體的運作,第二則是週邊裝置的連結,其中 CPU 與記憶體的部份,因為 Linux 的核心支援虛擬化技術,所以虛擬電腦 CPU 的核心指令,可以直接進入實體 CPU 來進行運作,以提高運算效能與速度,而另一的重要的環節,就是 QEMU,也就是控制所有週邊裝置的套件。

QEMU 本身就是一套虛擬系統,也可以獨力建立與安裝虛擬電腦,而 KVM ,就是以 QEMU 為基礎,搭配 CPU 虛擬化技術而創建的虛擬系統,而最初利用指令所安裝的 KVM 套件 ,實際上安裝的是 qemu-kvm ,兩者差別在於,當使用 kvm 指令來操作時,若 CPU 有支援虛擬化技術時,用的是 kvm ,反之則是 qemu。

回 頭看看操作步驟,以 KVM 來建立虛擬電腦,似乎很簡單,也好像有這麼一回事,不過,若是仔細回頭想想,似乎少了些什麼,譬如,網路卡與網路組態的設定,而在前述的指令中,好像也沒 有看到與網路相關設定的參數,沒錯,上述的三大步驟,只是建立虛擬電腦的基本動作,若要讓整個虛擬電腦運作更完善,則需要更多的參數來輔助,尤其是網路架 構, KVM 的運作模式有別於一般的虛擬系統,有點特別,不過,就目前單一虛擬電腦來說,是可以對外連線上網的,至於原理與設定步驟,這就留到下一章節再來討論吧~

4 則留言:

  1. 请教,如何为每一个kvm 的 domainU 设置 CPU frequency?

    回覆刪除
  2. kvm-ok沒過
    然後lsmod | grep kvm
    跑不出東西

    不支援就無法了嗎?

    回覆刪除
  3. fmt=qcow2 size=4294967296 encryption=off cluster_size=0
    我是
    fmt=qcow2 size=4294967296 encryption=off cluster_size=65536
    ???

    回覆刪除
  4. 不好意思,建立硬碟檔案應該是用qemu-img,我沒有找到kvm-img這個指令

    回覆刪除