之前一直不清楚kvm、qemu、libvirtd和nova組件之間的區別和聯繫,今天在網上看了幾篇文章,基本搞清了這幾者之間的關係。下面簡單總結一下。先介紹一下這幾種技術。
一:QEMU
QEMU是一個模擬器,通過動態二進制轉換來模擬cpu以及其他一系列硬件,使guest os認爲自己就是在和真正的硬件打交道,其實是和qemu模擬的硬件交互。這種模式下,guest os可以和主機上的硬件進行交互,但是所有的指令都需要qemu來進行翻譯,性能會比較差。
二:KVM
KVM是Linux內核提供的虛擬化架構,它需要硬件硬件CPU支持,比如採用硬件輔助虛擬化的Intel-VT,AMD-V。
KVM通過一個內核模塊kvm.ko來實現核心虛擬化功能,以及一個和處理器相關的模塊,如kvm-intel.ko或者kvm-amd.ko。kvm本身不實現模擬,僅暴露一個接口/dev/kvm,用戶態程序可以通過訪問這個接口的ioctl函數來實現vcpu的創建,和虛擬內存的地址空間分配。
有了kvm之後,guest-os的CPU指令不用再經過qemu翻譯就可以運行,大大提升了運行速度。
但是kvm只能模擬cpu和內存,不能模擬其他設備,於是就有了下面這個兩者合一的技術qemu-kvm。
三:QEMU-KVM
qemu-kvm,是qemu一個特定於kvm加速模塊的分支。
qemu將kvm整合進來,通過ioctl調用/dev/kvm,將cpu相關的指令交給內核模塊來做,kvm只實現了cpu和內存虛擬化,但不能模擬其它設備,因此qemu還需要模擬其它設備(如:硬盤、網卡等),qemu加上kvm就是完整意義上的服務器虛擬化
綜上所述,QEMU-KVM具有兩大作用:
- 提供對cpu,內存(KVM負責),IO設備(QEMU負責)的虛擬
- 對各種虛擬設備的創建,調用進行管理(QEMU負責)
qemu-kvm架構如下:
四:libvirtd
Libvirtd是目前使用最廣泛的對kvm虛擬機進行管理的工具和api。Libvirtd是一個Domain進程可以被本地virsh調用,也可以被遠端的virsh調用,libvirtd調用kvm-qemu控制虛擬機。
libvirtd由幾個不同的部分組成,其中包括應用程序編程接口(API)庫,一個守護進程(libvirtd)和一個默認的命令行工具(virsh),libvirtd守護進程負責對虛擬機的管理,因此要確保這個進程的運行。
五:openstack(nova)、kvm、qemu-kvm和libvirtd之間的關係。
kvm是最底層的VMM,它可以模擬cpu和內存,但是缺少對網絡、I/O及周邊設備的支持,因此不能直接使用。
qemu-kvm是構建與kvm之上的,它提供了完整的虛擬化方案
openstack(nova)的核心功能就是管理一大堆虛擬機,虛擬機可以是各種各樣(kvm, qemu, xen, vmware...),而且管理的方法也可以是各種各樣(libvirt, xenapi, vmwareapi...)。而nova中默認使用的管理虛擬機的API就是libvirtd。
簡單說就是,openstack不會去直接控制qemu-kvm,而是通過libvirtd庫去間接控制qemu-kvm。
另外,libvirt還提供了跨VM平臺的功能,它可以控制除了QEMU之外的模擬器,包括vmware, virtualbox, xen等等。所以爲了openstack的跨VM性,所以openstack只會用libvirt而不直接用qemu-kvm
參考:
https://www.cnblogs.com/echo1937/p/7138294.html
https://www.cnblogs.com/qiaoyanlin/p/6888408.html