本文讓Ivon解說如何在Windows WSL跑Linux桌面環境和播放音訊,並將Linux環境中文化。
WSL支援透過WSLg跑圖形程式 (GUI apps)。例如在WSL內安裝firefox套件,輸入firefox
指令,就會在Windows打開一個Firefox獨立視窗,可吃到GPU硬體加速。
更進一步說,你還可以用WSL跑GNOME、XFCE、KDE、LXQT、Cinnamon等桌面環境,體驗使用Linux電腦的感覺。
比方說下圖是WSL Ubuntu跑KDE桌面的樣子,你可以在Windows與Ubuntu之間無縫切換,效能比虛擬機好。
影片版示範
請注意WSL內的桌面功能跟Linux實機有差距,也可能出現各種詭異bug。
想體驗完整Ubuntu桌面的話,我還是建議你安裝Ubuntu到實體機器上,例如 Windows 11與Ubuntu雙重開機
1. 環境#
- Windows 11 22H2
- WSL 2.0.9.0
- WSL Ubuntu 22.04
WSL預設是按照你電腦的RAM切一半給Linux用。若要跑圖形環境可能會比較吃資源,建議至少要留4GB RAM給Linux。你可以調整 wslconfig讓WSL分配到多一點硬體資源。
2. 說明#
請看Microsoft提供的WSLg架構圖
為什麼不直接使用WSLg顯示Linux桌面呢?嗯…它使用Wayland顯示協定,已經有自己的視窗管理器,只能啟動文章一開始提到的Firefox這類「單一窗口」的程式,不能啟動新的桌面環境。
當你啟動Firefox的時候,視窗會被WSLg「搶走」。但我希望開一個桌面環境的視窗後,所有的程式都待在該視窗內。
所以放棄Wayland,跑一個獨立的X伺服器比較好,讓所有X程式都跑在同一個視窗裡。
X伺服器的選擇有三個:
- WSL外面跑VcXsrv、X410這類獨立的X伺服器程式(詳見 不使用WSLg跑WSL圖形程式的方法 )
- WSL內跑Xephyr
- WSL內跑XWayland
我選擇跑WSL內跑Xephyr或XWayland。這背後是利用 XWayland Rootful Mode的機制,這樣等同在WSL的Walyand裡面再跑一個巢狀X伺服器。
音效部分,因為Windows要單獨跑PulseAudio伺服器很麻煩,我們就沿用WSLg內建的音訊伺服器來播WSL的音效吧。
那由於WSLg使用Wayland,下面我們將透過環境變數,指定所有Linux程式使用X而非Wayland顯示,即可防止啟動程式的時候跑到WSLg那邊。
3. 安裝桌面環境套件#
登入WSL Ubuntu,用APT開始安裝套件。
四擇一,你要全裝也可以。裝完套件後先不要急著啟動。
KDE#
Kubuntu的桌面,華麗度不輸GNOME。
套件名稱:kubuntu-desktop
或plasma-desktop
啟動指令:dbus-run --exit-with-session startplasma-x11
XFCE#
Xubuntu的桌面,很輕量,預設狀態有點醜。
套件名稱:xubuntu-desktop
或xfce4 xfce4-goodies
啟動指令:dbus-run --exit-with-session startxfce4
LXQT#
Lubuntu的桌面,跟XFCE一樣輕量的桌面。
套件名稱:lubuntu-desktop
或lxqt
啟動指令:dbus-run --exit-with-session startlxqt
GNOME#
Ubuntu系統的預設桌面。注意GNOME我不確定能開起來,因為會牽扯到systemd的問題。
目前WSL2 1.2.5需要額外裝指令稿,參閱 WSL 2 GNOME Desktop - Github gist
4. 啟動桌面環境#
- 安裝WSL Ubuntu,登入WSL
wsl
- 儲存環境變數到
~/.profile
,告訴程式全數使用X當作渲染後端。如果你不這樣做,Linux程式使用Wayland渲染的話會被WSLg抓走,跑到視窗外面。
echo "export XDG_SESSION_TYPE=x11" >> ~/.profile
echo "export GDK_PLATFORM=x11" >> ~/.profile
echo "export GDK_BACKEND=x11" >> ~/.profile
echo "export QT_QPA_PLATFORM=xcb" >> ~/.profile
echo "export WAYLAND_DISPLAY=" >> ~/.profile
source ~/.profile
- 啟動X伺服器(二擇一),指定解析度為1600x900。啟動後會彈出一個新視窗。
# Xephyr的指令,視窗可縮放
Xephyr -br -ac -noreset -resizeable -screen 1600x900 :1 &
# XWayland的指令,視窗無法縮放 (XWalyand 23.0以上版本才可以使用geometry引數,Ubuntu 22.04得手動編譯新版XWayland)
Xwayland -ac -decorate -geometry 1600x900 -host-grab :1 &
- 接著,在終端機啟動桌面環境,例如KDE。我在指令末尾加了
&
表示在背景執行,這樣我們才可以繼續使用終端機
export DISPLAY=:1
dbus-launch --exit-with-session startplasma-x11 &
幾秒鐘後X視窗就會看到KDE桌面了
要關閉桌面環境,登出WSL,將其關機
exit
wsl --shutdown
5. 調整Ubuntu語言與輸入法#
中文語言可以從KDE介面設定,或者使用以下指令產生:
sudo apt install locales
sudo locale-gen zh_TW.UTF-8
sudo update-locale LANG=zh_TW.UTF-8
輸入法部分,請在Linux端安裝 Fcitx5 + 新酷音。如果開啟桌面環境後Fcitx5沒有跳出來,請點選應用程式列表的「Fcitx5」圖示手動啟動。
按CTRL+SHIFT可在X伺服器的視窗擷取鍵盤組合鍵。
如果要在Linux與Windows之間同步剪貼簿,可以在兩邊系統裝 KDE Connect,配對後剪貼簿就會自動同步了。
6. 一些程式小問題#
VLC播放影片莫名很卡,改用MPV吧。
MPV播放影片可以加上--vo=x11
的引數,強制使用X11。
mpv video.mp4 --vo=x11
Snap版Firefox沒有聲音,建議移除,改裝Mozilla ppa提供的Firefox ESR:
sudo snap remove firefox
sudo add-apt-repository ppa:mozillateam/ppa
sudo apt update
sudo apt install firefox-esr
部分Flatpak程式在X11環境下開不起來,目前找不到辦法解決。
7. 如何將一切回復原狀#
將~/.profile
檔案內強制使用X11的5個環境變數註解或移除掉。下次登入WSL,應用程式就會恢復從WSLg開啟的模式了。