快轉到主要內容

Linux透過virtio-gpu VirGL給QEMU/KVM虛擬機3D加速,免GPU直通

· 民國114年乙巳年
·
切換繁體/簡體
分類   資訊科技 虛擬機與容器技術
標籤   VirGL VirtIO QEMU-KVM Libvirt UTM
目錄

virglrenderer(VirGL)是Linux的半虛擬化技術,可以配合QEMU/KVM的「virtio-gpu」,讓虛擬機獲得3D加速而不用直通GPU,也不用搞GPU虛擬化。

以下是Collabora公司繪製的原理圖:

用途?這樣一來方便開發者在虛擬機測試桌面環境特效,加強遊戲算繪能力與影片解碼速度,或者給ffmpeg影片編碼加速,甚至能搭配VA-API使用。

即使是在headless的Linux環境,virglrenderer照樣可以給虛擬機啟用3D加速。請參見Andorid TermuxWindows WSL的例子。

1. virglrenderer運作條件
#

目前virglrenderer版本1.0.0,QEMU版本8.2.2,Mesa版本24.0.5

  • 宿主機系統:建議是GNU/Linux系統。不過專為macOS設計的UTM也有提供virglrenderer。
  • 宿主機顯示卡:最好使用Intel或AMD,搭配開源Mesa驅動。Nividia閉源驅動需要另外處理,後面會說明。
  • 顯示協定:建議宿主機與虛擬機都使用X11,Wayland支援度尚未成熟。
  • 圖形API支援:virglrenderer主要支援的是OpenGL,Vulkan支援尚屬於實驗階段。需要在virgl_test_server手動啟用Venus選項。
  • 虛擬機軟體:QEMU。根據QEMU官方文件,virtio-gpu的虛擬顯示卡有多種後端可以選用,virtio-gpu-gl-pcivirtio-gpu-gl型號表示使用virglrenderer當作後端。
  • 虛擬機系統:得是Linux才能啟用virglrenderer,大部分GNU/Linux系統的核心和Mesa應該都包含VirGL支援,Android-x86也有VirGL。FreeBSD和ChromeOS支援度未知。Windows和macOS不支援virglrenderer。目前有一個針對Windows虛擬機VirGL驅動的PR,但是處於早期階段。
  • 因為virglrenderer是半虛擬化技術,可能無法發揮GPU全速,會有許多性能損失。

2. 在宿主機安裝virglrenderer套件
#

大部分Linux發行版都有收virglrenderer套件。不過若要體驗最新功能你得參考官方文件手動編譯新版。

  1. 以Ubuntu 24.04為例,先設定Virt Manager與QEMU/KVM

  2. 再安裝virglrenderer套件:

sudo apt install libvirglrenderer-dev libvirglrenderer1 virgl-server
  1. 隨後應該會隨Virt Manager自己啟動,不需要跑特別指令。

  2. 需要跑自訂指令參數的話,使用virgl_server指令啟動伺服器,例如加入Vulkan支援:

virgl_test_server --use-egl-surfaceless --venus &

3. Virt Manager虛擬機啟用VirGL
#

此處段落適用Intel與AMD顯示卡用戶,Nvidia閉源驅動用戶請看下一段。

  1. 開啟Virt Manager,新增任意Linux虛擬機。

  2. 點選編輯硬體,在顯示卡部份選取virtio,並勾選3D加速

  3. 然後在SPICE協定部份,監聽類型勾選無,再勾選啟用OpenGL

  4. 開機之後,虛擬機系統應會自動偵測到virglrenderer並啟用3D加速

  5. 在虛擬機執行dmesg | grep drm指令查看virgl是否有載入

  6. 因為VirGL預設僅支援OpenGL,所以要用OpenGL工具來測試。使用glxinfo | grep OpenGL指令可得知,這裡使用了virgl,而非純CPU算繪的llvmpipe。

4. Virt Manager虛擬機搭配Nvidia顯示卡啟用VirGL
#

測試當下Nvidia閉源驅動版本575,QEMU版本8.2.2。Virt Manager預設是以Root啟動QEMU的,不知道為什麼Nvidia顯示卡不能直接在Virt Manager的界面啟用VirGL,可能是bug。

Nvidia的VirGL似乎更容易造成虛擬機破圖。

  1. 點選Virt Manager的檔案 → 新增連接,改成連接到QEMU使用者工作階段

  2. 在這裡新增虛擬機,使用UEFI開機。

  3. 編輯虛擬機XML,去掉所有<video></video><graphics></graphics>的區塊,改填入以下內容。/dev/dri/renderD128可以嘗試替換成/dev/dri/renderD129

    <video>
      <model type="virtio" heads="1" primary="yes">
        <acceleration accel3d="yes"/>
      </model>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x0"/>
    </video>
    <graphics type="spice" autoport="yes">
      <listen type="address"/>
    </graphics>
    <graphics type="egl-headless">
      <gl rendernode="/dev/dri/renderD128"/>
    </graphics>
  1. 啟動虛擬機。在虛擬機裡面使用glxinfo | grep OpenGL指令確認VirGL是否有成功啟用。

5. 測試VirGL效能
#

  1. 虛擬機沒有GPU加速的情況下會使用llvmpipe算繪。現在有了virglrenderer,虛擬機內部的軟體應該會自動使用virglrenderer算繪。不過有些桌面環境即使啟用virgl可能還是會lag。

  2. 手動指定virgl或virpipe驅動來啟動程式

GALLIUM_DRIVER=virgl firefox
  1. 當虛擬機程式在使用3D算繪的時候,宿主機可以觀察到佔用(此圖為intel_gpu_top所顯示)

  2. 我們可以用glmark2跑分軟體,比較虛擬機內llvmpipe與VirGL的效能。成績通常是VirGL比較好,但如果再跟宿主機的glmark2成績比較的話就會差距非常大,在此能了解到VirGL性能損失多嚴重。

# 強制CPU算繪,應該會印出llvmpipe
GALLIUM_DRIVER=llvmpipe LIBGL_ALWAYS_SOFTWARE=true  glmark2

# 使用VirGL算繪,應該會印出VirGL與宿主機GPU型號
GALLIUM_DRIVER=virgl glmark2
  1. 用MPV播放器測試VirGL加速效果,播放高畫質影片解碼效果應當十分明顯,不會出現掉格現象:
GALLIUM_DRIVER=virgl mpv --no-config --vo=gpu --gpu-context=x11egl "影片路徑"

參考資料
#

相關文章

VirtIO-Balloon:伸縮自在的RAM,QEMU/KVM虛擬機動態分配記憶體
分類   資訊科技 虛擬機與容器技術
標籤   QEMU-KVM VirtIO Libvirt
免Mac電腦,OSX-KVM讓你在Linux系統安裝macOS的QEMU虛擬機
分類   資訊科技 虛擬機與容器技術
標籤   MacOS Hackintosh QEMU-KVM Libvirt Xcode
Ubuntu使用vgpu_unlock解鎖NVIDIA vGPU,給QEMU/KVM虛擬機啟用GPU虛擬化
分類   資訊科技 虛擬機與容器技術
標籤   GPU Virtualization Nvidia CUDA Ubuntu QEMU-KVM Libvirt

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。

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