KVM 初探

KVM 是業界最爲流行的 Hypervisor,全稱是 Kernel-based Virtual Machine。它是做爲 Linux kernel 中的一個內核模塊而存在,模塊名爲 kvm.ko,也能夠看做是一個進程,被內核調度並管理,從 Linux 2.6.20 版本開始被徹底正式加入到內核的主幹開發和正式發佈代碼中。 KVM 主要用於管理 CPU 和內存的虛擬化,IO 設備的虛擬化則是由 Qemu 來完成。爲何會有這樣的分工,請繼續往下看。git

KVM 與 Qemu 的前世此生

Qemu 是一個純軟件實現的開源「模擬」軟件,它可以模擬整套虛擬機的實現,包括 CPU、內存、各類 IO 設備、鼠標、鍵盤、USB 、網卡、聲卡等等,基本上沒有它不能模擬的。有人可能會比較疑惑它跟 KVM 之間到底有何關係,咱們能夠把它們當作是合做關係,好基友,誰都離不開彼此。微信

KVM 離不開 Qemu。KVM 實現初期,爲了簡化開發和代碼重用,在 Qemu 的基礎上進行了修改,主要是將比較耗性能的 CPU 虛擬化和內存虛擬化部分移到了內核中實現,保留 IO 虛擬化模塊在用戶空間實現。這樣的作法主要是考慮到性能的緣由,CPU 和 內存虛擬化是很是複雜的虛擬化模塊,並且使用很是頻繁,若是實如今用戶空間的話,用戶態和內核態的頻繁切換勢必會對性能形成很大的影響。那爲何要單獨保留 IO 虛擬化在用戶空間呢,這個也是權衡之下的結果,首先 IO 設備太多了,其次 IO 虛擬化相對其餘兩個模塊使用不是很頻繁,開銷會小一些,因此,爲了儘量保持內核的純淨性,纔有了這樣的分配。markdown

Qemu 離不開 KVM。上面也說了,Qemu 是一個純軟件的實現,運行在用戶空間,性能很是低下,因此,從 Qemu 的角度,能夠說是 Qemu 使用了 KVM 的虛擬化功能,爲自身虛擬機提供加速。數據結構

早期二者尚未區分(沒有同居),KVM 修改的模塊叫 qemu-kvm,到 Qemu1.3 版本以後,二者就合二爲一了(同居啦),若是咱們在用 Qemu 建立虛擬機時,要加載 KVM 模塊,須要爲其指定參數 --enable-kvm。架構

KVM 架構

KVM 是基於硬件虛擬化(Intel VT 或 AMD-V)實現的一套虛擬化解決方案,經過以上一個與 Qemu 關係的分析,咱們基本上知道它在虛擬化領域處在一個什麼樣的地位。它其實只負責 CPU 和內存的虛擬化,不負責任何設備的模擬,而是提供接口給用戶空間的 Qemu 來模擬。這個接口是 /dev/kvm,
Qemu 經過 /dev/kvm 接口設置一個虛擬機的地址空間,而後向它提供模擬好的 I/O 設備,並將相關的設備回顯操做映射到宿主機,完成整個 I/O 設備的虛擬化操做。框架

/dev/kvm 接口是 Qemu 和 KVM 交互的「橋樑」,基本的原理是:/dev/kvm 自己是一個設備文件,這就意味着能夠經過 ioctl 函數來對該文件進行控制和管理,從而能夠完成用戶空間與內核空間的數據交互。在 KVM 與 Qemu 的通訊過程主要就是一系列針對該設備文件的 ioctl 調用。函數

我就拿建立虛擬機舉個例子,虛擬機本質上是宿主機的一個進程,包括用戶態數據結構和內核態數據結構,用戶態部分由 Qemu 建立並初始化,內核態部分則由 KVM 來完成,完成後會返回一個文件句柄來表明所建立的虛擬機,針對該文件句柄的 ioctl 調用就能夠對虛擬機進行相應的管理,好比創建虛擬機地址空間和宿主機地址空間的映射關係,建立多個線程(虛擬處理器,vCPU)來供虛擬機使用等,對於建立出的 vCPU,也會生成相應的文件句柄,一樣,對 vCPU 的文件句柄的 ioctl 調用就能夠對 vCPU 進行管理。工具

關於這塊的具體細節,後面會有文章來專門討論。post

VMM 管理工具 —— libvirt

目前,虛擬化這個領域能夠說是百花齊放,針對不一樣的場景提出了不少的虛擬化解決方案,KVM、Xen、VMware、VirtualBox、Hyper-V 等等,具體的這些方案有什麼特色,能夠看前文「虛擬化技術總覽」。這麼多方案勢必有不少通用的模塊,不一樣之處可能在於,與不一樣硬件廠商的適配上,爲了支持更多廠商,以及應用更多的領域,有不少 IaaS 解決方案須要融合多種虛擬化技術。這個時候若是有一個平臺類的管理工具就會很是方便,libvirt 就是這樣一個工具。性能

libvirt 除了可以支持多種虛擬化方案以外,還支持 OpenVZ、LXC 等容器虛擬化系統。它提供一套完善的虛擬機管理工具,支持 GUI 和命令行的形式,如 virsh、virt-install、virt-manager。因爲它的通用性和易管理,不少雲計算框架平臺都在底層使用 libvirt 的 API 來管理虛擬機,好比 OpenStack、OpenNebula、Eucalyptus 等。這個工具咱們僅僅提一下,有興趣的能夠裝個玩玩。

下面給出 KVM 和 Qemu 的 git 路徑,有興趣的能夠把源碼下下來研究下。

kvm.git:
git clone git://git.kernel.org/pub/scm/virt/kvm/kvm.git qemu.git(包括了 kvm): git clone git://git.qemu-project.org/qemu.git

PS:對雲計算感興趣的小夥伴能夠關注個人微信公衆號:aCloudDeveloper,專一雲計算領域,堅持分享乾貨。

stay hungry stay foolish ----jobs 但願多多燒香!
相關文章
相關標籤/搜索