本文首發於我的公眾號 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
。