當你安裝了一台Linux,想啟動一個KVM虛拟機的時候,你會發現需要安裝不同的軟體,啟動虛拟機的時候,有多種方法:
- virsh start
- kvm指令
- qemu指令
- qemu-kvm指令
- qemu-system-x86_64指令
這些之間是什麼關系呢?請先閱讀上一篇《我是虛拟機核心我困惑》
有了上一篇的基礎,我們就能說清楚來龍去脈。
首先看qemu,其中關鍵字emu,全稱emulator,模拟器,是以單純使用qemu是采用的完全虛拟化的模式。
Qemu向Guest OS模拟CPU,也模拟其他的硬體,GuestOS認為自己和硬體直接打交道,其實是同Qemu模拟出來的硬體打交道,Qemu将這些指令轉譯給真正的硬體。由于所有的指令都要從Qemu裡面過一手,因而性能比較差

按照上一次的理論,完全虛拟化是非常慢的,是以要使用硬體輔助虛拟化技術Intel-VT,AMD-V,是以需要CPU硬體開啟這個标志位,一般在BIOS裡面設定。檢視是否開啟
對于Intel CPU 可用指令 grep "vmx" /proc/cpuinfo 判斷
對于AMD CPU 可用指令 grep "svm" /proc/cpuinfo 判斷
當确認開始了标志位之後,通過KVM,GuestOS的CPU指令不用經過Qemu轉譯,直接運作,大大提高了速度。
是以KVM在核心裡面需要有一個子產品,來設定目前CPU是Guest OS在用,還是Host OS在用。
檢視核心子產品中是否含有kvm, ubuntu預設加載這些子產品
KVM核心子產品通過/dev/kvm暴露接口,使用者态程式可以通過ioctl來通路這個接口,例如書寫下面的程式
Qemu将KVM整合進來,通過ioctl調用/dev/kvm接口,将有關CPU指令的部分交由核心子產品來做,就是qemu-kvm (qemu-system-XXX)
Qemu-kvm對kvm的整合從release_0_5_1開始有branch,在1.3.0正式merge到master
qemu和kvm整合之後,CPU的性能問題解決了,另外Qemu還會模拟其他的硬體,如Network, Disk,同樣全虛拟化的方式也會影響這些裝置的性能。
于是qemu采取半虛拟化或者類虛拟化的方式,讓Guest OS加載特殊的驅動來做這件事情。
例如網絡需要加載virtio_net,存儲需要加載virtio_blk,Guest需要安裝這些半虛拟化驅動,GuestOS知道自己是虛拟機,是以資料直接發送給半虛拟化裝置,經過特殊處理,例如排隊,緩存,批量處理等性能優化方式,最終發送給真正的硬體,一定程度上提高了性能。
至此整個關系如下:
qemu-kvm會建立Guest OS,當需要執行CPU指令的時候,通過/dev/kvm調用kvm核心子產品,通過硬體輔助虛拟化方式加速。如果需要進行網絡和存儲通路,則通過類虛拟化或者直通Pass through的方式,通過加載特殊的驅動,加速通路網絡和存儲資源。
然而直接用qemu或者qemu-kvm或者qemu-system-xxx的少,大多數還是通過virsh啟動,virsh屬于libvirt工具,libvirt是目前使用最為廣泛的對KVM虛拟機進行管理的工具和API,可不止管理KVM。
Libvirt分服務端和用戶端,Libvirtd是一個daemon程序,是服務端,可以被本地的virsh調用,也可以被遠端的virsh調用,virsh相當于用戶端。
Libvirtd調用qemu-kvm操作虛拟機,有關CPU虛拟化的部分,qemu-kvm調用kvm的核心子產品來實作
這下子,整個互相關系才搞清楚了。
雖然使用virsh建立虛拟機相對簡單,但是為了探究虛拟機的究竟如何使用,下一次,我們來解析一下如何裸使用qemu-kvm來建立一台虛拟機,并且能上網。
如果搭建使用過vmware桌面版或者virtualbox桌面版,建立一個能上網的虛拟機非常簡單,但是其實背後做了很多事情,下一次我們裸用qemu-kvm,全部使用手工配置,看建立虛拟機都做了哪些事情。
歡迎關注微信公衆号