本文首發於我的公眾號 Linux雲計算網路(id: cloud_dev),號內有 10T 書籍和視頻資源,後臺回復「1024」即可領取,歡迎大家關注,第一時間掌握技術乾貨!

I/O 虛擬化在虛擬化技術中算是比較複雜,也是最重要的一部分。從整體上看,I/O 虛擬化也包括基於軟體的虛擬化和硬體輔助的虛擬化,軟體虛擬化部分又可以分為全虛擬化和半虛擬化,如果根據設備類型再細分的話,又可以分為字元設備 I/O 虛擬化(鍵盤、滑鼠、顯示器)、塊設備 I/O 虛擬化(磁碟、光碟)和網路設備 I/O 虛擬化(網卡)等。

我們先看下在沒有虛擬機存在的情況下,I/O 設備請求是怎樣的。某個應用或進程發出 I/O 請求,通過系統調用等方式進入內核,調用相應的驅動程序,請求到具體的 I/O 設備,然後再將結果返回到調用者進行回顯。

那麼存在虛擬機的情況下,又是怎樣的呢。按理說,虛擬機是宿主機上的一個進程,應該可以以類似的 I/O 請求方式訪問到宿主機上的 I/O 設備,但別忘了,虛擬機處在非 Root 的虛擬化模式下,請求無法直接下發到宿主機,必須藉助於 VMM 來截獲並模擬虛擬機的 I/O 請求,至於怎麼截獲並模擬,每一種 VMM 的實現方案都不一樣,像 qemu-kvm ,截獲操作是由內核態的 kvm 來完成,模擬操作是由用戶態的 qemu 來完成的,這也是 kvm 不同於其他 VMM 實現方案的地方。kvm 這樣做也是為了提升性能和保持內核的純凈性,關於這塊的知識不清楚的可以查閱前文。

從層次上看,虛擬機發出 I/O 請求到完成相應的 I/O 操作,中間要經過虛擬機的設備驅動,到 VMM 的設備模型,再到宿主機的設備驅動,最終纔到真正的 I/O 設備。

那什麼是設備模型,設備模型就是 VMM 中進行設備模擬,並處理所有設備請求和響應的邏輯模塊,對於 qemu-kvm,qemu 其實就可以看做是一個設備模型。

上圖顯示的就是設備模型的邏輯層次關係,對於不同構造的虛擬機,其邏輯層次是類似的:VMM 截獲虛擬機的 I/O 操作,將這些操作傳遞給設備模型進行處理,設備模型運行在一個特定的環境下,這可以是宿主機,可以是 VMM 本身,也可以是另一個虛擬機。

下圖顯示的就是在宿主機中設備模型的實現,也就是 qemu-kvm 的實現方案,在這個例子中,VMM 主要部分實現為內核模塊,設備模型實現為一個用戶態進程,當虛擬機發生 I/O 之後,VMM 作為內核模塊將其截獲後,會通過內核態-用戶態介面傳遞給用戶態的設備模型處理,設備模型運行與宿主機操作系統之上,可以使用相應的系統調用和所有運行時庫,宿主機操作系統就是設備模型的運行環境。

所以,設備模型在這裡起著一個橋樑的作用,由虛擬機設備驅動發出的 I/O 請求先通過設備模型轉化為物理 I/O 設備的請求,再通過調用物理設備驅動來完成相應的 I/O 操作。反過來,設備驅動將 I/O 操作結果通過設備模型,返回給虛擬機的虛擬設備驅動程序。

上面說的這種方式是純軟體模擬的,或者說得再專業一點就是全虛擬化,全虛擬化就是 VMM 完全虛擬出一套宿主機的設備模型,宿主機有什麼就虛擬出什麼,這樣,虛擬機發出的任何 I/O 請求都是無感知的,也是說虛擬機認為自己在「直接」使用物理的 I/O 設備,其實不是,全是虛擬出來的。

有了全虛擬化,自然就有半虛擬化,半虛擬化的提出就是解決全虛擬化的性能問題的。通過上面的分析,不難看出,這種截獲再模擬的方式導致一次 I/O 請求要經過多次的內核態和用戶態的切換,性能肯定不理想。半虛擬化就是盡量避免這種情況發生。

半虛擬化中,虛擬機能夠感知到自己是處於虛擬化狀態,虛擬機和宿主機之間通過某種機制來達成這種感知,也就是兩者之間需要建立一套通信介面,虛擬機的 I/O 請求走這套介面,而不是走截獲模擬那種方式,這樣就可以提升性能。這套介面一個比較好的實現就是 virtio,Linux 2.6.30 版本之後就被集成到了 Linux 內核模塊中。

半虛擬化雖然提升了性能,但是還是基於軟體模擬的方式,性能上還是無法與直接訪問物理 I/O 設備相抗衡,那能不能做到呢,答案是一定的,那就是從硬體上去入手了。

以 Intel VT-d 為首的技術就是硬體輔助的 I/O 虛擬化技術,但是業界一般不是直接使用硬體,而是配合相應的軟體技術來完成,比較常用的兩門技術是 PCI Pass-Through 和 SR-IOV。

本文僅是簡單總結下 I/O 虛擬化的方式,分類,以及存在的技術問題。後面會針對具體的類別或問題進行展開。


公眾號後臺回復「加羣」,帶你進入高手如雲交流羣

我的公眾號 Linux雲計算網路(id: cloud_dev) ,號內有 10T 書籍和視頻資源,後臺回復 「1024」 即可領取,分享的內容包括但不限於 Linux、網路、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎大家關注。


推薦閱讀:
相關文章