小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

 pio9999 2023-01-19 發(fā)布于廣西
2022-03-12 17:29:06 44點(diǎn)贊 245收藏 27評(píng)論

1、寫在開頭:虛擬化直通是個(gè)十分復(fù)雜的過程

虛擬化是個(gè)很復(fù)雜的東西,存在有很多因素會(huì)影響虛擬化的成功與否,并且 Intel 的核顯直通在實(shí)現(xiàn)上就需要處理很多條件,不是一件簡(jiǎn)單的事情,本文章以 Windows 虛擬機(jī)(Windows 10/11 經(jīng)過測(cè)試均可實(shí)現(xiàn))為例介紹該如何實(shí)現(xiàn) Intel 的核顯直通。

本篇文章是作者對(duì)基于 Unraid 平臺(tái)的 QEMU + KVM 虛擬化學(xué)習(xí)的一個(gè)總結(jié),作者沒有軟件工程等相關(guān)的科班本經(jīng),僅僅只是學(xué)習(xí)的一個(gè)總結(jié),目前所得出的結(jié)論仍需要繼續(xù)完善和補(bǔ)充,僅供參考!之所以寫成文章發(fā)表,一方面是想分享所得,另一方面很重要的原因是希望能起到拋磚引玉的作用,希望有更專業(yè)的人士來補(bǔ)充,有錯(cuò)誤的地方請(qǐng)不吝惜指正。

以下是作者 Unraid 系統(tǒng)的軟硬件配置:

  • CPU:i5-8600K

  • 核顯:UHD 630

  • 主板:華擎 Z370M PRO4

  • Unraid 系統(tǒng)版本:6.9.2

  • Linux 內(nèi)核版本: 5.10.28

  • QEMU 版本:5.1.0

  • Libvirt 版本:6.5.0

2、在虛擬化直通上,不能簡(jiǎn)單地將 Intel 的核顯視為一個(gè)嵌入到 CPU 的 GPU

在術(shù)語上,一般稱 Intel 的核顯為 Intel Graphics Device (IGD),下文所有涉及到核顯的地方都會(huì)使用 IGD 這個(gè)縮寫進(jìn)行描述。

之所以這樣說,是因?yàn)樵谔摂M化層面,IGD 并不是一個(gè)“獨(dú)立”的設(shè)備可以隨時(shí)隨地的將其分配給虛擬機(jī)去使用而不需要任何的附加條件,我在查找資料的時(shí)候看到有這么一段話去描述IGD在虛擬化層面的狀況:

IGD clearly is not a discrete GPU, but"integrated" not only means that the GPU is embedded in the system,in this case it means that the GPU is kind of smeared across the system. This is why IGD assignment hasn't "justworked" and why you need a host kernel with support for exposing certainregions through vfio and a BIOS that's aware of IGD, and it needs to be at aspecific address, etc, etc, etc.

翻譯:IGD顯然不是一個(gè)獨(dú)立的GPU,但 "集成"不僅意味著GPU被嵌入到系統(tǒng)中,在這種情況下,它意味著GPU有點(diǎn)像“涂抹”在系統(tǒng)中。這就是為什么IGD的直通沒那么容易實(shí)現(xiàn),以及為什么你需要一個(gè)支持通過 vfio 暴露某些 region 的主機(jī)內(nèi)核和一個(gè)能識(shí)別 IGD 的 BIOS,而且它需要在一個(gè)特定的虛擬化地址,等等。

在下文中,你將看到為了實(shí)現(xiàn) IGD 的直通,可能需要進(jìn)行如下操作:

  • 根據(jù)硬件選擇對(duì)應(yīng)的直通模式(UPT / Legacy);

  • Linux 內(nèi)核、QEMU、Libvirt 的版本不能太舊;

  • 根據(jù)選定的直通模式,有針對(duì)性選擇 Machine 類型(Q35 / i440fx)和 BIOS 類型(SeaBIOS、OMVF);

  • 配置主機(jī) BIOS(UEFI、Leagcu、CMS、Video Option ROM ...);

  • 配置 Linux 內(nèi)核啟動(dòng)參數(shù)(video=vesafb:off,efifb:off);

  • 在 Unraid 中綁定 VFIO 驅(qū)動(dòng)(vfio-pci);

  • 提供 vBIOS (Option ROM / BIOS ROM)給到虛擬機(jī);

  • 編輯虛擬機(jī) Libvirt XML 模板(PCI address、x-igd-opregion、x-igd-gms ...);

  • ............

不同的場(chǎng)景需要有針對(duì)性的配置,每一種配置的背后都有對(duì)應(yīng)的原理,這也就是為什么說IGD的直通并不是一個(gè)簡(jiǎn)單的過程。

3、IGD的直通存在兩種模式,不同的模式需要不同的方式去實(shí)現(xiàn)

根據(jù) qemu 的 Github 官方文檔,這兩種直通的模式分別是:

  • UPT(Universal Passthrough):通用直通模式(我沒專門去查詢正確的譯名,在本文姑且做此翻譯)。此模式要求使用 Intel 的 Broadwell(第五代) 或更新的型號(hào),如果你的 CPU 低于第五代但高于第二代,那么只能使用 Legacy 模式。

  • Legacy:傳統(tǒng)直通模式。此模式要求使用 Intel 的 SandyBridge(第二代) 或更新的型號(hào)。

兩種模式各有自己的優(yōu)勢(shì)和不足,選擇哪一種模式取決于你的CPU情況。

本章節(jié)主要介紹這兩種模式的一些基本情況,至于具體的實(shí)現(xiàn)會(huì)放到后文 unraid 的虛擬機(jī)實(shí)例創(chuàng)建中去具體描述。

3.1:UPT 模式介紹

根據(jù) Intel 所述,此模式需要使用 Intel 的 Broadwell(五代) 或更新的型號(hào),所以如果你的 CPU 不符合此要求(低于第五代但高于第二代),那么只能使用 Leagcy 模式。

在此模式中,IGD 作為第二圖形設(shè)備直通給虛擬機(jī),而主圖形設(shè)備是一個(gè)虛擬化的圖形設(shè)備。

這個(gè)模式的意義在于提供硬件加速給到主圖形設(shè)備,并可配合遠(yuǎn)程桌面軟件去使用(如 VNC),但默認(rèn)情況下此模式不支持物理輸出(即無法輸出視頻信號(hào)到外接顯示器),但可以通過 QEMU 的相關(guān)選項(xiàng)(x-igd-opregion)來開啟物理輸出。

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

相比 Legacy 模式,此模式在 IGD 的外部依賴性上沒有太多的要求,因此如果你只想利用 IGD 的硬件加速功能,并且你的 CPU 型號(hào)不低于五代,那么此模式可能會(huì)比較適合你。

3.2:Legacy 模式介紹

此模式要求使用 Intel 的 SandyBridge(第二代) 或更新的型號(hào)。也就是說如果你的 CPU 型號(hào)低于第五代,但高于或等于第二代的CPU,那么你只能使用 Legacy 模式,例如常見的 i5 4590T、i7 4790等。

在此模式中,IGD 作為第一圖形設(shè)備直通給虛擬機(jī),并且只有這一個(gè)圖形設(shè)備,外接的顯示器會(huì)成為默認(rèn)的物理輸出目標(biāo)(同樣需要 QEMU 的相關(guān)選項(xiàng)來支持物理輸出)。換句話說,不能存在虛擬化圖形設(shè)備,否則可能會(huì)變成 UPT 模式。

4、設(shè)置服務(wù)器的 BIOS ,并根據(jù)實(shí)際情況進(jìn)行調(diào)整

在正式進(jìn)入到 Unraid 之前,我們需要對(duì)主機(jī)的 BIOS 進(jìn)行針對(duì)性的配置。

首先的問題就是:主板 BIOS 設(shè)置對(duì) IGD 的直通有哪些影響?為什么要針對(duì)性配置?要針對(duì)哪些配置進(jìn)行設(shè)置?

對(duì)于 BIOS,我們的著重點(diǎn)是關(guān)于 IGD 的相關(guān)配置,因此我默認(rèn)你已經(jīng)將主板的 VT-d / AMD-V 、IOMMU 等相關(guān)虛擬化開啟,否則將無法使用相關(guān)的虛擬化功能。

4.1:UEFI 啟動(dòng)還是 Legacy BIOS 啟動(dòng)

首先,這兩種啟動(dòng)方式會(huì)影響 VBIOS(Video BIOS) 的加載,所以你要做的第一件事就是確定你的主板是否同時(shí)支持這兩種啟動(dòng)模式,或者說你的主板是否支持 CSM(兼容性支持模塊) 功能。

對(duì)于 UEFI 啟動(dòng)模式,除非你使用的是比較老一些的主板,否則大多數(shù)近些年的主板基本都是支持的。而對(duì)于 Legacy BIOS 這種傳統(tǒng)的啟動(dòng)模式,如果你使用的主板(家用)比較新,而且價(jià)格還比較貴,那么有可能你的主板不會(huì)支持這種模式,因?yàn)樵谥靼鍙S商看來,你都買這么貴的主板了,應(yīng)該會(huì)不需要使用到這種舊的啟動(dòng)模式。所以插句題外話,對(duì)于服務(wù)器,建議慎重購(gòu)買那些比較新的且貴的家用型主板,否則可能會(huì)因?yàn)槿狈δ承┲С侄鵁o法實(shí)現(xiàn)本文所述的 IGD 直通。至于這兩種啟動(dòng)方式的區(qū)別,請(qǐng)大家自行百度。

4.1.1:那么,什么是 VBIOS?

VBIOS 是顯卡或集成圖形控制器(IGD)的 BIOS。與系統(tǒng) BIOS 一樣,BIOS 提供了一系列功能以便程序能夠訪問系統(tǒng)的硬件,而 VBIOS 也提供了一系列與視頻有關(guān)的功能供程序訪問視頻硬件(IGD)。VBIOS 將軟件與視頻芯片組連接起來,其方式與系統(tǒng)BIOS對(duì)系統(tǒng)芯片組的作用相同。

BIOS(basic input/output system,基本輸入輸出系統(tǒng),也被稱為System BIOS、ROM BIOS或PC BIOS)是 CPU 在接通電源后用來啟動(dòng)計(jì)算機(jī)系統(tǒng)的程序,是用于在啟動(dòng)過程中執(zhí)行硬件初始化(開機(jī)啟動(dòng))的固件,并為操作系統(tǒng)和程序提供運(yùn)行時(shí)服務(wù),它還負(fù)責(zé)計(jì)算機(jī)操作系統(tǒng)與設(shè)備(如硬盤、顯卡、鍵盤鼠標(biāo)和打印機(jī)等)之間的數(shù)據(jù)流。

VBIOS 是 Option ROM 中的一種:Option ROM (或縮寫為 OpROM) 是由 BIOS 在電腦啟動(dòng)時(shí)所運(yùn)行的固件,它們通常存儲(chǔ)在設(shè)備或主板的 BIOS 中。

Option ROM 本質(zhì)上是一個(gè)驅(qū)動(dòng),負(fù)責(zé) BIOS 和硬件之間的溝通,Option ROM 可能由主板的 BIOS 提供,也有可能由硬件設(shè)備自身進(jìn)行提供(因?yàn)橹靼宓腂IOS不太可能會(huì)包含所有設(shè)備的 Option ROM,所以往往就需要設(shè)備自己進(jìn)行提供),這些設(shè)備包括網(wǎng)卡、顯卡或硬盤等。

而 VBIOS 就是 Option ROM 中的一種 —— 是顯卡與 BIOS 之間進(jìn)行溝通的橋梁,它會(huì)在計(jì)算機(jī)啟動(dòng)時(shí)進(jìn)行加載,Video BIOS 會(huì)向 BIOS 和操作系統(tǒng)提供相關(guān)的顯示服務(wù)。也就是說,如果 VBIOS 不能正確加載,那么就會(huì)直接影響 IGD 的正常使用,進(jìn)行影響 IGD 的虛擬機(jī)直通。

4.1.2:那么 VBIOS 跟我們這里說的 UEFI 或 Legacy 啟動(dòng)模式有什么關(guān)系?

在于不同的啟動(dòng)方式可能會(huì)對(duì) VBIOS 的加載結(jié)果有直接影響(因?yàn)橛行?VBIOS 可能不支持 UEFI 或 Legacy 啟動(dòng),但是這個(gè)過程我也不是很清楚,這個(gè)觀點(diǎn)僅僅支持作者自己得出,希望大家?guī)图m正),也就說選擇了不同的啟動(dòng)方式,可能會(huì)對(duì) IGD 直通有影響。

在此因素的影響下,保守的做法一般是采用 Legacy 啟動(dòng)方式,或者說如果你的主板支持 CSM(兼容性支持模塊) 模塊,你也可以在采用 UEFI 啟動(dòng)的情況下,將 Option ROM Policy 設(shè)置為 “僅傳統(tǒng)”:

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

如果你的主板不支持 Legacy 啟動(dòng)或者說不支持 CSM 模塊,那么在這里就沒有可選擇的余地,只能采用 UEFI 啟動(dòng)(但并不是說就因此無法實(shí)現(xiàn) IGD 的直通,而是說如果能有多一點(diǎn)的選擇,那可選擇的余地更大,所以才建議買主板的時(shí)候需要慎重選擇)。

但需要重申的是,并不是說為了 IGD 直通的實(shí)現(xiàn)一定要采用某一個(gè)啟動(dòng)方式(UEFI 或 Legacy),不同的硬件產(chǎn)生的影響是不一樣的,所以我建議可以嘗試先采用 Legacy 啟動(dòng)方式(或者在 CSM 設(shè)置中使用 Legacy 模式去加載 Option ROM)去啟動(dòng) Unraid,然后去測(cè)試 IGD 的直通,然后有需要再去測(cè)試 UEFI 啟動(dòng)的形式。

4.2:將“主圖形適配器”設(shè)備設(shè)置為核顯(IGD)

不同的 BIOS 可能在名字上有區(qū)別,需要根據(jù)你的主板設(shè)置進(jìn)行判斷:

如果不將主圖行設(shè)備設(shè)置為 IGD,那么會(huì)直接影響 Option ROM 的加載。

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

4.3:共享內(nèi)存、IGPU 多監(jiān)視器

請(qǐng)將共享內(nèi)存調(diào)制最大(不要設(shè)置成自動(dòng)),并啟用 “IGPU 多監(jiān)視器”(不啟用就意味著禁用核顯,不同的 BIOS 名稱不一樣,請(qǐng)根據(jù)你自己的情況查找此選項(xiàng)):

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

顯卡共享內(nèi)存就是顯卡在本地顯存不夠用的情況下,動(dòng)態(tài)調(diào)用內(nèi)存作為顯存使用的那部分內(nèi)存。此設(shè)置我建議設(shè)置成最大,因?yàn)樵诤竺嫒プ鲋蓖〞r(shí),虛擬機(jī)的操作系統(tǒng)會(huì)因此受到影響。

5、Unraid 上的設(shè)置:使用 6.9.x 版本,VFIO驅(qū)動(dòng)綁定,內(nèi)核啟動(dòng)參數(shù)配置

5.1:建議使用 6.9.x 版本的 Unraid

之所以強(qiáng)調(diào)版本,是因?yàn)檩^新的版本所使用的 Linux 內(nèi)核、QEMU、Libvirt 等版本也會(huì)更新,對(duì)于 IGD 的直通來說,要求使用 Linux 4.6 及以上版本的內(nèi)核,QEMU 使用 2.7 及以上的版本。以作者的 Unraid 6.9.2 版本來說,Linux 使用的是 5.10.28 版本的內(nèi)核,QEMU 使用的是 5.1.0 版本,是可以滿足 IGD 的直通條件的。

5.2:將 IGD 綁定到 vfio-pci 驅(qū)動(dòng)

什么是 VFIO:Virtual Function I/O (VFIO) 是一種現(xiàn)代化的設(shè)備直通方案,它充分利用了VT-d/AMD-Vi技術(shù)提供的DMA Remapping和Interrupt Remapping特性, 在保證直通設(shè)備的DMA安全性同時(shí)可以達(dá)到接近物理設(shè)備的I/O的性能。 用戶態(tài)進(jìn)程可以直接使用VFIO驅(qū)動(dòng)直接訪問硬件,并且由于整個(gè)過程是在IOMMU的保護(hù)下進(jìn)行因此十分安全, 而且非特權(quán)用戶也是可以直接使用。 換句話說,VFIO是一套完整的用戶態(tài)驅(qū)動(dòng)(userspace driver)方案,因?yàn)樗梢园踩匕言O(shè)備I/O、中斷、DMA等能力呈現(xiàn)給用戶空間。

vfio-pci 是 VFIO 對(duì) pci 設(shè)備驅(qū)動(dòng)的統(tǒng)一封裝,具體包括 PCI 配置空間模擬、PCI Bar 空間重定向,Interrupt Remapping等。

vfio-pci 會(huì)調(diào)用物理主機(jī)上的 PCI 設(shè)備驅(qū)動(dòng)(pci bus driver)實(shí)現(xiàn)設(shè)備注冊(cè)和注銷等操作,這里的驅(qū)動(dòng)就正是我們上面第4章所說到的 VBIOS(Option ROM),如果給到 vfio-pci 的設(shè)備驅(qū)動(dòng)無法正常使用,那么就會(huì)直接導(dǎo)致設(shè)備直通無法成功實(shí)現(xiàn)。

對(duì)于 Unraid(6.9.2版本) 來說,由于集成了“VFIO-PCI CFG”插件,所以我們可以直接在“TOOLS —— System Devices”中進(jìn)行綁定,綁定設(shè)置之后需要重啟 Unraid 生效(但此時(shí)請(qǐng)先不要重啟,因?yàn)槲覀冞€沒講完后面的操作,我們還需要配置一些 Linux 內(nèi)核參數(shù)):

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

勾選 IGD 后點(diǎn)擊“BIND SELECTED xxx”勾選 IGD 后點(diǎn)擊“BIND SELECTED xxx”

5.3:內(nèi)核啟動(dòng)參數(shù)配置

5.3.1:為什么組要配置內(nèi)核啟動(dòng)參數(shù)

在說明原因之前,首先需要說明下什么是 i915:i915 是 Linux 內(nèi)核中調(diào)用 intel 核顯的內(nèi)核驅(qū)動(dòng)(字母 i 就代表的是 Intel,915 代表的是芯片組代號(hào),但這里不需要強(qiáng)調(diào)),我們?cè)?Linux 上使用 IGD 就是通過 i915 驅(qū)動(dòng)模塊來進(jìn)行。

所以你會(huì)看到社區(qū)里的一些關(guān)于 Jellyfin、Emby 之類的影音教程文章時(shí),會(huì)提到關(guān)于 i915 模塊的一些設(shè)置,目的就是為了加載此模塊來使用 IGD 的硬件加速:

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

那么言歸正傳,由于我們需要將 IGD 直通給到虛擬機(jī),那么我們?cè)趯?IGD 給到虛擬機(jī)之前就需要盡可能保證沒有其他諸如 i915 之類的驅(qū)動(dòng)綁定到 IGD 上,取消相關(guān)驅(qū)動(dòng)對(duì) IGD 的控制。

我在開頭講過,IGD 的直通是一件很復(fù)雜的過程(雖然我們可能感受不到),IGD 如同“涂抹”在系統(tǒng)上,是因?yàn)橛捎?Intel 自身設(shè)計(jì)的原因,驅(qū)動(dòng)層面的調(diào)用關(guān)系比較錯(cuò)綜復(fù)雜,如同我們這里提到的 i915——我們要確保在 Unraid 中解除 i915 對(duì) IGD 的綁定,然后才能順利地將 IGD 直通給虛擬機(jī),因?yàn)槲覀內(nèi)绻贿@樣做,那么在 IGD 直通給虛擬機(jī)后, i915 會(huì)在與 IGD 的“綁定”與“解綁定”這一過程中容易出現(xiàn)錯(cuò)誤,甚至嚴(yán)重的時(shí)候會(huì)導(dǎo)致系統(tǒng)崩潰(產(chǎn)生這種結(jié)果跟 Linux 的內(nèi)核有很大關(guān)系,因此才建議使用新一點(diǎn)的 Unraid 版本)。

解綁的方法有不少,但我們已經(jīng)使用了其中一個(gè) —— 那就是前面的 vfio-pci 綁定,我們通過在 Unraid 中使用 VFIO-PCI CFG 工具將 VFIO 驅(qū)動(dòng)綁定到了 IGD,那么這個(gè)過程實(shí)際上也會(huì)將 i915 對(duì) IGD 的綁定進(jìn)行解綁。除了這種方式外,也有其他諸如下圖中的方式,相信你在社區(qū)的其他教程中也看到過(使用 modprobe.blacklist 內(nèi)核啟動(dòng)參數(shù)命令,或者也可以在 Unraid 的/etc/modprobe.d/文件中來編輯),類似的方法就不一一介紹了:

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

5.3.2:要配置哪些內(nèi)核啟動(dòng)參數(shù)

前面通過 i915 驅(qū)動(dòng)模塊舉例說明了在 Linux 中驅(qū)動(dòng)對(duì) IGD 的調(diào)用,但在 Linux 中不僅僅只有 i915 這一驅(qū)動(dòng)需要調(diào)用 IGD,其他的一些層級(jí)沒有 i915 這么高的驅(qū)動(dòng)實(shí)際上也在調(diào)用 IGD —— 其中以 vesafb 和 efifb 為甚。

  • vesafb:VESA Framebuffer(在使用傳統(tǒng)的 BIOS 啟動(dòng)時(shí)會(huì)采用此驅(qū)動(dòng));

  • efifb:EFI Framebuffer(在使用 UEFI 啟動(dòng)時(shí)會(huì)采用此驅(qū)動(dòng));

這兩者都是 Framebuffer,根據(jù)啟動(dòng)方式的不同,Linux 所使用的 Framebuffer 也不同。

Linux圖形棧之Framebuffer驅(qū)動(dòng):framebuffer就是幀緩存,也就是說開發(fā)者希望將圖像寫入幀緩存,就能看到顯示設(shè)備上的圖像,就是這么簡(jiǎn)單,而不必關(guān)心系統(tǒng)與底層顯示設(shè)備的操作。

如果不取消綁定,那么當(dāng)你在直通 IGD 給到虛擬機(jī)時(shí),你可能會(huì)看到虛擬機(jī)的運(yùn)行日志中出現(xiàn)如下信息:

Failed to mmap 0000:00:02.0 BAR <>. Performance may be slow

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

這就說明 vesafb 或 efifb 沒有取消對(duì) IGD 的綁定,因此你需要在 Unraid 的內(nèi)核啟動(dòng)參數(shù)中添加如下參數(shù):

video=vesafb:off,efifb:off

或者

video=vesafb:off video=efifb:off

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

那么以上就是 Linux 內(nèi)核啟動(dòng)參數(shù)中需要配置的參數(shù)了。

需要特別說明的是,你也許會(huì)在別的教程中看到在 Unraid 的內(nèi)核啟動(dòng)參數(shù)中配置了很多的參數(shù),比如我從社區(qū)里面拷貝了如下參數(shù):

append vfio-pci.ids=8086:a370,8086:a304,8086:a348,8086:a323,8086:a324,8086:15bc,8086:3e92 isolcpus=0-1 pcie_acs_override=downstream,multifunction vfio_iommu_type1.allow_unsafe_interrupts=1 modprobe.blacklist=i2c_i801,i2c_smbus,snd_hda_intel,snd_hda_codec_hdmi,i915,drm,drm_kms_helper,i2c_algo_bit video=efifb:off,vesafb:off vfio_iommu_type1.allow_unsafe_interrupts=1 initrd=/bzroot

首先,上述的配置我認(rèn)為有些內(nèi)容可能(我說的是可能)是沒有必要的,比如說 modprobe.blacklist=snd_xxx_xxx ,snd 模塊指的是 Linux 中的板載聲卡驅(qū)動(dòng)模塊,用來調(diào)用板載聲卡。

我們上面講過,像 i915 這樣的驅(qū)動(dòng)在對(duì) IGD 的綁定與解綁定上可能會(huì)產(chǎn)生錯(cuò)誤,但除了 i915 之外,大多數(shù)相關(guān)設(shè)備的驅(qū)動(dòng) —— 就好比這里的 snd 驅(qū)動(dòng),在虛擬機(jī)直通中的綁定與解綁定中往往能夠得到很好的處理,換句話說就是如果你將板載的聲卡直通給虛擬機(jī),那么你往往不需要做什么額外的參數(shù)配置(當(dāng)然,將板載聲卡通過 VFIO 綁定是必不可少的),因?yàn)?VFIO 能夠很好的處理聲卡驅(qū)動(dòng)的綁定與解綁定。

我通過這個(gè)例子想告訴大家的是,盡量不要直接將他人的參數(shù)直接照搬過來放到自己的 Unraid 配置上,因?yàn)椴煌牡讓游锢碛布枰褂貌煌牟呗?,沒有一個(gè)固定的公式來去解決問題

所以我建議的是采用固定變量的原則去一點(diǎn)點(diǎn)排查問題,不單是這里的內(nèi)核參數(shù)配置,還包括后面所說的一些內(nèi)容。

6:不同直通模式下的虛擬機(jī)配置思路

在本章,我會(huì)介紹在兩種不同的直通模式下的虛擬機(jī)配置思路和建議,包括如何選擇 Machine 類型和 BIOS 類型等,只談思路和相關(guān)的原理,具體完整的參考配置請(qǐng)見“7、不同直通模式下的 Windows 10/11 系統(tǒng)虛擬機(jī)參考配置”。

在開頭說過,IGD 的直通存在 UPT 和 Legacy 兩種模式,這兩種模式各有自己的優(yōu)點(diǎn)和缺點(diǎn),并且更重要的是這兩模式對(duì) CPU 有要求,前者只能使用五帶及更新的型號(hào),后者只能使用二代及更新的型號(hào)。

不同的直通模式對(duì)虛擬機(jī)的參數(shù)配置有直接的影響,除此之外,以下兩個(gè)因素還會(huì)產(chǎn)生影響的影響:

  • Machine Type:Q35 和 i440fx(兩者的一些區(qū)別請(qǐng)大家自行百度,在本文就不做描述了)

  • BIOS Type:SeaBIOS 和 OMVF

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

SeaBIOS 與 OMVF:這兩個(gè)都是 BIOS,作用也跟 BIOS 一樣,都是用來初始化相關(guān)的設(shè)備,只不過是應(yīng)用在虛擬機(jī)上。前者就相當(dāng)于我們前面所說的 Legacy BIOS,后者就相當(dāng)于 UEFI,不同的應(yīng)用場(chǎng)景應(yīng)該選擇不同的 BIOS 類型。

我分別在兩種直通模式的基礎(chǔ)上,基于我現(xiàn)有的硬件,測(cè)試了不同的 Machine 和 BIOS 類型(見下圖,但請(qǐng)勿參照?qǐng)D片的內(nèi)容,因?yàn)樵谧髡邔懕酒恼碌臅r(shí)候,表格內(nèi)的數(shù)據(jù)未經(jīng)整理和矯正):

請(qǐng)勿參考本圖片的內(nèi)容,圖片的內(nèi)容未經(jīng)整理、矯正請(qǐng)勿參考本圖片的內(nèi)容,圖片的內(nèi)容未經(jīng)整理、矯正

在我測(cè)試結(jié)果的基礎(chǔ)上,我會(huì)在下文提供給大家針對(duì)不同模式的虛擬機(jī)參數(shù)配置,但僅供參考,僅供參考,僅供參考!

6.1:UPT 直通模式的虛擬機(jī)參數(shù)配置思路(僅供參考)

如果你的 CPU 等于或高于第五代 CPU,那么我建議采用 UPT 模式進(jìn)行直通,并可以參考以下設(shè)置:

  • Machine Type:Q35

  • BIOS:OMVF

  • 內(nèi)存:請(qǐng)選擇4G以上的內(nèi)存,等調(diào)試好系統(tǒng)之后再看情況進(jìn)行增減

這里我選擇6G的內(nèi)存這里我選擇6G的內(nèi)存

前面我們說過,UPT 模式下 IGD 作為第二個(gè)圖形設(shè)備傳遞給虛擬機(jī),因此對(duì)于 IGD 和虛擬圖形的設(shè)備如下:

新增第二個(gè)圖形設(shè)備,并選擇 IGD新增第二個(gè)圖形設(shè)備,并選擇 IGD

其他的比如設(shè)置硬盤大小、選擇安裝鏡像這些我就不贅述了,請(qǐng)大家自行配置。

當(dāng)你配置完相關(guān)設(shè)置后,請(qǐng)不要勾選創(chuàng)建后啟動(dòng)虛擬機(jī):

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

我們創(chuàng)建好虛擬機(jī)后,使用 XML 試圖去進(jìn)行編輯:

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

拖動(dòng)編輯框到最底部,可以看到關(guān)于 IGD 的 XML 配置:

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

<hostdev mode='subsystem' type='pci' managed='yes'>

<driver name='vfio'/>

<source>

<address domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>

</source>

<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>

</hostdev>

<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>:這一段的配置指的是 IGD 在虛擬機(jī)的 PCI bus 總線中的地址,被設(shè)置到了 00:02.0 的位置。

這里我需要重點(diǎn)解釋一下 00:02.0 的 pci bus 位置,如果 IGD 被分配到了這一位置,那么會(huì)激活 Legacy 直通模式,因?yàn)?Legacy 模式下要求 IGD 的 pci bus 位置需要使用 00:02.0。因此,如果不修改這一地址,那么當(dāng)你在運(yùn)行虛擬機(jī)后,運(yùn)行日志會(huì)有這樣一行提示:

pci, host=0000:00:02.0, id=hostdev0, bus=pcie, addr=0x2 : IGD device 0000:00:02.0 cannot support legacy mode due to existing devices at address 1f.0

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

我們可以明顯的看到“cannot support legacy mode ...”(翻譯:不支持 legacy 模式)的提示,這就是因?yàn)槲覀儧]有更改默認(rèn)的 IGD pci bus 地址所導(dǎo)致,以至于激活了 Legacy 模式,但 Q35 模型是不支持 Legacy 直通模式的,所以才會(huì)出現(xiàn)此錯(cuò)誤。但不是說在 Q35 模式下 Legacy 模式就不能使用了,在作者做測(cè)試的時(shí)候,即使出現(xiàn)此提示也依然能夠?qū)崿F(xiàn) IGD 的直通,具體背后邏輯我目前也不清楚。

同時(shí),這行提示的后半句還說明了不支持的原因 ——“cannot support legacy mode due to existing devices at address 1f.0”(翻譯:由于位于 1f.0 位置的設(shè)備,導(dǎo)致了無法支持 legacy 模式),那么為什么 1f.0 位置設(shè)備會(huì)導(dǎo)致 Legacy 模式無法實(shí)現(xiàn)?

那是因?yàn)閷?duì)于 Legacy 直通模式來說,除了 IGD 設(shè)備必須指定在 00:02.0 位置之外,于此同時(shí)還有一個(gè)條件:必須要保證在 00:1f.0 的 pci bus 位置創(chuàng)建 LPC/ISA Bridge,但是對(duì)于 Q35 模型來說 00:1f.0 位置并不是用來創(chuàng)建 LPC/ISA Bridge 的,此地址作為 Q35 模型的保留地址不能隨意編輯,所以才導(dǎo)致了“cannot support legacy mode due to existing devices at address 1f.0”的提示。

但 i440fx 模型不存在此問題,因?yàn)榇四P涂梢栽?00:1f.0 位置上創(chuàng)建它的 LPC/ISA Bridge,所以你不會(huì)在該模型的虛擬機(jī)日志中看到這樣的提示。

那么解決辦法是什么?

  1. 修改 IGD 的 pci bus 位置。可以將 <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> 中的 slot='0x02' 修改成 slot='0x04' 或 slot='0x05' 都是可以的,但前提是不能跟現(xiàn)有的其他設(shè)備的 pci bus 位置沖突,否則會(huì)報(bào)錯(cuò),如果報(bào)錯(cuò)了,請(qǐng)嘗試將 slot='0x02' 中的數(shù)字 2 改成其他更大一點(diǎn)的數(shù)值。所以你可以將整個(gè) XML 復(fù)制到文本編輯器中,然后使用查找功能去檢索你修改好的 bus='0x00' slot='0x0?' 地址是否跟其他設(shè)備的地址有沖突,然后再?gòu)?fù)制回去。

  2. 并且還需要保證 IGD 的 pci bus 位置要低于虛擬化圖形設(shè)備的 pci bus 地址,這是 UPT 模式的一個(gè)特點(diǎn)。不過默認(rèn)情況下創(chuàng)建出來 XML 配置,虛擬化圖形設(shè)備的 PCI bus 會(huì)低于 IGD,所以我們一般只需要更改 IGD 的地址即可。

假設(shè)我們最終修改 IGD 的 pci bus 地址如下(僅供參考):

<hostdev mode='subsystem' type='pci' managed='yes'>

<driver name='vfio'/>

<source>

<address domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>

</source>

<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>

</hostdev>

修改好之后,點(diǎn)擊 Update 即可,之后即可正常安裝 Windows 并安裝 IGD 的顯卡驅(qū)動(dòng):

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

6.2:Legacy 直通模式的虛擬機(jī)參數(shù)配置思路(僅供參考)

Legacy 直通模式的實(shí)現(xiàn)是最復(fù)雜的,在這一小節(jié)我會(huì)花多點(diǎn)文字盡可能講清楚其中的邏輯。

如果你的 CPU 高于第二代但低于第五代 CPU,那么你只能采用 Legacy 模式進(jìn)行直通,并可以參考以下設(shè)置:

  • Machine Type:i440fx

  • BIOS:SeaBIOS

  • 內(nèi)存:請(qǐng)選擇4G以上的內(nèi)存,等調(diào)試好系統(tǒng)之后再看情況進(jìn)行增減

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

  • 圖形設(shè)備選擇 IGD,且只有這一個(gè)圖形設(shè)備:但是在你還沒有安裝系統(tǒng)前,請(qǐng)不要將圖形設(shè)備設(shè)置成 IGD,請(qǐng)使用虛擬化的圖形設(shè)備(VNC)去安裝系統(tǒng),調(diào)試好系統(tǒng)后再將圖形設(shè)備更改成 IGD,然后再通過遠(yuǎn)程桌面的形式去安裝 IGD 驅(qū)動(dòng)等。

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

設(shè)置好上述配置后,在后續(xù)你可能大概率需要:

  • 準(zhǔn)備一個(gè) VBIOS ROM(我會(huì)提供到網(wǎng)盤下載,見文章末尾,但請(qǐng)看完本小節(jié))

  • 配置虛擬機(jī) XML ,添加 QEMU 參數(shù),解決 IGD 大量占用系統(tǒng)內(nèi)存的問題(附加說明如何開啟物理視頻輸出到外接顯示器)

6.2.1:為什么需要準(zhǔn)備 VBIOS ROM?

重要聲明:當(dāng)用于IGD直通時(shí),使用 VBIOS ROM 可能會(huì)損壞你的顯示器(因?yàn)闀?huì)產(chǎn)生 bad pixel clock)!作者不對(duì)任何顯示器的損壞負(fù)責(zé),請(qǐng)謹(jǐn)慎操作!

重要聲明:當(dāng)用于IGD直通時(shí),使用 VBIOS ROM 可能會(huì)損壞你的顯示器(因?yàn)闀?huì)產(chǎn)生 bad pixel clock)!作者不對(duì)任何顯示器的損壞負(fù)責(zé),請(qǐng)謹(jǐn)慎操作!

重要聲明:當(dāng)用于IGD直通時(shí),使用 VBIOS ROM 可能會(huì)損壞你的顯示器(因?yàn)闀?huì)產(chǎn)生 bad pixel clock)!作者不對(duì)任何顯示器的損壞負(fù)責(zé),請(qǐng)謹(jǐn)慎操作!

我在前面的“4、服務(wù)器的 BIOS 配置”提到了關(guān)于 VBIOS 的 Option ROM 相關(guān)信息:主板的 BIOS 需要在電腦啟動(dòng)的時(shí)候去加載 IGD 的 VBIOS(Option ROM的一種),以便正確初始化 IGD 給到操作系統(tǒng)去使用。那么在這里,還需要補(bǔ)充一個(gè)知識(shí):Shadow RAM(或也稱為 ROM Shadow)。

百度百科:在機(jī)器上電時(shí),將自動(dòng)地把系統(tǒng)BIOS、顯示BIOS(VBIOS)及其它適配器的BIOS裝載到Shadow RAM 的指定區(qū)域中。由于Shadow RAM的物理編址與對(duì)應(yīng)的ROM相同,所以當(dāng)需要訪問BIOS時(shí), 只需訪問Shadow RAM即可,而不必再訪問ROM。

如果物理主機(jī)采用 UEFI 啟動(dòng)模式,那么當(dāng) BIOS 在加載 VBIOS 時(shí),會(huì)將 VBIOS “復(fù)制”(shadow)一份到 RAM 中,那么這一份復(fù)制出來的 VBIOS 將來就會(huì)給到操作系統(tǒng)(Linux)去使用,但這個(gè)復(fù)制出來的 VBIOS 并不是真正的 VBIOS,甚至可能是“殘缺”的、不完整的。

因此,如果虛擬機(jī)的 BIOS 不能正常加載,那么我們就需要單獨(dú)提供一個(gè) VBIOS 文件給到虛擬機(jī)去使用,以便虛擬機(jī)的 BIOS(SeaBIOS 或 OMVF)能夠正常加載,否則即使虛擬機(jī)能夠啟動(dòng)也會(huì)在 Windows 的設(shè)備管理器中出現(xiàn)顯卡驅(qū)動(dòng) 43 錯(cuò)誤的情況。

虛擬機(jī) BIOS 不能正常加載的常見的情況之一就是VNC黑屏,且某一個(gè)CPU核心滿載。

就作者自身的硬件情況,我用此 ROM 文件可以解決此問題(如果無法下載,請(qǐng)看文章最末尾的網(wǎng)盤地址),但因?yàn)椴煌挠布闆r,此 ROM 文件不一定能解決所有的問題:

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

在 Github 上也有其他的一些作者提供 ROM 文件,但我沒嘗試過這些 ROM 文件是否可以解決所提到的問題,這里就不一一介紹了,請(qǐng)自行根據(jù)下面的項(xiàng)目名稱搜索(社區(qū)規(guī)定不能直接放鏈接),請(qǐng)謹(jǐn)慎嘗試

  • gk41-pve-ovmf

  • i915ovmfPkg

6.2.2:ROM 文件要如何給到虛擬機(jī)使用?

將 ROM 文件上傳至 Unraid 之后,在虛擬機(jī)編輯界面的 “Graphics ROM BIOS” 選擇對(duì)應(yīng)的 ROM 文件即可:

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

6.2.3:虛擬機(jī)的 Windows 出現(xiàn)內(nèi)存占用大的情況如何解決?

你可能會(huì)遇到 Windows 系統(tǒng)內(nèi)存被大量占用的情況,比如社區(qū)里就有作者提到此類問題,并也提供解決辦法:

那么解決辦法也很簡(jiǎn)單,按照下圖將 QEMU 選項(xiàng)添加進(jìn) XML 模板即可:

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

<qemu:commandline>

<qemu:arg value='-set'/>

<qemu:arg value='device.hostdev0.x-igd-gms=1'/>

</qemu:commandline>

根據(jù) vfio/pci-quirks: Set non-zero GMS memory size for IGD 的說法,之所以會(huì)出現(xiàn)內(nèi)存占用高的問題是因?yàn)?Windows 10( 11 也有此類問題)的驅(qū)動(dòng)問題所導(dǎo)致,使用上述的配置后,大約可以釋放出 4G 左右的內(nèi)存:

There is a claim that GMS memory is unused however Intel Windows 10 drivers starting from V.4534 (10/7/2016) allocate extra ~4G memory when GMS size set to 0.

6.2.4:如何實(shí)現(xiàn)虛擬機(jī)畫面的物理輸出?

你也許注意到了,在上面的那一章解決內(nèi)存占用大的社區(qū)文章中,還有這樣一段配置:

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

<qemu:arg value='-set'/>

<qemu:arg value='device.hostdev0.x-igd-opregion=on'/>

x-igd-opregion=on:根據(jù) ArchWiki: Intel GVT-g 的說明,此段代碼的作用是 retrieve the display contents from the virtual GPU by Using DMA-BUF display ,也就是實(shí)現(xiàn)物理輸出。

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

之所以需要配置此參數(shù),是因?yàn)橐粋€(gè)特殊的內(nèi)存區(qū)域 OpRegion ( x-igd-opregion 中的 opregion,但這個(gè)內(nèi)存區(qū)域到底是什么我也不知道)需要提供到虛擬機(jī)的操作系統(tǒng)驅(qū)動(dòng)。這個(gè)內(nèi)存區(qū)域需要在虛擬機(jī)的 BIOS 初始化 PCI 設(shè)備的時(shí)候通過 QEMU 的 fw_cfg 接口進(jìn)行暴露,從而實(shí)現(xiàn)物理輸出。

因此,如果你想實(shí)現(xiàn) IGD 的物理輸出,就需要加上此參數(shù)。那么在配合結(jié)合上面所說到的內(nèi)存占用大的問題同時(shí),完整的 XML 格式如下:

<qemu:commandline>

<qemu:arg value='-set'/>

<qemu:arg value='device.hostdev0.x-igd-opregion=on'/>

<qemu:arg value='-set'/>

<qemu:arg value='device.hostdev0.x-igd-gms=1'/>

</qemu:commandline>

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

需要做補(bǔ)充的是,之所以需要 QEMU 的相關(guān)選項(xiàng)來支持物理輸出,是因?yàn)檫@些年 Intel 沒有對(duì) GVT-g 做更進(jìn)一步的支持,x-igd-opregion=on 只作為一個(gè)實(shí)驗(yàn)性的選項(xiàng)可用(x 就代表的是 “experimental 實(shí)驗(yàn)性的”),如果將來某天 Intel 在這一塊跟進(jìn)了,就不再需要添加這選項(xiàng)來實(shí)現(xiàn)物理輸出了。

7、不同直通模式下的 Windows 10/11 系統(tǒng)虛擬機(jī)參考配置

好了,聊了那么多,這里作者提供兩個(gè)根據(jù)不同直通模式下的虛擬機(jī) Windows 系統(tǒng)的配置例子。

以下配置在作者自身硬件之上可以正確實(shí)現(xiàn) IGD 的直通,但每個(gè)人的硬件狀況不同,軟件配置也不一樣,因此以下內(nèi)容僅供參考!

但物理顯示輸出未經(jīng)測(cè)試,請(qǐng)自行嘗試。

7.1:如果你的 CPU 型號(hào) ≥ 第五代 CPU,那么建議你選擇 UPT 直通模式

以下配置經(jīng)過作者自身進(jìn)行測(cè)試,根據(jù)我自己的硬件情況,以下配置不需要提供 ROM 文件也可以實(shí)現(xiàn)正常的直通,且也沒有內(nèi)存占用高的問題。

如果使用 ROM 文件,請(qǐng)謹(jǐn)慎操作!因?yàn)槭褂?VBIOS 可能會(huì)損害的顯示器,作者不對(duì)此負(fù)責(zé)!

如果使用 ROM 文件,請(qǐng)謹(jǐn)慎操作!因?yàn)槭褂?VBIOS 可能會(huì)損害的顯示器,作者不對(duì)此負(fù)責(zé)!

如果使用 ROM 文件,請(qǐng)謹(jǐn)慎操作!因?yàn)槭褂?VBIOS 可能會(huì)損害的顯示器,作者不對(duì)此負(fù)責(zé)!

參考的配置如下:

  • CPU:根據(jù)你的情況來

  • Machine:Q35-5.1

  • BIOS:OMVF

  • 內(nèi)存:6G(選擇4G以上,原因是因?yàn)榕聲?huì)出現(xiàn)上面所說到的內(nèi)存占用大的問題,但我自己測(cè)試沒有遇到)

  • 添加 IGD 作為第二個(gè)圖形設(shè)備(初次嘗試時(shí)請(qǐng)不要設(shè)置 ROM 文件,如果無法直通再進(jìn)行嘗試

  • 如果出現(xiàn)內(nèi)存占用大的情況,或者說需要實(shí)現(xiàn)物理輸出,請(qǐng)參考上文的內(nèi)容編輯 XML 模板來添加 QEMU 選項(xiàng)(x-igd-opregion=on,x-igd-gms=1);

  • 其他選項(xiàng)例如虛擬硬盤大小、安裝鏡像等請(qǐng)自行配置;

配置如下圖所示:

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

XML 配置如下:

<domain>

......

<devices>

....

<graphics type='vnc' port='-1' autoport='yes' websocket='-1' listen='0.0.0.0' keymap='en-us'>

<listen type='address' address='0.0.0.0'/>

</graphics>

<video>

<model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>

<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>

</video>

<hostdev mode='subsystem' type='pci' managed='yes'>

<driver name='vfio'/>

<source>

<address domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>

</source>

<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>

</hostdev>

<memballoon model='none'/>

</devices>

</domain>

7.2:如果你的 CPU 型號(hào) ≥ 第二代但小于第五代,那么你只能選擇 Legacy 直通模式

以下配置經(jīng)過作者自身進(jìn)行測(cè)試,根據(jù)我自己的硬件情況,需要提供 ROM 文件并編輯虛擬機(jī)的 XML 模板來配置相關(guān) QEMU 選項(xiàng),否則無法實(shí)現(xiàn) IGD 直通與物理顯示輸出。

如果你和我一樣出現(xiàn)下面的提示,那么此時(shí)就需要使用到 VBIOS ROM 文件:

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

unraid 會(huì)通過 vfio-pci 驅(qū)動(dòng)來暴露主機(jī)的 VBIOS 文件給到虛擬機(jī),以便虛擬機(jī)的 BIOS 能夠正確初始化 IGD。但是如果主機(jī)無法提供 ROM 文件給到 vfio-pci (造成的因素很多),那么虛擬機(jī)就無法正常啟動(dòng)。所以這種情況下就需要我們自己去單獨(dú)提供 ROM 文件給到虛擬機(jī)去加載。

使用 ROM 文件時(shí)請(qǐng)謹(jǐn)慎!因?yàn)槭褂?VBIOS 可能會(huì)損害的顯示器,作者不對(duì)此負(fù)責(zé)!

使用 ROM 文件時(shí)請(qǐng)謹(jǐn)慎!因?yàn)槭褂?VBIOS 可能會(huì)損害的顯示器,作者不對(duì)此負(fù)責(zé)!

使用 ROM 文件時(shí)請(qǐng)謹(jǐn)慎!因?yàn)槭褂?VBIOS 可能會(huì)損害的顯示器,作者不對(duì)此負(fù)責(zé)!

參考的配置如下:

  • CPU:根據(jù)你的情況來

  • Machine:i440fx-5.1

  • BIOS:OMVF

  • 內(nèi)存:6G(選擇4G以上,作者測(cè)試的時(shí)候出現(xiàn)了內(nèi)存占用大的問題,需要配合 QEMU 來解決,但請(qǐng)?jiān)陂_始的時(shí)候選擇大一點(diǎn)的內(nèi)存,否則可能無法啟動(dòng)

  • IGD 作為主圖形設(shè)備,且唯一(但是在你還沒有安裝系統(tǒng)前,請(qǐng)不要將圖形設(shè)備設(shè)置成 IGD,請(qǐng)使用虛擬化的圖形設(shè)備(VNC)去安裝系統(tǒng),調(diào)試好系統(tǒng)后再將圖形設(shè)備更改成 IGD,然后再通過遠(yuǎn)程桌面的形式去安裝 IGD 驅(qū)動(dòng)等

  • 其他選項(xiàng)例如虛擬硬盤大小、安裝鏡像等請(qǐng)自行配置;

如果出現(xiàn)內(nèi)存占用大的情況,或者說需要實(shí)現(xiàn)物理輸出,請(qǐng)參考上文的內(nèi)容編輯 XML 模板來添加 QEMU 選項(xiàng)(x-igd-opregion=on,x-igd-gms=1);

基于 Unraid 的 Windows 虛擬機(jī) Intel 核顯直通教程:原理及實(shí)現(xiàn)的探討

XML 配置如下:

<domain>

......

<devices>

......

<hostdev mode='subsystem' type='pci' managed='yes'>

<driver name='vfio'/>

<source>

<address domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>

</source>

<rom file='/mnt/user/domains/vbios_gvt_uefi.rom'/>

<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>

</hostdev>

<memballoon model='none'/>

</devices>

</domain>

8、文章總結(jié):相關(guān)案例參考,VBIOS ROM文件下載地址

  • IGD 的直通存在兩種模式:UPT 和 Legacy,不同的模式對(duì) CPU 的型號(hào)有要求,前者要求五代及以上,后者要求二代及以上;

  • 這兩種模式要使用不同的方式去實(shí)現(xiàn),但都要求在 BIOS 中做相應(yīng)的設(shè)置,其中包括啟動(dòng)方式(BIOS、UEFI)、OpROM 策略、主圖形適配器、共享內(nèi)存等;

  • 與此同時(shí),除了 BIOS 層面,IGD 的直通還涉及 Linux 的內(nèi)核以及 QEMU 的相關(guān)選項(xiàng)支持,所以一般建議在使用 Unraid 的時(shí)候使用 6.9.x 版本,因?yàn)樾掳姹镜?Unraid 會(huì)使用更新的 Linux 內(nèi)核以及 QEMU;

  • 在 Unraid 中,你需要將 IGD 綁定給 VFIO 驅(qū)動(dòng)(vfio-pci),并通過配置 Unraid 的內(nèi)核啟動(dòng)參數(shù)來解除一些除了 i915 之外的驅(qū)動(dòng),以避免這些驅(qū)動(dòng)對(duì) IGD 進(jìn)行控制,否則可能會(huì)導(dǎo)致 IGD 無法正常直通(或者影響到IGD的運(yùn)行);

  • 在 Unraid 中創(chuàng)建虛擬機(jī)時(shí),需要根據(jù)所選擇的直通模式來進(jìn)行配置,不同的直通模式影響具體的虛擬機(jī)參數(shù)設(shè)置;

  • 需要特別注意的是,如果需要使用 VBIOS ROM 文件,請(qǐng)謹(jǐn)慎操作,因?yàn)橛锌赡軙?huì)對(duì)你的顯示器造成傷害;

  • 虛擬機(jī)的 Machine 和 BIOS 也會(huì)對(duì) IGD 的直通結(jié)果造成影響,對(duì)于 Windows 虛擬機(jī)來說,一般都建議使用 OMVF,并且如果你的硬件設(shè)備相對(duì)比較新,那么建議使用 Q35 模型;

  • ROM 文件下載地址:百度網(wǎng)盤

作者編寫本文章時(shí)所參考的一些重要文章(社區(qū)不讓放鏈接,請(qǐng)大家根據(jù)標(biāo)題自行搜索):

  • Intel GVT-g,

  • Github:qemu/docs/igd-assign.txt,

  • Intel Graphics assignment,

  • Running Windows 10 on Linux using KVM with VGA Passthrough

  • PCI passthrough via OVMF

  • Set up Intel IGD opregion to allow for passthrough of Intel integrated graphics devices

  • Proxmox:Pci passthrough

  • KVM QEMU PVE UNRAID INTEL IGD GVT-D 直通研究心得

  • Github:intel/gvt-linux

  • vfio/pci: Intel IGD support

  • fw/pci: Add support for mapping Intel IGD via QEMU

至此,作者已經(jīng)將整個(gè) IGD 大致的過程梳理完了,并且也提供了參考的 Windows 虛擬機(jī)參數(shù)設(shè)置的配置建議。

但正如開頭所說,虛擬化是一個(gè)很復(fù)雜的過程,雖然文章很長(zhǎng),但實(shí)際上比起所搜集到的資料仍有很多很多的具體細(xì)節(jié)無法通過此文章呈現(xiàn)出來。所以,本文章仍有不少地方需要補(bǔ)充或者糾正,希望讀者們能夠提供相關(guān)建議和觀點(diǎn)以補(bǔ)充本文章所缺失的內(nèi)容或?qū)Y(jié)論進(jìn)行糾正。

(完)

作者聲明本文無利益相關(guān),歡迎值友理性交流,和諧討論~

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多