主頁 >  其他 > 淺談Linux設備虛擬化技術的演進之路

淺談Linux設備虛擬化技術的演進之路

2021-09-18 14:09:19 其他

序言

設備虛擬化技術,一直是云計算領域最重要的基礎技術之一,我們在虛擬機里面看到的形形色色的設備,比如:網卡,磁盤,鍵盤,滑鼠等,都離不開這項技術的幫助,這篇文章,我們將從技術演進的角度來談一談 Linux 現有的以及即將到來的設備虛擬化技術,

f0f2e0543f9f1ee06222ff664ba9ea92.png

Trap-and-emulate

在最早期階段,設備虛擬化常常和機器模擬器技術,比如:QEMU,系結在一起,我們可以通過 QEMU 模擬真實設備的所有暫存器布局和操作流程,當 QEMU 虛擬機里面設備驅動需要訪問該虛擬設備的暫存器時,這條訪問指令會被 trap 到 QEMU,由 QEMU 來進行處理,這樣,虛擬機里面的設備驅動在操作該虛擬設備時就像在訪問真實的硬體設備一樣,設備驅動也不需要任何變更,

5a6eb39648d269fca46cef1a0e9b3949.png

Virtio

通過上述這種 trap-and-emulate 的方式來模擬設備,雖然不需要對真實設備驅動進行變更,但是設備訪問程序中,頻繁的陷入&陷出帶來了嚴重的性能問題,因此,virtio 這類半虛擬化技術應運而生,并于 2008 年合入 Linux 內核主線,

相較于 trap-and-emulate 這種方式,Virtio 不再拘泥于依賴已有的設備驅動,而是定義了一套全新的專用于虛擬設備的驅動框架,設備驅動清楚自己是在操作虛擬設備,因此,在真正的 I/O 路徑上規避了大量可能導致陷入&陷出的 mmio/pio 操作,從而提高了性能,虛機里面的 Virtio 驅動和 QEMU 模擬的 Virtio 設備的資料互動,本質上是一套基于共享記憶體 + 環形佇列的通信機制,核心資料結構(split virtqueue)包括:兩個 ringbuffer (avail ring, used ring) 和一個 descriptor table,作業機制類似 DMA,虛機內 virtio 驅動首先會將一個請求在記憶體中需要傳輸的散列 buffer 的地址、長度組成一個個描述符寫入到 descriptor table 中,然后將這些描述符對應的 descriptor table 上的 index 寫入到 avail ring 中,并通過 eventfd 機制通知到宿主機上的 virtio backend,由于這些 ringbuffer、descriptor table 以及散列 buffer 都在共享記憶體中(虛機本質上是一個用戶態行程,因此虛機記憶體是由用戶態申請和分配,并可以 share 給其他行程,如:SPDK,DPDK 等),因此,Virtio Backend 可以直接訪問并獲取到散列 buffer 的地址、長度,進而直接存取這些散列 buffer,當處理完請求之后,Virtio Backend 將資料填充到相應的 buffer,并將對應的 descriptor table index 寫入 used ring 中,并通過 eventfd 機制注入中斷通知虛機內 virtio 驅動,

2273f9e312d6446d12d9a5eecd1bbffa.png

Vhost

Virtio 技術提出之后,Virtio 設備通常是在 QEMU 里面來進行模擬,資料收發都需要經過 QEMU,再到虛機內部,但逐漸地,開發者們發現,當模擬網卡時,在 QEMU 里面進行資料收發,最終都需要通過系統呼叫的方式,陷入內核來操作網卡硬體進行實際的資料收發,那么,QEMU 到內核的這次背景關系切換以及帶來的額外拷貝開銷,有沒有辦法優化呢?

Linux 內核社區最終在 2010 年合入了 vhost 這個技術來進行優化,通過將 virtio 的資料面 offload 到一個內核執行緒來進行處理,這樣 virtio 通信機制從原本的 QEMU 用戶態 I/O 執行緒和虛機驅動(QEMU 用戶態 vcpu 執行緒)通信變成了 vhost 內核 I/O 執行緒和虛機驅動(QEMU 用戶態 vcpu 執行緒)通信,vhost 內核 I/O 執行緒拿到資料包之后,直接走內核協議堆疊和網卡驅動進行處理,從而優化掉了 QEMU 到內核態的額外開銷,

861bf60db99a50e87028730e7acf1770.png

VFIO

隨著云計算規模的不斷擴大,用戶一方面不再滿足于 Virtio 這類半虛擬化設備帶來的性能體驗,另一方面 GPU 這類很難進行 virtio 化的設備應用場景與日俱增,在這種背景下,VFIO 這項技術被提出并在 2012 年合入 Linux 內核主線,VFIO 全稱是 Virtual Function I/O,它實際是一個用戶態設備驅動框架,相較于更早的 uio 這個用戶態設備驅動框架,VFIO 能夠有效利用硬體 IOMMU 機制進行安全隔離,從而能夠廣泛地應用在云計算這類有多租戶需求的場景中,

e1b483b9d487ea8081f1aac5e3ca9ca5.png

如上圖所示,通過 VFIO,QEMU 能夠直接將自己虛擬出的一個 PCI 設備和一個物理 PCI 設備的資料鏈路直接打通,當虛擬機里面的設備驅動訪問虛擬 PCI 設備的 bar 空間時,通過 EPT 機制,這次 mmio 訪問會被重定向到真實物理設備相應的 bar 空間位置,而不再需要 trap 到 QEMU,這樣,虛機驅動就相當于可以以接近零消耗的方式直接訪問真實物理設備,性能可以達到最佳,同時,VFIO 驅動利用 IOMMU 實作了設備 DMA 和中斷的重映射,一方面起到隔離作用,即某個虛機無法操作 VFIO 直通設備向同一宿主機上的其他虛機發起 DMA 和中斷,一方面也保證了設備進行 DMA 時通過給定的虛機物理地址能夠直接訪問到正確的物理記憶體,

Vhost-user

雖然,VFIO 能夠給虛機帶來接近物理機的 I/O 性能體驗,但該技術仍存在一個缺陷,即不支持熱遷移,帶 VFIO 設備的虛機將沒法像傳統帶 virtio 設備的虛機那樣進行熱遷移,這就使得開發者們,又開始探尋新的既能滿足性能需求又具備運維靈活性的設備虛擬化技術,2014 年 QEMU 社區合入的 vhost-user 技術就是其中之一,由于 QEMU 和 vhost 的執行緒模型對 I/O 性能的優化并不友好,而且由每個虛機單獨分出執行緒來處理 I/O 這種方式從系統全域角度來看可能也并不是最優的,因此,vhost-user 提出了一種新的方式,即將 virtio 設備的資料面 offload 到另一個專用行程來處理,這樣,由于是專用行程,執行緒模型不再受傳統 QEMU 和 vhost 執行緒模型制約,可以任意優化,同時,還可以以 1:M 的方式同時處理多個虛機的 I/O 請求,而且相較于 vhost 這種內核執行緒方式,用戶行程在運維方面更加具備靈活性,vhost-user 框架在提出之初,就受到廣泛關注,并引申出了 SPDK 和 OVS-DPDK 這類以 polling + 用戶態驅動為核心的新的虛機 I/O 服務模型,

6261c6e131b50419f5625475428742f5.png

VFIO-mdev

VFIO 技術在實際應用場景,除了之前提到的不支持熱遷移的問題外,還有一個限制就是一個設備只能透傳給一個虛機,無法做到資源共享,SR-IOV 技術從某種程度上能夠解決這個問題,即將一個物理 PCI 設備從硬體層面進行資源劃分,劃分成多個 VF,透傳給多個虛機進行使用,但是有很多設備可能并不具備 SR-IOV 能力,因此,Linux 內核社區在 2016 年合入了 VFIO-mdev 這個技術框架,希望提供一個標準的介面來幫助設備驅動實作軟體層面的資源切分并能夠利用 VFIO 技術透傳給虛機,

該技術本質上是在內核實作了一個虛擬設備(Mediated device)總線驅動模型,并在 VFIO 內核框架上進行了擴展,增加了對 mdev 這類虛擬設備的支持(mdev bus driver),從原來只支持從標準的硬體 PCI 設備和硬體 platform 設備獲取透傳資訊,比如:PCI bar 空間,變成了既支持直接從硬體設備獲取又可以從 mdev 設備驅動定義的虛擬設備介面來獲取,這樣,比如,當需要將一個 PCI 設備的 bar 空間作為資源切分的話,通過實作合適的 mdev 設備驅動,就可以將 bar 空間以 4KB(頁面大小)為粒度,分別透傳給不同虛機使用,

96233416a17ad7590866112b9eb8778e.png

vDPA

VFIO 和 virtio 這兩類技術一直是最主流的設備虛擬化技術,VFIO 能夠直接將硬體資源透傳給虛機使用,性能最佳,virtio 性能稍遜,但勝在更加靈活,那有沒有可能將兩者的優勢結合起來呢?2020 年被合入 Linux 內核主線的 vDPA 技術框架,就是為了實作這一目標,

vDPA 的全稱是 Virtio Data Path Acceleration,它表示一類設備:這類設備的資料面處理是嚴格遵循 Virtio 協議規范的,即驅動和設備會按照第三節提到的 Virtio 通信流程來進行通信,但控制路徑,比如:通信流程里面提到的 ring buffer 和 descriptor table 的記憶體地址,驅動如何告知設備,設備支持的特性,驅動如何感知,這些都是廠商自定義的,不一定會遵循 Virtio 協議,這樣做的好處是,可以降低廠商在實作這類設備時的復雜度,

Linux 內核為了將這類設備應用起來,就提出了 vDPA 這樣一個技術框架,這個技術框架本質上和 VFIO-mdev 類似,也實作了一個虛擬設備(vDPA device)總線驅動模型,和 VFIO-mdev 不同的是,通過 vDPA 框架虛擬出來的設備,既可以給虛機使用,又可以直接從宿主機(比如:容器)進行訪問,這一切都歸功于,vDPA 設備的資料路徑是遵循 Virtio 協議規范的,因此,可以直接被宿主機上的 virtio 驅動直接訪問,同時,該技術框架對 vhost 內核子系統進行了擴展,賦予了類似 VFIO 技術框架的功能,允許將 vDPA 設備用來進行資料通信的硬體資源(ring buffer, descriptor table,doorbell 暫存器等)透傳給虛機使用,這樣,虛擬機的 virtio 驅動進行資料通信時,也是直接訪問硬體資源,而不再需要通過 vhost、vhost-user 等方式進行處理了,更重要的一點是,由于虛機驅動是原本的 virtio 驅動,因此,當需要支持熱遷移時,QEMU 可以靈活切換會軟體模擬的方式,來保證熱遷移的順利進行,這樣,vDPA 這個設備虛擬化技術框架既保證了最佳性能又保留了 virtio 設備的靈活性,而且還統一了虛機和容器的 I/O 技術堆疊,

eb2ca8541213b189640a249b8ed0060f.png

VDUSE

通過上述 vDPA 技術框架,我們基本解決了長期以來設備虛擬化技術在虛機場景下暴露的一些問題,而更重要的是,它將 virtio 技術也帶到了容器領域,但這個技術框架還存在一個問題,就是需要硬體設備的支持,回想之前提到的 virtio、vhost、vhost-user,本質上都是軟體定義的虛擬設備,那 vDPA 這個技術框架有沒有可能也能夠使用軟體定義的設備呢?VDUSE 這項技術就是用來實作這個目標的,通過 VDUSE,我們可以在一個用戶行程實作一個軟體定義的 vDPA 設備,并可以通過上述 vDPA 框架接入 virtio 或者 vhost 子系統,供容器或者虛機使用,

3eb77592e0fcd81865e863680e4fadde.png

該項技術是由我們自主研發并在去年 10 月向 Linux 內核社區正式開源的,現階段我們的方案已經被合入 Linux 內核主線,將在 Linux 5.15 版本與大家見面,同時,我們也會在 9 月 15 日舉辦的 KVM Forum 這個虛擬化領域的高端技術論壇會議上進行線上分享,

結束語

從服務虛擬機到支持容器,從純軟體模擬到硬體直通再到軟硬體結合,Linux 設備虛擬化技術這幾十年里一直在朝著極致性能、應用靈活等方向不斷演進,隨著云原生的浪潮,各大硬體廠商的入局,全新的軟硬體結合方式不斷涌現,我們相信后續也會有更多精彩技術在等待著我們,

參考鏈接

  1. https://www.ozlabs.org/~rusty/virtio-spec/virtio-paper.pdf

  2. https://www.redhat.com/en/blog/introduction-virtio-networking-and-vhost-net

  3. https://www.kernel.org/doc/html/latest/driver-api/vfio.html

  4. https://gitlab.com/qemu-project/qemu/-/blob/master/docs/interop/vhost-user.rst

  5. https://www.kernel.org/doc/html/latest/driver-api/vfio-mediated-device.html

  6. https://www.redhat.com/en/blog/introduction-vdpa-kernel-framework

  7. https://www.kernel.org/doc/html/latest/userspace-api/vduse.html

  8. https://events.linuxfoundation.org/kvm-forum/program/schedule/

點個在看殺個 Bug ?

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301039.html

標籤:其他

上一篇:面試必問的 Linux 命令幫你整理好啦!

下一篇:【歷史上的今天】9 月 17 日:世界上的第一張火車票;GamerDNA 創始人出生;中國開設第一個網上多媒體講座

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more