快轉到主要內容

透過Intel GVT-g虛擬化技術,分配Linux宿主機的GPU資源給QEMU/KVM虛擬機使用

分類   資訊科技 虛擬機與容器技術
標籤   GPU Virtualization Ubuntu
🗓️ 民國113年 甲辰年
✍ 切換正體/簡體字
目錄

注意:根據 Intel官網資料,Intel GVT-g技術僅適用Intel 11代(Rocket Lake)以前的CPU。搭載Intel Xe的新型CPU請改用「SR-IOV」技術。


本文探討如何在Linux系統利用「Intel GVT-g」技術將Intel的GPU虛擬化,將資源分享給QEMU/KVM虛擬機使用,使雙方都可以有3D硬體加速,或是在虛擬機影片轉碼的時候能使用Intel VA-API技術來加速。

Intel CPU很多型號都有附贈GPU,稱之為內顯,讓電腦開機有畫面,用於看影片沒有問題的。

如果要在Linux上的虛擬機達成硬體加速,之前我提過GPU Passthrough的方法: 直通Intel GPU給QEMU/KVM虛擬機,不使用GVT-g 但這是有雙顯示卡的前提下才能這麼做,因為一旦顯示卡給虛擬機獨佔,Linux宿主機就沒有畫面了。

故採用本文提及的GPU虛擬化技術,即可讓宿主機與虛擬機共享Intel GPU。如果你的電腦只有一個Intel GPU想必會非常有用。而且Intel GVT-g是可以一對多,分配GPU資源給多個虛擬機的。

Linux宿主機與Windows 10虛擬機與共用Intel GPU

1. 環境
#

  • Host OS:Ubuntu 24.04 LTS
  • Guest OS:Windows 10 22H2
  • 核心版本:6.8.0
  • CPU:Intel i5-7400
  • GPU:Intel UHD 630

我是雙顯卡桌電的配置,螢幕線必須接在Intel顯卡的HDMI上,GVT-g才能發揮作用。

2. 啟用GVT-g
#

  1. 設定開機自動載入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
  1. 編輯GRUB
sudo vim /etc/default/grub
  1. 加入以下內容,啟用IOMMU、vfio-pci、GVT-g核心模組
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet intel_iommu=on iommu=pt enable_gvt=1 i915.enable_guc=0 i915.enable_gvt=1"
  1. 更新GRUB
sudo grub-mkconfig -o /boot/grub/grub.cfg
  1. 重開機。

3. 新增mdev裝置
#

  1. 安裝mdevctl套件
sudo apt install mdevctl
  1. 取得Intel內顯的PCI位址
lspci | grep Intel
  1. 查看可用設定檔
sudo mdevctl types
  1. 例如我的Intel UUD 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
  1. 根據我的測試,i915-GVTg_V5_4只能分給一個虛擬機,解析度較高。i915-GVTg_V5_8則是能分給兩個虛擬機使用,但解析度很低。

  2. 這裡我選取了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:01:00.0" --type "i915-GVTg_V5_4"
  1. 如果用mdevctl define建立多個UUID,等同建立多個虛擬GPU,讓不同的虛擬機使用,同時設定檔也必須選取支援多個虛擬機的。但是Intel GPU的VRAM不是很大,實務上分配2個就很吃緊了。

  2. 查看目前mdev裝置的狀態

sudo mdevctl list -d

4. 將Intel GPU掛載至Libvirt虛擬機
#

經測試,Linux虛擬機分配Intel GVT正常運作,Intel開機後會自動使用Mesa載入驅動。

但…用UEFI韌體的Windows虛擬機會出現Error 43,可能是OVMF的bug,掛載i915ovmf.rom也沒用。虛擬機必須使用傳統BIOS韌體才有畫面。

  1. 開啟Virt Manager,新增 Windows 10虛擬機,開機韌體選取Q35和BIOS

  2. 點選編輯硬體,新增mdev主機裝置

  3. 開機後Windows應該會自動裝好Intel驅動,若無,開啟裝置管理員,對顯卡按下右鍵,更新驅動。

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

  5. Windows工作管理員可看到Intel GPU有在運作。Linux端只能透過intel_gpu_top指令間接得知。因為是共享資源,若Windows端做太多重度運算一定會影響到宿主機的流暢度的。

參考資料
#

相關文章

Linux電腦跑Android APP ~ Ubuntu如何安裝Waydroid
分類   資訊科技 虛擬機與容器技術
標籤   Waydroid Ubuntu Android
如何在Windows 11安裝WSL2子系統 (Ubuntu)
分類   資訊科技 虛擬機與容器技術
標籤   Windows Subsystem for Linux Docker Ubuntu
Ubuntu Linux如何安裝Windows 10虛擬機 (QEMU/KVM)
分類   資訊科技 虛擬機與容器技術
標籤   Ubuntu QEMU-KVM Windows

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur或Postimages。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用圖床網站。