注意:根據Intel官網資料,Intel GVT-g技術僅適用Intel Core 10代(含10代)以前所搭載的Intel UHD Graphics。雖然Intel放棄這個技術了但還是可以用。
搭載Intel Xe的新型CPU請改用「SR-IOV」技術。
另外,Intel Arc顯示卡不支援GTV-g,只能使用SR-IOV。可是不是所有Intel Arc顯示卡都支援SR-IOV。
本文探討如何在Linux系統利用「Intel GVT-g」技術將Intel的GPU虛擬化,將GPU資源分享給QEMU/KVM虛擬機使用,使宿主機和虛擬機雙方都可以有3D硬體加速,或是在虛擬機影片轉碼的時候能使用Intel VA-API技術來加速。
GPU虛擬化與GPU直通的差別在於,GPU直通因為是將PCI裝置分配給虛擬機,一次只能有一個虛擬機使用GPU。而GPU虛擬化可以讓多個虛擬機共享GPU。
Intel CPU很多型號都有附贈GPU,稱之為iGPU,也就是內顯,讓電腦開機有畫面,用於看影片和輕度遊戲沒有問題的。
如果要在Linux上的虛擬機達成硬體加速,之前我提過GPU Passthrough的方法:直通Intel GPU給QEMU/KVM虛擬機,不使用GVT-g 但這是有雙顯示卡的前提下才能這麼做,因為一旦顯示卡給虛擬機獨佔,Linux宿主機就沒有畫面了。
故採用本文提及的GPU虛擬化技術,即可讓宿主機與虛擬機共享Intel GPU。如果你的電腦只有一個Intel GPU想必會非常有用。而且Intel GVT-g是可以一對多,分配GPU資源給多個虛擬機的。
1. 環境#
- 宿主機:Ubuntu 26.04 LTS
- 虛擬機:Windows 11 25H2
- CPU:Intel i5-7400
- GPU:Intel UHD 630
2. 新增虛擬機#
3. 啟用GVT-g#
- 設定開機自動載入vfio-pci、kvmgt、mdev核心模組
echo "vfio-pci" | sudo tee -a /etc/modules-load.d/vfio-pci.conf
echo "kvmgt" | sudo tee -a /etc/modules-load.d/kvmgt.conf
echo "mdev" | sudo tee -a /etc/modules-load.d/mdev.conf- 編輯Intel顯卡的i915核心模組載入選項
sudo vim /etc/modprobe.d/intel.conf- 加入以下內容,啟用GVT-g虛擬化、載入GuC與HuC韌體(enable_guc的數字具體含義請看
sudo modinfo i915 | grep guc)
options i915 enable_gvt=1 enable_guc=1 - 編輯GRUB核心參數
sudo vim /etc/default/grub- 給Intel CPU啟用IOMMU
GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on"- 更新initramfs與GRUB
sudo update-initramfs -u -k all
sudo update-grub- 重開機。
3. 新增mdev裝置#
- 安裝mdevctl套件,這個小工具可以在電腦開機後自動透過udev產生mdev裝置
sudo apt install mdevctl- 取得Intel內顯的PCI位址
lspci | grep Intel- 查看可用設定檔(也可以嘗試
ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/)
sudo mdevctl types- 例如我的Intel UHD 630可用設定檔有兩個:
0000:00:02.0
i915-GVTg_V5_4
Available instances: 0
Device API: vfio-pci
Name: GVTg_V5_4
Description: low_gm_size: 128MB, high_gm_size: 512MB, fence: 4, resolution: 1920x1200, weight: 4
i915-GVTg_V5_8
Available instances: 0
Device API: vfio-pci
Name: GVTg_V5_8
Description: low_gm_size: 64MB, high_gm_size: 384MB, fence: 4, resolution: 1024x768, weight: 2根據我的測試,
i915-GVTg_V5_4只能分給一個虛擬機,解析度較高。i915-GVTg_V5_8則是能分給兩個虛擬機使用,但解析度很低。使用mdevctl新增裝置,這裡我選取了
i915-GVTg_V5_4設定檔,賦予一個UUID並設定開機自動啟動。路徑為上面的指令PCI位址轉寫,例如00:02.0就是0000:00:02.0。
sudo mdevctl define --parent 0000:00:02.0 --type i915-GVTg_V5_4 --auto
sudo mdevctl start --uuid "填入上面生成的UUID" --parent "0000:00:02.0" --type "i915-GVTg_V5_4"- 如果用mdevctl define建立多個UUID,等同建立多個虛擬GPU,讓不同的虛擬機使用,同時也必須選取支援多個虛擬機的設定檔。但是Intel GPU的VRAM不是很大,是跟RAM共用的,實務上分配2個就很吃緊了。
4. 將iGPU新增至Libvirt虛擬機#
- 查看目前mdev裝置的狀態
sudo mdevctl list -d- 開啟Virt Manager,點選編輯硬體,新增mdev主機裝置

5. 在虛擬機內安裝驅動#
Windows虛擬機#
開機後Windows應該會自動裝好Intel驅動,若無,開啟裝置管理員,對顯卡按下右鍵,更新驅動。或者到Intel官網下載驅動。

虛擬機預設的QXL顯示卡加上Intel GPU,於是Windows會偵測到二個螢幕。在系統設定 → 顯示器 → 圖形的部份,可以指定應用程式exe使用Intel GPU運算。

Windows工作管理員可看到Intel GPU有在運作。Linux端只能透過
intel_gpu_top指令間接得知。因為是共享資源,若Windows端做太多重度運算一定會影響到宿主機的流暢度的。
Linux虛擬機#
開啟Virt Manager,點選編輯硬體,新增mdev主機裝置
經測試,Linux虛擬機分配Intel GVT正常運作,Linux開機後會自動使用Mesa載入驅動。
可以在虛擬機內使用
lspci -nnk確認是否有顯示Intel GPU型號,以及使用i915驅動。注意:使用GTV-g的時候不可以安裝VirtIO或QXL的驅動。否則你就得在Virt Manager使用Virtio虛擬顯示卡,並勾選啟用OpenGL加速,才能同時顯示Virtio與Intel GPU的畫面。
6. 安裝Looking Glass降低虛擬機顯示延遲#
Intel虛擬化的GPU並沒有輸出畫面的能力,因為你HDMI仍在宿主機。且透過Virt Manager虛擬顯卡視窗檢視虛擬機畫面的話,會導致3D渲染破圖。
因此,得將Virt Manager顯示卡停用,然後用Looking Glass輸出到宿主機,達成低延遲畫面。
參照:Linux Looking Glass安裝教學,低延遲顯示Windows QEMU/KVM的遊戲畫面
這個設定過程有點複雜。安裝完Looking Glass之後,將Windows將Intel的螢幕設定為主顯示卡。
然後用Virt Manager關機,將顯卡設定為無,停用QXL,接著重開機。


