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里面過一手,因而性能比較差

 

按照上一次的理論,完全虛擬化是非常慢的,所以要使用硬件輔助虛擬化技術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,全部使用手工配置,看創建虛擬機都做了哪些事情。

 

歡迎關注微信公眾號

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM