本文轉自ibm,參考:http://www.ibm.com/developerworks/cn/linux/l-linux-kvm/index.html#n100b0
虛拟化 概念很早就已出現。簡單來說,虛拟化就是使用某些程式,并使其看起來類似于其他程式的過程。将這個概念應用到計算機系統中可以讓不同使用者看到不同的單個系統(例如,一台計算機可以同時運作 linux 和 microsoft® windows®)。這通常稱為全虛拟化(full virtualization)。
虛拟化也可以使用更加複雜的格式,其中單個計算機看上去具有多個架構(對于一個使用者來說,它是一個标準的 x86 平台;對于另外一個使用者來說,它是 ibm power pc® 平台)。這種虛拟化形式通常被稱為 硬體仿真。
最後,更加簡單的一種虛拟化是作業系統虛拟化,其中一台計算機可以運作相同類型的多個作業系統。這種虛拟化可以将一個作業系統的多個伺服器隔離開來(這意味着全都必須使用相同類型和版本的作業系統)。
虛拟化最常使用的兩種方法是全虛拟化 和準虛拟化。使用全虛拟化,在虛拟化的作業系統和硬體之間存在一個層,用于決定通路。這個層稱為系統管理程式 或虛拟機螢幕(vmm)。準虛拟化與之類似,但是系統管理程式會以一種更具協作性的方式進行操作。這是因為每個客戶作業系統都了解自己正在虛拟化模式中運作,是以每個系統都與系統管理程式協作,來實作底層硬體的虛拟化。
全虛拟化的例子包括商業虛拟化解決方案 vmware,以及商業 ibm zseries® 計算機上使用的 ibm system z9 virtual machine(z/vm)作業系統。準虛拟化的例子有 xen 和 user-mode-linux (uml)。 kvm 也被認為是一個全虛拟化解決方案,不過我們稍後再介紹這個問題。

系統管理程式之上是客戶機作業系統,也稱為虛拟機(vm)。這些 vm 都是一些互相隔離的作業系統,将底層硬體平台視為自己所有。但是實際上,是系統管理程式為它們制造了這種假象。
<a></a>
目前使用虛拟化解決方案的問題是,并非所有硬體都可以很好地支援虛拟化。較老的 x86 處理器根據執行範圍對特定指令會産生不同結果。這就産生了一個問題,因為系統管理程式應該隻能在一個最受保護的範圍中執行。由于這個原因,諸如 vmware 之類的虛拟化解決方案會提前掃描要執行的代碼,進而将這些指令替換為一些陷阱指令(trap instruction),這樣系統管理程式就可以正确地處理它們。xen 可以支援一種協作的虛拟化方法,它不需要任何修改,因為客戶機知道自己正在進行虛拟化,并已經進行了修改。kvm 會簡單地忽略這個問題,如果您希望進行虛拟化,就強制必須在更新的硬體上運作。
考慮到虛拟化技術的發展時間并不長,kvm 實際上還是一種相對來說比較新的技術。目前存在各具功能的開源技術,例如 xen、bochs、uml、linux-vserver 和 colinux,但是 kvm 目前正在被大量使用。另外,kvm 不再僅僅是一個全虛拟化解決方案,而将成為更大的解決方案的一部分。
kvm 所使用的方法是通過簡單地加載核心子產品而将 linux 核心轉換為一個系統管理程式。這個核心子產品導出了一個名為 /dev/kvm 的裝置,它可以啟用核心的客戶模式(除了傳統的核心模式和使用者模式)。有了 /dev/kvm 裝置,vm 使自己的位址空間獨立于核心或運作着的任何其他 vm 的位址空間。裝置樹(/dev)中的裝置對于所有使用者空間程序來說都是通用的。但是每個打開 /dev/kvm 的程序看到的是不同的映射(為了支援 vm 間的隔離)。
您可以在 ./linux/drivers/kvm(v2.6.20 及更新版本)中找到 kvm 的源代碼。這個目錄包含了 kvm 的源檔案,以及對于 intel 和 amd 擴充的處理器支援檔案。
kvm 然後會簡單地将 linux 核心轉換成一個系統管理程式(在安裝 kvm 核心子產品時)。由于标準 linux 核心就是一個系統管理程式,是以它會從對标準核心的修改中獲益良多(記憶體支援、排程程式等)。對這些 linux 元件進行優化(例如 2.6 版本核心中的新 o(1) 排程程式)都可以讓系統管理程式(主機作業系統)和 linux 客戶作業系統同時受益。但是 kvm 并不是第一個這樣做的程式。uml 很久以前就将 linux 核心轉換成一個系統管理程式了。使用核心作為一個系統管理程式,您就可以啟動其他作業系統,例如另一個 linux 核心或 windows 系統。
記住 kvm 隻是虛拟化解決方案的一部分。處理器直接提供了虛拟化支援(可以為多個作業系統虛拟化處理器)。記憶體可以通過 kvm 進行虛拟化(這在下一節中将會讨論)。最後,i/o 通過一個稍加修改的 qemu 程序(執行每個客戶作業系統程序的一個拷貝)進行虛拟化。
kvm 向 linux 中引入了一種除現有的核心和使用者模式之外的新程序模式。這種新模式就稱為客戶 模式,顧名思義,它用來執行客戶作業系統代碼(至少是一部分代碼)。回想一下核心模式表示代碼執行的特權模式,而使用者模式則表示非特權模式(用于那些運作 在核心之外的程式)。根據運作内容和目的,執行模式可以針對不同的目的進行定義。客戶模式的存在就是為了執行客戶作業系統代碼,但是隻針對那些非 i/o 的代碼。在客戶模式中有兩種标準模式,是以客戶作業系統在客戶模式中運作可以支援标準的核心,而在使用者模式下運作則支援自己的核心和使用者 空間應用程式。客戶作業系統的使用者模式可以用來執行 i/o 操作,這是單獨進行管理的。
在客戶作業系統上執行 i/o 的功能是由 qemu 提供的。qemu 是一個平台虛拟化解決方案,允許對一個完整的 pc 環境進行虛拟化(包括磁盤、圖形擴充卡和網絡裝置)。客戶作業系統所生成的任何 i/o 請求都會被中途截獲,并重新發送到 qemu 程序模拟的使用者模式中。
kvm 通過 /dev/kvm 裝置提供了記憶體虛拟化。每個客戶作業系統都有自己的位址空間,并且是在執行個體化客戶作業系統時映射的。映射給客戶作業系統的實體記憶體實際上是映射給這個程序 的虛拟記憶體。為了支援客戶實體位址到主機實體位址的轉換,系統維護了一組影子頁表(shadow page table)。處理器也可以通過在通路未經映射的記憶體位置時使用系統管理程式(主機核心)來支援記憶體轉換程序。
新客戶作業系統的執行個體化是由一個名為 <code>kvm</code> 的工具提供的。這個工具可以與 kvm 子產品協同工作,使用 /dev/kvm 來加載客戶作業系統,将它與虛拟磁盤(主機作業系統中的一個普通檔案)關聯起來,然後啟動客戶作業系統。
通過一組在 /dev/kvm 裝置上執行的 ioctls 可以提供控制支援。當第一次打開這個特殊檔案時,就會建立一個新的 vm 對象,它與一個虛拟 cpu 關聯在一起。您然後可以使用幾個 ioctls 來建立一個虛拟 cpu,檢查 kvm 版本,建立記憶體區域,然後啟動一個虛拟 cpu。您可以使用 <code>kvm</code> 指令實作這種功能。在接下來的幾節中,我們将介紹 <code>kvm</code> 指令,并給出幾個受支援的 ioctls 的示例。
如果硬體支援的話,使用 kvm 實際上非常簡單。您需要一個具有虛拟化支援的處理器。通過檢視 /proc/cpuinfo 可以知道系統是否支援虛拟化。這個檔案指定了是否支援 vmx(intel)或 svm(amd)擴充。
有了啟用了虛拟化支援的引導核心,接下來的一個步驟是為客戶作業系統建立一個磁盤映像。您可以使用 <code>qeumu-img</code> 來完成此操作,如下所示。注意這個映像的大小是 4gb,但是使用 qemu 的寫時複制格式(copy-on-write,qcow)時,整個檔案将根據需要增長,而不是完全占據這 4 gb 的空間。
在建立虛拟磁盤之後,就可以将客戶作業系統加載到其上。下面的例子假設客戶作業系統是在 cd-rom 上。除了使用 cd-rom iso 映像來填充虛拟磁盤之外,還必須在結束時啟動這個映像。
對 <code>kvm_init</code> 的調用會打開 /dev/kvm 裝置,檢查版本号(由 kvm 核心子產品導出),然後配置設定一個 kvm 上下文對象并填充一些回調函數。<code>kvm_create</code> 函數會建立并映射兩個記憶體區域,然後使用 ioctl(<code>kvm_create_vcpu</code>)建立一個虛拟 cpu(vcpu)。
<code>load_file</code> 函數然後會将映像加載到給定的 vm 的位址空間中,然後調用 <code>kvm_run</code> 執行該 vm(使用 ioctl <code>kvm_run</code>)。盡管這個過程非常簡單,但是它解釋了如何使用 kvm 執行個體化新客戶作業系統。
kvm 是解決虛拟化問題的一個有趣的解決方案,但是由于它是第一個進入核心的虛拟化解決方案,很難想象它會很快用于伺服器虛拟化。還有其他一些方法一直在為進入 核心而競争(例如 uml 和 xen),但是由于 kvm 需要的修改較少,并且可以将标準核心轉換成一個系統管理程式,是以它的優勢不言而喻。
kvm 的另外一個優點是它是核心本身的一部分,是以可以利用核心的優化和改進。與其他獨立的系統管理程式解決方案相比,這種方法是一種不會過時的技術。kvm 兩個最大的缺點是需要較新的能夠支援虛拟化的處理器,以及一個使用者空間的 qemu 程序來提供 i/o 虛拟化。但是不論好壞,kvm 位于核心中,這對于現有解決方案來說是一個巨大的飛躍。
轉載請注明出處:http://www.cnblogs.com/haochuang/ 8年it工作經驗,5年測試技術與管理,2年産品與項目管理,曾參與過雲計算\雲存儲\車聯網産品研發工作; 業餘自媒體人,有技術類垂直微信公衆号;如有招聘或求職方面需求,請mail to [email protected] ;或通過 qq:363573922 微網誌:@念槐聚 聯系;