快轉到主要內容

Windows 11 WSL2跑Linux桌面環境與圖形程式的方法,使用WSLg XWayland

Linux系統 虛擬機與容器技術 Windows Subsystem for Linux KDE Plasma GNOME
🗓️ 民國112年 癸卯年
✍ 切換正體/簡體字
目錄

Read this article in English

本文讓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「搶走」。但我希望開一個桌面環境的視窗後,所有的程式都待在該視窗內。

所以跑一個獨立的X伺服器比較好。所有X程式都跑在同一個視窗裡。

X伺服器的選擇有三個:

  1. WSL外面跑VcXsrv、X410這類獨立的X伺服器程式(詳見 不使用WSLg跑WSL圖形程式的方法
  2. WSL內跑Xephyr
  3. WSL內跑XWayland

我選擇跑WSL內跑Xephyr或XWayland。這樣等同在WSL的Walyand裡面再跑一個X伺服器。

音效部分,因為Windows要單獨跑Pulse Audio伺服器很麻煩,我們就利用WSLg內建的音訊伺服器來播WSL的音效吧。

那由於WSLg使用Wayland,下面我們將透過環境變數,指定所有Linux程式使用X而非Wayland顯示,即可防止啟動程式的時候跑到WSLg那邊。

3. 安裝桌面環境套件
#

登入WSL Ubuntu,用APT開始安裝套件。

四擇一,你要全裝也可以。裝完套件後先不要急著啟動。

KDE
#

Kubuntu的桌面,華麗度不輸GNOME。

套件名稱:kubuntu-desktopplasma-desktop

啟動指令:dbus-run --exit-with-session startplasma-x11

XFCE
#

Xubuntu的桌面,很輕量,預設狀態有點醜。

套件名稱:xubuntu-desktopxfce4 xfce4-goodies

啟動指令:dbus-run --exit-with-session startxfce4

LXQT
#

Lubuntu的桌面,跟XFCE一樣輕量的桌面。

套件名稱:lubuntu-desktoplxqt

啟動指令:dbus-run --exit-with-session startlxqt

GNOME
#

Ubuntu系統的預設桌面。注意GNOME我不確定能開起來,因為會牽扯到systemd的問題。

目前WSL2 1.2.5需要額外裝指令稿,參閱 WSL 2 GNOME Desktop - Github gist

4. 啟動桌面環境
#

  1. 安裝WSL Ubuntu,登入WSL
wsl
  1. 儲存環境變數到~/.profile,告訴程式全數使用X渲染。如果你不這樣做,在X伺服器視窗開的Linux程式可能會跑到視窗外面。
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
  1. 啟動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 &
  1. 接著,在終端機啟動桌面環境,例如KDE。我在指令末尾加了&表示在背景執行,這樣我們才可以繼續使用終端機
export DISPLAY=:1
dbus-launch --exit-with-session startplasma-x11 &
  1. 幾秒鐘後X視窗就會看到KDE桌面了

  2. 要關閉桌面環境,登出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開啟的模式了。

參考資料
#

相關文章

如何編譯與更換WSL核心 (custom WSL kernel)
Linux系統 虛擬機與容器技術 Linux Windows Subsystem for Linux
不只Ubuntu!Windows WSL用Distrobox裝多重Linux容器
Linux系統 虛擬機與容器技術 Distrobox Windows Subsystem for Linux Docker
WSL Docker的GPU硬體加速:virglrenderer
Linux系統 虛擬機與容器技術 VirGL Windows Subsystem for Linux Docker

留言板

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

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

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