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)的軟硬件配置:
2、在虛擬化直通上,不能簡(jiǎn)單地將 Intel 的核顯視為一個(gè)嵌入到 CPU 的 GPU
之所以這樣說,是因?yàn)樵谔摂M化層面,IGD 并不是一個(gè)“獨(dú)立”的設(shè)備可以隨時(shí)隨地的將其分配給虛擬機(jī)去使用而不需要任何的附加條件,我在查找資料的時(shí)候看到有這么一段話去描述IGD在虛擬化層面的狀況:
在下文中,你將看到為了實(shí)現(xiàn) IGD 的直通,可能需要進(jìn)行如下操作:
不同的場(chǎng)景需要有針對(duì)性的配置,每一種配置的背后都有對(duì)應(yīng)的原理,這也就是為什么說IGD的直通并不是一個(gè)簡(jiǎn)單的過程。 3、IGD的直通存在兩種模式,不同的模式需要不同的方式去實(shí)現(xiàn)根據(jù) qemu 的 Github 官方文檔,這兩種直通的模式分別是:
兩種模式各有自己的優(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)來開啟物理輸出。 相比 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è)置?
4.1:UEFI 啟動(dòng)還是 Legacy BIOS 啟動(dòng)首先,這兩種啟動(dòng)方式會(huì)影響 VBIOS(Video BIOS) 的加載,所以你要做的第一件事就是確定你的主板是否同時(shí)支持這兩種啟動(dòng)模式,或者說你的主板是否支持 CSM(兼容性支持模塊) 功能。
4.1.1:那么,什么是 VBIOS? VBIOS 是顯卡或集成圖形控制器(IGD)的 BIOS。與系統(tǒng) BIOS 一樣,BIOS 提供了一系列功能以便程序能夠訪問系統(tǒng)的硬件,而 VBIOS 也提供了一系列與視頻有關(guān)的功能供程序訪問視頻硬件(IGD)。VBIOS 將軟件與視頻芯片組連接起來,其方式與系統(tǒng)BIOS對(duì)系統(tǒng)芯片組的作用相同。
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)”: 如果你的主板不支持 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 的加載。 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)): 顯卡共享內(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-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ù)): 勾選 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 的硬件加速: 那么言歸正傳,由于我們需要將 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/文件中來編輯),類似的方法就不一一介紹了: 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 為甚。
這兩者都是 Framebuffer,根據(jù)啟動(dòng)方式的不同,Linux 所使用的 Framebuffer 也不同。
如果不取消綁定,那么當(dāng)你在直通 IGD 給到虛擬機(jī)時(shí),你可能會(huì)看到虛擬機(jī)的運(yùn)行日志中出現(xiàn)如下信息:
這就說明 vesafb 或 efifb 沒有取消對(duì) IGD 的綁定,因此你需要在 Unraid 的內(nèi)核啟動(dòng)參數(shù)中添加如下參數(shù):
或者
那么以上就是 Linux 內(nèi)核啟動(dòng)參數(shù)中需要配置的參數(shù)了。 需要特別說明的是,你也許會(huì)在別的教程中看到在 Unraid 的內(nèi)核啟動(dòng)參數(shù)中配置了很多的參數(shù),比如我從社區(qū)里面拷貝了如下參數(shù):
首先,上述的配置我認(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)生影響的影響:
我分別在兩種直通模式的基礎(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)整理、矯正 在我測(cè)試結(jié)果的基礎(chǔ)上,我會(huì)在下文提供給大家針對(duì)不同模式的虛擬機(jī)參數(shù)配置,但僅供參考,僅供參考,僅供參考! 6.1:UPT 直通模式的虛擬機(jī)參數(shù)配置思路(僅供參考)如果你的 CPU 等于或高于第五代 CPU,那么我建議采用 UPT 模式進(jìn)行直通,并可以參考以下設(shè)置:
前面我們說過,UPT 模式下 IGD 作為第二個(gè)圖形設(shè)備傳遞給虛擬機(jī),因此對(duì)于 IGD 和虛擬圖形的設(shè)備如下: 其他的比如設(shè)置硬盤大小、選擇安裝鏡像這些我就不贅述了,請(qǐng)大家自行配置。 當(dāng)你配置完相關(guān)設(shè)置后,請(qǐng)不要勾選創(chuàng)建后啟動(dòng)虛擬機(jī): 我們創(chuàng)建好虛擬機(jī)后,使用 XML 試圖去進(jìn)行編輯: 拖動(dòng)編輯框到最底部,可以看到關(guān)于 IGD 的 XML 配置:
<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ì)有這樣一行提示:
我們可以明顯的看到“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”的提示。
那么解決辦法是什么?
假設(shè)我們最終修改 IGD 的 pci bus 地址如下(僅供參考):
修改好之后,點(diǎn)擊 Update 即可,之后即可正常安裝 Windows 并安裝 IGD 的顯卡驅(qū)動(dòng): 6.2:Legacy 直通模式的虛擬機(jī)參數(shù)配置思路(僅供參考)Legacy 直通模式的實(shí)現(xiàn)是最復(fù)雜的,在這一小節(jié)我會(huì)花多點(diǎn)文字盡可能講清楚其中的邏輯。 如果你的 CPU 高于第二代但低于第五代 CPU,那么你只能采用 Legacy 模式進(jìn)行直通,并可以參考以下設(shè)置:
設(shè)置好上述配置后,在后續(xù)你可能大概率需要:
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ī)采用 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ò)誤的情況。
就作者自身的硬件情況,我用此 ROM 文件可以解決此問題(如果無法下載,請(qǐng)看文章最末尾的網(wǎng)盤地址),但因?yàn)椴煌挠布闆r,此 ROM 文件不一定能解決所有的問題: 在 Github 上也有其他的一些作者提供 ROM 文件,但我沒嘗試過這些 ROM 文件是否可以解決所提到的問題,這里就不一一介紹了,請(qǐng)自行根據(jù)下面的項(xiàng)目名稱搜索(社區(qū)規(guī)定不能直接放鏈接),請(qǐng)謹(jǐn)慎嘗試:
6.2.2:ROM 文件要如何給到虛擬機(jī)使用? 將 ROM 文件上傳至 Unraid 之后,在虛擬機(jī)編輯界面的 “Graphics ROM BIOS” 選擇對(duì)應(yīng)的 ROM 文件即可: 6.2.3:虛擬機(jī)的 Windows 出現(xiàn)內(nèi)存占用大的情況如何解決? 你可能會(huì)遇到 Windows 系統(tǒng)內(nèi)存被大量占用的情況,比如社區(qū)里就有作者提到此類問題,并也提供解決辦法: 那么解決辦法也很簡(jiǎn)單,按照下圖將 QEMU 選項(xiàng)添加進(jìn) XML 模板即可:
根據(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)存:
6.2.4:如何實(shí)現(xiàn)虛擬機(jī)畫面的物理輸出? 你也許注意到了,在上面的那一章解決內(nèi)存占用大的社區(qū)文章中,還有這樣一段配置:
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)物理輸出。 之所以需要配置此參數(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 格式如下:
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é)! 參考的配置如下:
配置如下圖所示: XML 配置如下:
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 文件:
使用 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é)! 參考的配置如下:
如果出現(xiàn)內(nèi)存占用大的情況,或者說需要實(shí)現(xiàn)物理輸出,請(qǐng)參考上文的內(nèi)容編輯 XML 模板來添加 QEMU 選項(xiàng)(x-igd-opregion=on,x-igd-gms=1); XML 配置如下:
8、文章總結(jié):相關(guān)案例參考,VBIOS ROM文件下載地址
作者編寫本文章時(shí)所參考的一些重要文章(社區(qū)不讓放鏈接,請(qǐng)大家根據(jù)標(biāo)題自行搜索):
至此,作者已經(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),歡迎值友理性交流,和諧討論~ |
|