天天看點

Qemu,KVM,Virsh傻傻的分不清

當你安裝了一台Linux,想啟動一個KVM虛拟機的時候,你會發現需要安裝不同的軟體,啟動虛拟機的時候,有多種方法:

  • virsh start
  • kvm指令
  • qemu指令
  • qemu-kvm指令
  • qemu-system-x86_64指令

這些之間是什麼關系呢?請先閱讀上一篇《我是虛拟機核心我困惑》

有了上一篇的基礎,我們就能說清楚來龍去脈。

首先看qemu,其中關鍵字emu,全稱emulator,模拟器,是以單純使用qemu是采用的完全虛拟化的模式。

Qemu向Guest OS模拟CPU,也模拟其他的硬體,GuestOS認為自己和硬體直接打交道,其實是同Qemu模拟出來的硬體打交道,Qemu将這些指令轉譯給真正的硬體。由于所有的指令都要從Qemu裡面過一手,因而性能比較差

Qemu,KVM,Virsh傻傻的分不清

按照上一次的理論,完全虛拟化是非常慢的,是以要使用硬體輔助虛拟化技術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預設加載這些子產品

Qemu,KVM,Virsh傻傻的分不清

KVM核心子產品通過/dev/kvm暴露接口,使用者态程式可以通過ioctl來通路這個接口,例如書寫下面的程式

Qemu,KVM,Virsh傻傻的分不清

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,Virsh傻傻的分不清

qemu和kvm整合之後,CPU的性能問題解決了,另外Qemu還會模拟其他的硬體,如Network, Disk,同樣全虛拟化的方式也會影響這些裝置的性能。

于是qemu采取半虛拟化或者類虛拟化的方式,讓Guest OS加載特殊的驅動來做這件事情。

例如網絡需要加載virtio_net,存儲需要加載virtio_blk,Guest需要安裝這些半虛拟化驅動,GuestOS知道自己是虛拟機,是以資料直接發送給半虛拟化裝置,經過特殊處理,例如排隊,緩存,批量處理等性能優化方式,最終發送給真正的硬體,一定程度上提高了性能。

至此整個關系如下:

Qemu,KVM,Virsh傻傻的分不清

qemu-kvm會建立Guest OS,當需要執行CPU指令的時候,通過/dev/kvm調用kvm核心子產品,通過硬體輔助虛拟化方式加速。如果需要進行網絡和存儲通路,則通過類虛拟化或者直通Pass through的方式,通過加載特殊的驅動,加速通路網絡和存儲資源。

然而直接用qemu或者qemu-kvm或者qemu-system-xxx的少,大多數還是通過virsh啟動,virsh屬于libvirt工具,libvirt是目前使用最為廣泛的對KVM虛拟機進行管理的工具和API,可不止管理KVM。

Qemu,KVM,Virsh傻傻的分不清

Libvirt分服務端和用戶端,Libvirtd是一個daemon程序,是服務端,可以被本地的virsh調用,也可以被遠端的virsh調用,virsh相當于用戶端。

Libvirtd調用qemu-kvm操作虛拟機,有關CPU虛拟化的部分,qemu-kvm調用kvm的核心子產品來實作

Qemu,KVM,Virsh傻傻的分不清

這下子,整個互相關系才搞清楚了。

雖然使用virsh建立虛拟機相對簡單,但是為了探究虛拟機的究竟如何使用,下一次,我們來解析一下如何裸使用qemu-kvm來建立一台虛拟機,并且能上網。

如果搭建使用過vmware桌面版或者virtualbox桌面版,建立一個能上網的虛拟機非常簡單,但是其實背後做了很多事情,下一次我們裸用qemu-kvm,全部使用手工配置,看建立虛拟機都做了哪些事情。

歡迎關注微信公衆号

Qemu,KVM,Virsh傻傻的分不清