本文說明如何在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獨顯
將Windows虛擬機關機。
從Ubutnu應用程式列表開啟「額外驅動程式」,檢查目前是用Nouveau開源驅動還是Nvidia閉源驅動。
如果是閉源驅動,執行以下指令刪除Nvidia驅動,改安裝開源的nouveau驅動並重開機。
|
|
重開機後額外驅動程式會顯示目前使用的是nouvueau驅動。
啟用IOMMU,編輯
/etc/default/grub
,針對Intel CPU,在GRUB_CMDLINE_LINUX_DEFAULT
後面加入以下內容:
|
|
- 更新GRUB後重開機。
|
|
- 執行以下指令查找獨顯和HDMI裝置的ID
|
|
找到GTX 1050Ti和其HDMI音訊裝置,將後面的二個硬體ID記起來,例如這裡是
10de:1c82
和10de:0fb9
。接著禁止開機載入獨顯的驅動程式。針對Nvidia顯示卡,
modprobe.blacklist
代表將nouveau驅動也加入黑名單並允許不安全的中斷。所以再次修改/etc/default/grub
,將GRUB_CMDLINE_LINUX_DEFAULT
增添為以下內容:
|
|
- 啟用vfio-pci核心模組
|
|
- 更新GRUB和initramfs並重開機
|
|
重開機一直按著delete,進到BIOS,設定開啟混合螢幕輸出,我的是在Advanced → System Agent (SA) Configuration,設定以內顯(IGFX)優先開機。
主螢幕改插到內顯的孔,副螢幕插到獨顯的孔,重開機進入Linux系統。
6. 將獨顯直通到虛擬機
開啟Virt Manager,按二下開啟,點i編輯Windows虛擬機
點選加入硬體 → 加入PCI主機裝置
將獨顯和獨顯音訊HDMI都加進去
Windows虛擬機開機後,按下檢查系統更新,會自動下載Nvidia的基本驅動。
之後應該會在裝置管理員看到顯示卡,再安裝GeForce Experience更新顯示卡驅動。
於是WebGL Aquarium的FPS終於正常,副螢幕也會顯示Windows虛擬機的桌面。
7. 如果不想要插二個螢幕
若只插主螢幕,虛擬機也是有畫面,但是要到Windows顯示設定,改成只在主螢幕顯示。
此外,要到Nvidia Control Panel或Windows設定→系統→顯示器→圖形設定手動指定哪些程式要用獨顯跑。
或者可以嘗試更進階的: 單顯卡直通 (Single GPU Passthrough)。但是我比較喜歡二種系統在同一個畫面同時執行。
8. 取消獨顯直通虛擬機
Windows 10虛擬機硬體列表移除顯示卡(PCI硬體裝置)
修改
/etc/default/grub
,將modprobe.blacklist=nouveau
參數去除,更新GRUB設定。進入BIOS,設定以獨顯優先開機。
重開機後從Ubutnu應用程式列表開啟「額外驅動程式」,安裝Nvidia專有驅動。