這篇文章討論在WSL2跑圖形界面和音訊的方法,不使用WSLg。
WSL2剛出來的時候還沒有WSLg這個好用的東西,必須自行解決X伺服器與音訊伺服器的問題。
- 相關文章: WSLg跑Linux桌面環境
過去我們要在Windows端準備一款X伺服器 (X server) 的程式,讓WSL能夠把畫面顯示到該軟體上。
現在有了基於Wayland的WSLg,這個方法也就沒什麼價值了,因其效能不彰又極其麻煩。Microsoft在WSLg實現了類似GPU直通的功能,讓Linux可以存取Windows的顯示卡達成硬體加速。如果沒有WSLg,你就只有效能慘兮兮的virglrenderer可以在WSL的Linux端達成GPU硬體加速。
1. 停用WSLg#
目前WSL預設啟用WSLg,必須使用.wslconfig的手段,強制停用WSLg。
安裝 WSL2 Ubuntu
切換到Windows的C槽使用者家目錄
C:\Users\使用者名稱
,新增設定檔.wslconfig
編輯該檔案,輸入以下內容,停用WSLg
[wsl2]
guiApplications=false
- 重新啟動WSL
wsl --shutdown
wsl -d Ubuntu
2. 設定X伺服器VcXsrv#
VcXsrv說實在有點陽春,如果不介意付費的話可改用閉源的 X410,它整合了X伺服器+音訊伺服器。
到 Sourceforge下載exe安裝
安裝後桌面會多出一個XLaunch.exe的捷徑,點選開啟
選取One Large Window
勾選Disable access control,允許所有連入連線
開啟一個空白視窗,等待連線
3. 設定PulseAudio音訊伺服器#
註:我用Windows 11測試時PulseAudio時是跑不起來的,看來Windows版問題很多,也許你可以改在手機或其他電腦安裝PulseAudio,用Wifi串流方式接收WSL的訊號。
下載PulseAudio程式, FreeDestkopOrg官網的好像已經沒在維護了,請改用 Patrick Gaskin維護的版本
安裝PulsAudio的時候,勾選Allow External Connection和Allow module loading。
切換到
C:\Users\使用者名稱\Program Files (x86)\PulseAudio
資料夾編輯
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存檔(記事本無法直接儲存,要先存到其他位置再複製回來)編輯
etc\daemon.conf
,將; exit-idle-time = 20
改成exit-idle-time = -1
。開啟終端機,啟動PulseAudio伺服器
cd "C:\Users\使用者名稱\Program Files (x86)\PulseAudio"
./pulseaudio.exe
4. 啟動圖形環境#
- 設定以下環境變數,指定X伺服器的位址,存到
~/.profile
。DISPLAY
後面的變數會自動偵測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
- 還有PulseAudio伺服器位址。
echo "export PULSE_SERVER=tcp:localhost" > ~/.profile
source ~/.profile
- 安裝桌面環境,例如XFCE
sudo apt install xfce4 xfce4-goodies pulseaudio
- 啟動桌面環境,VcXsrv應該會看到畫面。
dbus-launch --exit-with-session startxfce4 &
5. virglrenderer圖形加速#
不是所有程式都支援VirGL驅動,務必注意。
- 確認WSL有認到Windows的顯示卡,數值不應為llvmpipe
sudo apt install mesa-utils
glxinfo | grep OpenGL
- 安裝virglrenderer套件
sudo apt install libvirglrenderer-dev libvirglrenderer1 virgl-server
- 啟動headless virgl server
virgl_test_server --use-egl-surfaceless &
- 之後,在啟動程式前面使用環境變數,指定virpipe,程式就會吃到GPU加速
GALLIUM_DRIVER=virpipe firefox