QEMU和KVM的關系


  KVM是指在CPU硬件支持基礎之上的虛擬化技術。沒有CPU硬件虛擬化的支持,KVM是無法工作的。

    准確來說,KVM是Linux的一個模塊。可以用modprobe去加載KVM模塊。加載了模塊后(kvm和kvm-intel模塊),才能進一步通過其他工具創建虛擬機。但僅有KVM模塊是遠遠不夠的,因為用戶無法直接控制內核模塊去作事情。還必須有一個用戶空間的工具才行。這個用戶空間的工具,開發者選擇了已經成型的開源虛擬化軟件 QEMU。

    說起來QEMU也是一個虛擬化軟件。它的特點是可虛擬不同的CPU。比如說在x86的CPU上可虛擬一個Power的CPU,並可利用它編譯出可運行在Power上的程序。KVM使用了QEMU的一部分,並稍加改造,就成了可控制KVM的用戶空間工具了。所以你會看到,官方提供的KVM下載有兩大部分三個文件,分別是KVM模塊、QEMU工具以及二者的合集。也就是說,你可以只升級KVM模塊,也可以只升級QEMU工具。這就是KVM和QEMU 的關系。

具體解釋:

    Qemu:是一個完整的可以單獨運行的軟件,它可以用來模擬機器,非常靈活和可移植。它主要通過一個特殊的'重編譯器'將為特定處理器編寫二進制代碼轉換為另一種。(也就是,在PPCmac上面運行MIPS代碼,或者在X86 PC上運行ARM代碼)

    KQemu: 當源和目標代碼有同樣的架構的時候(就像最普通的情況 x86運行在x86上面),同樣需要解析代碼去出去任何'特權指令'並且把它們替換為上下文轉換。為了盡量使這個過程有效,有個內核模塊KQemu處理這個事情。作為一個內核模塊,KQemu僅僅需要替換最底層的ring0-only指令。在這個情況下,Qemu仍然為模擬的機器分配所有的RAM並且加載代碼。不同的是,KQemu不需要重新編譯代碼,它僅僅調用KQemu去掃描/打補丁/執行。所有外圍的硬件仿真是在Qemu中做的。由於大部分代碼都是沒有變換的,但是KQemu還是需要轉換ring0代碼(VM內核的絕大部分代碼),所以性能仍然不好。

    KVM:KVM包括很多部件:首先,它是一個Linux內核模塊(現在包括在主線中)用於轉換處理器到一種新的用戶 (guset)模式。用戶模式有自己的ring狀態集合,但是特權ring0的指令會陷入到管理器(hypervisor)的代碼。由於這是一個新的處理器執行模型,代碼不需要任何的改動。除了處理器狀態轉換,這個內核模塊同樣處理很小一部分低層次的模擬,比如MMU注冊(用於管理VM)和一部分PCI模擬的硬件。在可預見的未來,Qemu團隊專注於硬件模擬和可移植性,同時KVM團隊專注於內核模塊(如果某些部分確實有性能提升的話,KVM會將一小部分模擬代碼移進來)和與剩下的用戶空間代碼的交互。

     kvm-qemu:像普通Qemu一樣:分配RAM,加載代碼,不同於重新編譯或者調用callingKQemu,它創建了一個線程(這個很重要);這個線程調用KVM內核模塊去切換到用戶模式,並且去執行VM代碼。當遇到一個特權指令,它從新切換會KVM內核模塊,該內核模塊在需要的時候,像Qemu線程發信號去處理大部分的硬件仿真。

    當一起工作的時候,KVM管理CPU和MEM的訪問,QEMU仿真硬件資源(硬盤,聲卡,USB,等等)當QEMU單獨運行時,QEMU同時模擬CPU和硬件。


總結:

kvm,qemu,kqemu,qemu-kvm,libvirt  的區別:

    qemu是一套虛擬機管理系統,qemu可以虛擬出不同架構的虛擬機,如在x86平台上可以虛擬出power機器;

    kqemu是qemu的加速器,可以認為是qemu的一個插件;

    kvm是另外的一套虛擬機管理系統,包括內核虛擬構架和處理器相關模塊,其借用了 quem 其它一些組件,kvm的非內核部分是由qemu實現的;加載了模塊后,才能進一步通過其他工具創建虛擬機。但僅有 KVM 模塊是遠遠不夠的,因為用戶無法直接控制內核模塊去做事情,還必須有一個用戶空間的工具;

    qemu-kvm:kvm是linux的一個模塊,管理和創建完整的虛擬機需要相應的一些管理工具,由於kvm是在qemu的基礎上開發的,KVM 使用了 QEMU 的基於 x86 的部分,並稍加改造,形成可控制 KVM 內核模塊的用戶空間工具QEMU-KVM;

    libvirt,virt-manager,virsh:由於qemu-kvm的效率及通用性問題,有組織開發了 libvirt用於虛擬機的管理,帶有一套基於文本的虛擬機的管理工具--virsh,以及一套用戶渴望的圖形界面管理工具--virt- manager。libvirt是用python語言寫的通用的API,不僅可以管理KVM,也可用於管理XEN。




  在所謂的kvm技術中,應用到的其實有2個東西:qemu+kvm

kvm負責cpu虛擬化+內存虛擬化,實現了cpu和內存的虛擬化,但kvm不能模擬其他設備;

qemu是模擬IO設備(網卡,磁盤),kvm加上qemu之后就能實現真正意義上服務器虛擬化。
因為用到了上面兩個東西,所以一般都稱之為qemu-kvm。

libvirt則是調用kvm虛擬化技術的接口用於管理的,用libvirt管理方便,直接用qemu-kvm的接口太繁瑣.

轉自:https://blog.csdn.net/u011389746/java/article/details/79948789


免責聲明!

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



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