virglrenderer(VirGL)是Linux的半虛擬化技術,可以配合QEMU/KVM的virtio-gpu,讓虛擬機獲得3D加速而不用直通GPU,也不用搞GPU虛擬化。
以下是Collabora公司繪製的原理圖:
用途?這樣一來方便開發者在虛擬機測試桌面環境特效,加強遊戲算繪能力、影片解碼速度,或者給ffmpeg影片編碼加速。
即使是在headless的Linux環境,virglrenderer照樣可以給虛擬機啟用3D加速。請參見 Andorid Termux和 Windows WSL的例子。
1. virglrenderer運作條件#
目前virglrenderer版本1.0.0,QEMU版本8.2.2,Mesa版本24.0.5
- 宿主機系統:GNU/Linux系統。
- 宿主機顯示卡:最好使用Intel或AMD,搭配開源Mesa驅動。Nividia閉源驅動virglrenderer支援度不佳。
- 虛擬機軟體:QEMU。根據QEMU官方文件,virtio-gpu的虛擬顯示卡,帶有
-gl
後綴的表示使用virglrenderer當作後端。 - 虛擬機系統:得是Linux才能啟用virglrenderer,大部分GNU/Linux系統的核心和Mesa應該都包含VirGL支援,Android-x86也有VirGL。FreeBSD和ChromeOS支援度未知。Windows和macOS不支援virglrenderer。目前有一個 針對Windows虛擬機VirGL驅動的PR,但是處於早期階段。
- 圖形API支援:virglrenderer主要支援的是OpenGL,Vulkan支援尚屬於實驗階段。需要在
virgl_test_server
手動啟用Venus選項。 - 此外,因為virglrenderer是半虛擬化技術,可能無法發揮GPU全速。
2. 在宿主機安裝virglrenderer套件#
大部分Linux發行版都有收virglrenderer套件。不過若要體驗最新功能你得參考 官方文件手動編譯新版。
以Ubuntu 24.04為例,先設定 Virt Manager與QEMU/KVM
再安裝virglrenderer套件:
sudo apt install libvirglrenderer-dev libvirglrenderer1 virgl-server
隨後應該會隨Virt Manager自己啟動,不需要跑特別指令。
需要跑自訂指令參數的話,使用virgl_server指令啟動伺服器,例如加入Vulkan支援:
virgl_test_server --use-egl-surfaceless -venus &
3. 在QEMU/KVM虛擬機啟用VirGL#
開啟Virt Manager,新增任意Linux虛擬機。
點選編輯硬體,在顯示卡部份選取
virtio
,並勾選3D加速然後在SPICE協定部份,監聽類型勾選無,再勾選啟用OpenGL
開機之後,虛擬機系統應會自動偵測到virglrenderer並啟用3D加速
在虛擬機執行
dmesg | grep drm
指令查看virgl是否有載入因為VirGL預設僅支援OpenGL,所以要用OpenGL工具來測試。使用
glxinfo | grep OpenGL
指令可得知,這裡使用了virgl,而非純CPU算繪的llvmpipe。
4. 測試VirGL效能#
虛擬機沒有GPU加速的情況下會使用llvmpipe算繪。現在有了virglrenderer,虛擬機內部的軟體應該會自動使用virglrenderer算繪。不過有些桌面環境即使啟用virgl可能還是會lag。
手動指定virgl或virpipe驅動來啟動程式
GALLIUM_DRIVER=virgl firefox
當虛擬機程式在使用3D算繪的時候,宿主機可以觀察到佔用(此圖為intel_gpu_top所顯示)
我們可以用
glmark2
跑分軟體,比較llvmpipe與VirGL的效能:
# 強制CPU算繪
GALLIUM_DRIVER=llvmpipe LIBGL_ALWAYS_SOFTWARE=true glmark2
# 使用VirGL算繪
GALLIUM_DRIVER=virgl glmark2
- 用MPV播放器測試VirGL加速效果,播放高畫質影片解碼效果應當十分明顯,不會出現掉格現象:
GALLIUM_DRIVER=virgl mpv --no-config --vo=gpu --gpu-context=x11egl "影片路徑"