Ubuntu:Windows虛擬機顯示卡直通

本文說明如何在Ubuntu 22.04上安裝Windows 10虛擬機,並將Nvidia顯示卡直通給虛擬機,以求能執行3D應用程式。

這樣講或許很抽象,請看影片:

顯示卡直通(GPU Passthrough) 讓Windows虛擬機能以接近原生效能玩大型3D遊戲。要做到這點,需要2個顯示卡:一個CPU內顯,一個獨立顯示卡。此外最好準備2個螢幕。

1. 內顯與獨顯?實體機與客體機?

  • 內顯: CPU的內建顯卡,例如Intel I5-7400的內顯是HD630。但是要注意有的CPU沒有內顯,無法輸出畫面。
  • 獨顯: Nvidia或AMD的獨立顯示卡,例如GTX和Radeon系列。

獨顯通常性能較好,負責複雜的3D運算。電腦通常會優先以獨顯開機。

至於宿主系統,也就是裝在電腦上的叫做實體機(Host),虛擬機則叫做客體機(Guest)。

至於使用到的直通技術是IOMMU和VFIO。

2. 硬體資訊

  • 實體機系統: Ubuntu 22.04
  • 客體機系統: Windows 10
  • CPU: Intel I5-7400,有內顯UHD 630。
  • GPU: Nvidia GTX1050Ti

我有二個螢幕,都是插HDMI。電腦主機後方連接主機板的洞是內顯,下面的是獨顯的洞。

一般來說主螢幕是插在獨顯的洞,而獨顯在直通給虛擬機後,主螢幕就要改插內顯的洞。

因此要準備二個HDMI插孔的螢幕。

操作前我的主螢幕插在獨顯的洞,副螢幕尚未連接。

3. 安裝 QEMU-KVM

4. 安裝Windows 10虛擬機

不可安裝SPICE Tools。

Windows虛擬機雖然有畫面,但是圖形效能很差,看看Edge瀏覽器的WebGL Aquarium的FPS就知道,所以要直通顯示卡。

5. 禁止Linux核心載入Nvidia獨顯

  1. 將Windows虛擬機關機。

  2. 從Ubutnu應用程式列表開啟「額外驅動程式」,檢查目前是用Nouveau開源驅動還是Nvidia閉源驅動。

  3. 如果是閉源驅動,執行以下指令刪除Nvidia驅動,改安裝開源的nouveau驅動並重開機。

1
2
sudo apt-get purge *nvidia*
sudo apt-get install xserver-xorg-video-nouveau
  1. 重開機後額外驅動程式會顯示目前使用的是nouvueau驅動。

  2. 啟用IOMMU,編輯/etc/default/grub,針對Intel CPU,在GRUB_CMDLINE_LINUX_DEFAULT後面加入以下內容:

1
GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on"
  1. 更新GRUB後重開機。
1
2
sudo update-grub
sudo reboot
  1. 執行以下指令查找獨顯和HDMI裝置的ID
1
lspci -nnk
  1. 找到GTX 1050Ti和其HDMI音訊裝置,將後面的二個硬體ID記起來,例如這裡是10de:1c8210de:0fb9

  2. 接著禁止開機載入獨顯的驅動程式。針對Nvidia顯示卡,modprobe.blacklist代表將nouveau驅動也加入黑名單並允許不安全的中斷。所以再次修改/etc/default/grub,將GRUB_CMDLINE_LINUX_DEFAULT增添為以下內容:

1
GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on vfio_iommu_type1.allow_unsafe_interrupts=1 vfio-pci.ids=10de:1c82,10de:0fb9 modprobe.blacklist=nouveau kvm.ignore_msrs=1"
  1. 啟用vfio-pci核心模組
1
sudo echo 'vfio-pci' > /etc/modules-load.d/vfio-pci.conf
  1. 更新GRUB和initramfs並重開機
1
2
3
sudo update-grub
sudo update-initramfs -u
sudo reboot
  1. 重開機一直按著delete,進到BIOS,設定開啟混合螢幕輸出,我的是在Advanced → System Agent (SA) Configuration,設定以內顯(IGFX)優先開機。

  2. 主螢幕改插到內顯的孔,副螢幕插到獨顯的孔,重開機進入Linux系統。

6. 將獨顯直通到虛擬機

  1. 開啟Virt Manager,按二下開啟,點i編輯Windows虛擬機

  2. 點選加入硬體 → 加入PCI主機裝置

  3. 將獨顯和獨顯音訊HDMI都加進去

  4. Windows虛擬機開機後,按下檢查系統更新,會自動下載Nvidia的基本驅動。

  5. 之後應該會在裝置管理員看到顯示卡,再安裝GeForce Experience更新顯示卡驅動。

  6. 於是WebGL Aquarium的FPS終於正常,副螢幕也會顯示Windows虛擬機的桌面。

7. 如果不想要插二個螢幕

若只插主螢幕,虛擬機也是有畫面,但是要到Windows顯示設定,改成只在主螢幕顯示。

此外,要到Nvidia Control Panel或Windows設定→系統→顯示器→圖形設定手動指定哪些程式要用獨顯跑。

或者可以嘗試更進階的: 單顯卡直通 (Single GPU Passthrough)。但是我比較喜歡二種系統在同一個畫面同時執行。

8. 取消獨顯直通虛擬機

  1. Windows 10虛擬機硬體列表移除顯示卡(PCI硬體裝置)

  2. 修改/etc/default/grub,將modprobe.blacklist=nouveau參數去除,更新GRUB設定。

  3. 進入BIOS,設定以獨顯優先開機。

  4. 重開機後從Ubutnu應用程式列表開啟「額外驅動程式」,安裝Nvidia專有驅動。

9. 參考資料

如果本網站文章對您有幫助,歡迎贊助我。