1. 程式人生 > 實用技巧 >virtio基本原理(kvm半虛擬化驅動)

virtio基本原理(kvm半虛擬化驅動)

>>> hot3.png

先來看下什麼是完全虛擬化和半虛擬化.

完全虛擬化:來賓作業系統執行在位於物理機器上的hypervisor之上.來賓作業系統並不知道它已被虛擬化,並且不需要任何更改就可以工作.

半虛擬化:來賓作業系統不僅知道它執行在hypervisor之上,還包括讓來賓作業系統更高效地過度到hypervisor的程式碼

在完全虛擬化模式中,hypervisor必須模擬裝置硬體,它是在會話的最低級別進行模擬的(例如:網路驅動程式,磁碟,顯示卡等等).儘管在該抽象中模擬很乾淨,但它同時也是最低效,最複雜的.在半虛擬化中,來賓作業系統和hypervisor能夠共同合作,讓模擬更加高效.缺點是作業系統知道它被虛擬化,並且需要修改才能工作.

以上是完全虛擬化和半虛擬化環境下的裝置模擬

左圖在傳統的完全虛擬化環境中,hypervisor必須捕捉這些請求,然後模擬物理硬體的行為。儘管這也做提供很大的靈活性(即執行未更改的作業系統),但它的效率比較低.

右圖,半虛擬化,來賓作業系統知道它執行在hypervisor之上,幷包含了充當當前的驅動程式.hypervisor為特定的裝置模擬實現後端驅動程式.通過在這些前端和後端驅動程式中的virtio,為開發模擬裝置提供標準化介面,從而增加程式碼的跨平臺重用率並提高效率.

我們先來看下QUEM模擬I/O裝置的基本原理和優缺點:

使用QEMU模擬I/O的情況下,當客戶機中的裝置驅動程式(device driver)發起I/O操作請求之時,KVM模組中的I/O操作捕獲程式碼會攔截這次I/O請求,然後經過處理後將本次I/O請求的資訊存放到I/O共享頁,並通知使用者控制元件的QEMU程式。QEMU模擬程式獲得I/O操作的具體資訊之後,交由硬體模擬程式碼來模擬出本次的I/O操作,完成之後,將結果放回到I/O共享頁,並通知KVM模組中的I/O操作捕獲程式碼。最後,由KVM模組中的捕獲程式碼讀取I/O共享頁中的操作結果,並把結果返回到客戶機中。當然,這個操作過程中客戶機作為一個QEMU程序在等待I/O時也可能被阻塞。另外,當客戶機通過DMA(Direct Memory Access)訪問大塊I/O之時,QEMU模擬程式將不會把操作結果放到I/O共享頁中,而是通過記憶體對映的方式將結果直接寫到客戶機的記憶體中去,然後通過KVM模組告訴客戶機DMA操作已經完成。

QEMU模擬I/O裝置的方式,其優點是可以通過軟體模擬出各種各樣的硬體裝置,包括一些不常用的或者很老很經典的裝置(如4.5節中提到RTL8139的網絡卡),而且它不用修改客戶機作業系統,就可以實現模擬裝置在客戶機中正常工作。在KVM客戶機中使用這種方式,對於解決手上沒有足夠裝置的軟體開發及除錯有非常大的好處。而它的缺點是,每次I/O操作的路徑比較長,有較多的VMEntry、VMExit發生,需要多次上下文切換(context switch),也需要多次資料複製,所以它的效能較差。


再來看看半虛擬化virtio的基本原理和優缺點

其中前端驅動(frondend,如virtio-blk、virtio-net等)是在客戶機中存在的驅動程式模組,而後端處理程式(backend)是在QEMU中實現的。在這前後端驅動之間,還定義了兩層來支援客戶機與QEMU之間的通訊。其中,“virtio”這一層是虛擬佇列介面,它在概念上將前端驅動程式附加到後端處理程式。一個前端驅動程式可以使用0個或多個佇列,具體數量取決於需求。例如,virtio-net網路驅動程式使用兩個虛擬佇列(一個用於接收,另一個用於傳送),而virtio-blk塊驅動程式僅使用一個虛擬佇列。虛擬佇列實際上被實現為跨越客戶機作業系統和hypervisor的銜接點,但它可以通過任意方式實現,前提是客戶機作業系統和virtio後端程式都遵循一定的標準,以相互匹配的方式實現它。而virtio-ring實現了環形緩衝區(ring buffer),用於儲存前端驅動和後端處理程式執行的資訊,並且它可以一次性儲存前端驅動的多次I/O請求,並且交由後端去動去批量處理,最後實際呼叫宿主機中裝置驅動實現物理上的I/O操作,這樣做就可以根據約定實現批量處理而不是客戶機中每次I/O請求都需要處理一次,從而提高客戶機與hypervisor資訊交換的效率。

Virtio半虛擬化驅動的方式,可以獲得很好的I/O效能,其效能幾乎可以達到和native(即:非虛擬化環境中的原生系統)差不多的I/O效能。所以,在使用KVM之時,如果宿主機核心和客戶機都支援virtio的情況下,一般推薦使用virtio達到更好的效能。當然,virtio的也是有缺點的,它必須要客戶機安裝特定的Virtio驅動使其知道是執行在虛擬化環境中,且按照Virtio的規定格式進行資料傳輸,不過客戶機中可能有一些老的Linux系統不支援virtio和主流的Windows系統需要安裝特定的驅動才支援Virtio。不過,較新的一些Linux發行版(如RHEL 6.3、Fedora 17等)預設都將virtio相關驅動編譯為模組,可直接作為客戶機使用virtio,而且對於主流Windows系統都有對應的virtio驅動程式可供下載使用。


virtio是對半虛擬化hypervisor中的一組通用模擬裝置的抽象.該設定還允許hypervisor匯出一組通用的模擬裝置,並通過一個通用的應用程式介面(API)讓它們變得可用.有了半虛擬化hypervisor之後,來賓作業系統能夠實現一組通用的介面,在一組後端驅動程式之後採用特定的裝置模擬.後端驅動程式不需要是通用的,因為它們只實現前端所需的行為.

注意,在現實中(儘管不需要),裝置模擬發生在使用 QEMU 的空間,因此後端驅動程式與 hypervisor 的使用者空間互動,以通過 QEMU 為 I/O 提供便利。QEMU 是一個系統模擬器,它不僅提供來賓作業系統虛擬化平臺,還提供整個系統(PCI 主機控制器、磁碟、網路、視訊硬體、USB 控制器和其他硬體元素)的模擬





轉載於:https://my.oschina.net/davehe/blog/130124