计算机io工作方式,QEMU/KVM和VirtIO工作模式
https://blog.csdn.net/shengxia1999/article/details/52244119
KVM:Kernel-Based Virtual Machine 基于內核的虛擬機,是Linux內核的一個可加載模塊,通過調用Linux本身內核功能,實現對CPU的底層虛擬化和內存的虛擬化,使Linux內核成為虛擬化層,需要x86架構的,支持虛擬化功能的硬件支持(比如Intel VT,AMD-V),是一種全虛擬化架構。KVM在2007年年2月被導入Linux 2.6.20內核中。從存在形式來看,它包括兩個內核模塊:kvm.ko ?和? kvm_intel.ko(或kvm_amd.ko),本質上,KVM是管理虛擬硬件設備的驅動,該驅動使用字符設備/dev/kvm(由KVM本身創建)作為管理接口,主要負責vCPU的創建,虛擬內存的分配,vCPU寄存器的讀寫以及vCPU的運行。
QEMU:是一套由Fabrice Bellard編寫的模擬處理器的自由軟件,它是一個完整的可以單獨運行的軟件,可以獨立模擬出整臺計算機,包括CPU,內存,IO設備,通過一個特殊的“重編譯器”對特定的處理器的二進制代碼進行翻譯,從而具有了跨平臺的通用性。QEMU有兩種工作模式:系統模式,可以模擬出整個電腦系統,另一種是用戶模式,可以運行不同與當前硬件平臺的其他平臺上的程序(比如在x86平臺上運行跑在ARM平臺上的程序)
在QEMU-KVM中,KVM運行在內核空間,QEMU運行在用戶空間,實際模擬創建,管理各種虛擬硬件,QEMU將KVM整合了進來,通過/ioctl 調用 /dev/kvm,從而將CPU指令的部分交給內核模塊來做,KVM實現了CPU和內存的虛擬化,但kvm不能虛擬其他硬件設備,因此qemu還有模擬IO設備(磁盤,網卡,顯卡等)的作用,KVM加上QEMU后就是完整意義上的服務器虛擬化。
當然,由于qemu模擬io設備效率不高的原因,現在常常采用半虛擬化的virtio方式來虛擬IO設備。
綜上所述,QEMU-KVM具有兩大作用:
1.提供對cpu,內存(KVM負責),IO設備(QEMU負責)的虛擬
2.對各種虛擬設備的創建,調用進行管理(QEMU負責)
libvirt
順帶提一提libvirt,這是RedHat開始支持KVM后,大概是覺得QEMU+KVM方案中的用戶空間虛擬機管理工具不太好用或者通用性不強,所以干脆搞了個libvirt出來,一個針對各種虛擬化平臺的虛擬機管理的API庫,一些常用的虛擬機管理工具如virsh(類似vim編輯器),virt-install,virt-manager等和云計算框架平臺(如OpenStack,OpenNebula,Eucalyptus等)都在底層使用libvirt提供的應用程序接口。
libvirt主要由三個部分組成:API庫,一個守護進程 libvirtd 和一個默認命令行管理工具 virsh。
總結:
目前來說,QEMU是一個獨立的虛擬化解決方案,并不依賴KVM(它本身自己可以做CPU和內存的模擬,只不過效率較低),而KVM是另一套虛擬化解決方案,對CPU進行虛擬效率較高(采用了硬件輔助虛擬化),但本身不提供其他設備的虛擬化,借用了QEMU的代碼進行了定制,所以KVM方案一定要依賴QEMU。
即使后來RedHat后來開發了libvirt,也只能簡單的認為是個虛擬機管理工具,仍然需要通過用戶空間QEMU來與KVM進行交互。
http://lihanlu.cn/virtio-introduction/
實現IO虛擬化主要有三種方式:全虛擬化、半虛擬化和透傳。全虛擬化Guest OS不會感知到自己是虛擬機,也無需修改Guest OS,但是它的效率比較低。半虛擬化Guest OS知道自己是虛擬機,通過Frontend/Backend驅動模擬實現IO虛擬化。透傳就是直接分配物理設備給VM用。Virtio是一種半虛擬化的設備抽象接口規范,在Qemu和KVM中得到了廣泛使用,本文將簡單介紹Virtio的基本原理。
Virtio SPEC
* Virtual I/O Device (VIRTIO) Version 1.0
* http://docs.oasis-open.org/virtio/virtio/v1.0/cs04/virtio-v1.0-cs04.html
* Virtio PCI Card Specification Version 0.9.5
* http://ozlabs.org/~rusty/virtio-spec/virtio-0.9.5.pdf
每個Virtio設備包括以下部分
* Device status field 設備狀態字段
* Feature bits 特征位
* Device Configuration space 設備配置空間
* One or more virtqueues 一個或多個virtqueues
每個virtqueue由三部分組成:
* Descriptor Table
* Available Ring
* Used Ring
如圖所示,virtnet_info作為virtio網絡設備的私有數據將virtio_device和net_device鏈接在一起。對于virtio網絡設備來說,它至少有兩個virtqueue(如果協商了VIRTIO_NET_F_MQ則可以創建多個隊列,詳見VirtIO SPEC中5.1.2 ),一個用于TX(send_queue),另一個用于RX(receive_queue),TX和RX隊列中都包含了virtqueue和scatterlist[]。virtio_device、virtnet_info、receive_queue、send_queue、virtqueue給定任一結構體均可得到其它結構體信息。
可以把virtqueue理解為一個接口類,而vring_virtqueue作為這個接口的一個實現,vring_virtqueue通過成員vq可以與上述其它struct建立聯系。virtio的環形緩沖區機制是由vring來承載的,vring由三部分組成:Descriptor表(vring_desc),Available ring(vring_avail)和Used ring(vring_used)。
https://www.jianshu.com/p/9be4969e0bb1
virtio作為一種設備,同樣也處在Linux kernel對設備模型的管理之下,virtio使用了virtio pcibus類型的虛擬總線,當命令行傳入virtio時,Qemu會根據注冊的virtio_net_pci_info進行virtio net設備的初始化,并在Qemu自身模擬的pci bus層加入了virtio net設備的初始化信息。
當Qemu加載Guest OS后,Guest OS的Bios和Kernel的啟動過程中會對Pci設備進行枚舉和資源的分配。
當總線類型注冊后,/sys/bus/目錄下,創建了一個新的目錄virtio,在該目錄下同時創建了兩個文件夾為devices和drivers。表示創建virtio總線,總線支持設備與驅動devices和drivers目錄。
總結
以上是生活随笔為你收集整理的计算机io工作方式,QEMU/KVM和VirtIO工作模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 火炬之光无限帝国将军怎么获得
- 下一篇: “像造汽车一样造房子”是说谁的?