本文首發於我的公眾號 Linux雲計算網路(id: cloud_dev),號內有 10T 書籍和視頻資源,後臺回復「1024」即可領取,歡迎大家關注,第一時間掌握技術乾貨!

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

KVM 與 Qemu 的前世今生

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

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

Qemu 離不開 KVM。上面也說了,Qemu 是一個純軟體的實現,運行在用戶空間,性能非常低下,所以,從 Qemu 的角度,可以說是 Qemu 使用了 KVM 的虛擬化功能,為自身虛擬機提供加速。

早期兩者還沒有區分(沒有同居),KVM 修改的模塊叫 qemu-kvm,到 Qemu1.3 版本之後,兩者就合二為一了(同居啦),如果我們在用 Qemu 創建虛擬機時,要載入 KVM 模塊,需要為其指定參數 --enable-kvm

KVM 與 Qemu 的關係(圖片來源於網路,侵權必刪)

KVM 架構

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

KVM 架構

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

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

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

VMM 管理工具 —— libvirt

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

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


公眾號後臺回復「加羣」,帶你進入高手如雲交流羣

我的公眾號 Linux雲計算網路(id: cloud_dev) ,號內有 10T 書籍和視頻資源,後臺回復 「1024」 即可領取,分享的內容包括但不限於 Linux、網路、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎大家關注。


推薦閱讀:
相關文章