1.目標
Linux上用QEMU/KVM安裝的Windows虛擬機最缺乏的是3D圖形效能,為此利用Linux提供的VFIO(Virtual Function I/O)核心模組將實體機(Host)獨立顯示卡與系統隔離,直通(passthrough)給虛擬機(Guest)使用。
這樣虛擬機便能使用3D硬體加速,用於建模彩現或玩遊戲。
尚能同時使用二個系統作業。

當然獨顯直通給虛擬機時,Host自然就無法利用獨顯運算,文末會討論一些改進和替代方案。
2. 環境
- Host OS: Arch Linux。核心版本6.2.1,桌面環境為X11下的KDE。
- Guest OS: Windows 11 22H2
- 主機板:ASUS K31CDK,UEFI開機,關閉Secure boot
- CPU: Intel i5-7400
- GPU: UHD 630 (內顯)
- GPU: GTX-1050Ti (獨顯)
- RAM:16GB
- SSD: 500GB
電腦需同時有內顯+獨顯,準備二個螢幕。
GPU直通前接線是這樣,內顯處於閒置狀態。
但在啟用GPU直通(啟用VFIO、改用內顯開機)後,內顯HDMI接主螢幕,獨顯HDMI接副螢幕。
3. 安裝Windows 11虛擬機
Windows 11虛擬機必須使用UEFI(OVMF)開機,至少需要分配4核心CPU、8GB RAM、64GB硬碟。不可安裝SPICE Tools。
安裝好後將虛擬機關機。
4. 開始設定GPU直通
4.1. 啟用IOMMU
- 編輯GRUB設定檔
|
|
- 在
GRUB_CMDLINE_LINUX_DEFAULT
這行後面加入核心參數,啟用Intel CPU的iommu。(AMD CPU為amd_iommu
)
|
|
- 重新產生設定檔,重開機
|
|
- 終端機貼上以下指令稿查找顯示卡的IOMMU群組:
|
|
- 應會看到顯示卡的分組,例如我的被分到Group 1:
|
|
將顯示卡的硬體ID記下來,例如這裡是10de:1c82
和10de:0fb9
。
4.2. 啟用VFIO
- 再次編輯GRUB
sudo vim /etc/default/grub
- 將
GRUB_CMDLINE_LINUX_DEFAULT
增加為以下內容,vfio-pci.ids
後面接的是顯示卡的硬體ID,以逗號分隔。
|
|
- 重新產生GRUB設定檔
|
|
- Arch Linux可使用initramfs載入核心模組,因此修改initramfs內容:
|
|
- 將
Modules()
修改成如下,設定開機載入vfio核心模組。
|
|
- 重新生成initramfs。
|
|
4.3. 用內顯開機
重開機,按Delete進入BIOS
設定優先以CPU內顯開機。ASUS K31CDK主機板的選項在Advanced → System Agent (SA)Configuration → IGFX
重開機後,用
sudo lspci -nnk | grep NVIDIA
檢查VFIO狀態:
|
|
4.4. 將顯示卡分配給虛擬機
開啟Virt Manager,編輯Windows 11虛擬機的硬體。點選左下角新增硬體,選擇PCI主機裝置,加入Nvidia獨顯和音效裝置至虛擬機
新增USB主機裝置 → 滑鼠,這樣就沒虛擬機吃不到Host滑鼠的問題。滑鼠在虛擬機出不來的時候,按Ctrl+ALT讓滑鼠回到Host。
4.5. 在虛擬機內安裝Nvidia驅動
虛擬機開機後會變成雙螢幕。Host主螢幕虛擬機視窗會看到Windows畫面,而副螢幕會暫時黑螢幕。
在虛擬機內下載Geforce Experience,登入Nvidia帳號,安裝驅動程式。
之後Windows應該就會正常顯示雙螢幕。
接著在系統設定→顯示器→圖形,指定應用程式使用Nvidia顯示卡彩現,而非QXL。
圖形效能在副螢幕上最好。
如果副螢幕有喇叭,則Windows的音效會從副螢幕輸出。
5. 改進和替代方案
5.1. 取消GPU直通
編輯GRUB設定檔,把VIFO的參數去掉,重新生成GRUB設定檔。
Virt Manager編輯虛擬機硬體,去掉PCI主機裝置。
5.2. 不插二個螢幕的方案
將副螢幕換成「HDMI顯卡欺騙器」,約一個轉接頭大小而已,並在Windows設定將螢幕只顯示於虛擬機視窗,就可以用主螢幕操控Windows。
或者在虛擬機內部安裝Moonlight遊戲串流伺服器,這樣便可在Host主螢幕以Moonlight客戶端存取HDMI顯卡欺騙器的「假螢幕」,虛擬機內部的音效也會一併帶到Host的音效裝置上。
5.3. 單顯示卡直通 Single GPU Passthrough
此方法應稱作單螢幕直通。
常見作法是新增一個專門跑虛擬機的使用者,在Display Manager登入該使用者後立即啟動QEMU/KVM虛擬機,並將Nvidia核心模組切換,即時直通給虛擬機使用,變成好像在使用另一個系統。Linux Host則是透過SSH遠端登入。待虛擬機關機後退回Display Manager,一切回復原狀。
這樣好處是用比較直覺的方式來選擇進入的系統,用起來很像雙重開機。
壞處在於不能同時使用二個有桌面環境的系統。