快轉到主要內容

WSL跑Linux的X server圖形環境 + virglrenderer硬體加速(不使用WSLg)

Linux系統 虛擬機與容器技術 Windows Subsystem for Linux VirGL
🗓️ 民國113年 甲辰年
✍ 切換正體/簡體字
目錄

這篇文章討論在WSL2跑圖形界面和音訊的方法,不使用WSLg。

執行於Windows 11的WSL Ubuntu XFCE桌面

WSL2剛出來的時候還沒有WSLg這個好用的東西,必須自行解決X伺服器與音訊伺服器的問題。

過去我們要在Windows端準備一款X伺服器 (X server) 的程式,讓WSL能夠把畫面顯示到該軟體上。

現在有了基於Wayland的WSLg,這個方法也就沒什麼價值了,因其效能不彰又極其麻煩。Microsoft在WSLg實現了類似GPU直通的功能,讓Linux可以存取Windows的顯示卡達成硬體加速。如果沒有WSLg,你就只有效能慘兮兮的virglrenderer可以在WSL的Linux端達成GPU硬體加速。

1. 停用WSLg
#

目前WSL預設啟用WSLg,必須使用.wslconfig的手段,強制停用WSLg。

  1. 安裝 WSL2 Ubuntu

  2. 切換到Windows的C槽使用者家目錄C:\Users\使用者名稱,新增設定檔.wslconfig

  3. 編輯該檔案,輸入以下內容,停用WSLg

[wsl2]
guiApplications=false
  1. 重新啟動WSL
wsl --shutdown

wsl -d Ubuntu

2. 設定X伺服器VcXsrv
#

VcXsrv說實在有點陽春,如果不介意付費的話可改用閉源的 X410,它整合了X伺服器+音訊伺服器。

  1. Sourceforge下載exe安裝

  2. 安裝後桌面會多出一個XLaunch.exe的捷徑,點選開啟

  3. 選取One Large Window

  4. 勾選Disable access control,允許所有連入連線

  5. 開啟一個空白視窗,等待連線

3. 設定PulseAudio音訊伺服器
#

註:我用Windows 11測試時PulseAudio時是跑不起來的,看來Windows版問題很多,也許你可以改在手機或電腦安裝PulseAudio,來接收WSL的訊號。

  1. 下載PulseAudio程式, FreeDestkopOrg官網的好像已經沒在維護了,請改用 Patrick Gaskin維護的版本

  2. 安裝PulsAudio的時候,勾選Allow External Connection和Allow module loading。

  3. 切換到C:\Users\使用者名稱\Program Files (x86)\PulseAudio資料夾

  4. 編輯etc\default.pa,把#load-module module-native-protocol-tcp這行換成load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1,並以ANSI存檔(記事本無法直接儲存,要先存到其他位置再複製回來)

  5. 編輯etc\daemon.conf,將; exit-idle-time = 20改成exit-idle-time = -1

  6. 開啟終端機,啟動PulseAudio伺服器

cd "C:\Users\使用者名稱\Program Files (x86)\PulseAudio"

./pulseaudio.exe

4. 啟動圖形環境
#

  1. 設定以下環境變數,指定X伺服器的位址,存到~/.profileDISPLAY後面的變數會自動偵測WSL的IP。LIBGL_ALWAYS_INDIRECT則是VcXsrv要求設定的。
echo "export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0" >> ~/.profile

echo "export LIBGL_ALWAYS_INDIRECT=1" > ~/.profile
  1. 還有PulseAudio伺服器位址。
echo "export PULSE_SERVER=tcp:localhost" > ~/.profile

source ~/.profile
  1. 安裝桌面環境,例如XFCE
sudo apt install xfce4 xfce4-goodies pulseaudio
  1. 啟動桌面環境,VcXsrv應該會看到畫面。
dbus-launch --exit-with-session startxfce4 &

5. virglrenderer圖形加速
#

不是所有程式都支援VirGL驅動,務必注意。

  1. 確認WSL有認到Windows的顯示卡,數值不應為llvmpipe
sudo apt install mesa-utils

glxinfo | grep OpenGL
  1. 安裝virglrenderer套件
sudo apt install libvirglrenderer-dev libvirglrenderer1 virgl-server
  1. 啟動headless virgl server
virgl_test_server --use-egl-surfaceless &
  1. 之後,在啟動程式前面使用環境變數,指定virpipe,程式就會吃到GPU加速
GALLIUM_DRIVER=virpipe firefox

參考資料
#

相關文章

Windows 11用WSL跑Linux的Android容器「Waydroid」
Linux系統 虛擬機與容器技術 Waydroid Windows Subsystem for Linux
啟用巢狀Hyper-V,讓Windows 11 QEMU/KVM虛擬機支援WSL與WSA
Linux系統 虛擬機與容器技術 Libvirt Windows Subsystem for Linux QEMU Windows
WSL Docker的GPU硬體加速:virglrenderer
Linux系統 虛擬機與容器技術 VirGL Windows Subsystem for Linux Docker

留言板

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

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

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。