本教程将指导你在 WSL2 中设置图形用户界面(GUI)。无需在 WSL 外部安装额外软件(如 VcXsrv 或 xrdp)。
我们需要安装的关键组件是你想要的桌面环境元包(GNOME、KDE、Xfce、Budgie 等),然后将默认的 Xorg 替换为调用 Xwayland 的脚本。
在这个演示中,我将使用 Ubuntu 24.04 并安装 GNOME 桌面。不幸的是,较旧版本的 Ubuntu 缺少一些基本组件,因此无法在旧版本中完全重现此设置(至少不能完全实现)。由于关键组件并不局限于 Ubuntu 或 GNOME,你可以使用你喜欢的发行版和图形界面。请查看示例截图部分以了解更多示例。
**现在开始吧。首先,你需要一个已安装好的,且能正常运行的 **WSL2 。
⚠️
** WSLg 可能无法按预期工作,因为 Wayland 套接字对所有人禁用,并非所有应用程序都能处理这种情况。但如果你想原生运行 Wayland 应用程序,可以使用命令 **
<span>export XDG_RUNTIME_DIR=$HOME/runtime-dir</span>
,然后启动你的 WSLg 应用程序。
在正式开始之前,让我们确保系统已更新。
sudo apt update
sudo apt upgrade
**你还需要确保 **<span>/etc/wsl.conf</span>
文件包含以下内容:
[boot]
systemd=true
**如果没有,请创建或编辑此文件,添加这些行,然后重启 WSL(例如,使用 **<span>wsl.exe --shutdown</span>
,然后重新打开发行版终端)。
现在我们准备好了。
安装组件
安装图形界面
- **首先,选择你喜欢的桌面环境元包。以下是最常见的元包列表: **
Distro | Desktop Environment | Metapackage |
---|---|---|
Ubuntu | Budgie | <span>ubuntu-budgie-desktop</span> (非常不推荐使用) |
GNOME | <span>ubuntu-desktop</span> | |
KDE | <span>kubuntu-desktop</span> | |
Kylin | <span>ubuntukylin-desktop</span> | |
LXDE | <span>lubuntu-desktop</span> | |
MATE | <span>ubuntu-mate-desktop</span> | |
Studio | <span>ubuntustudio-desktop</span> | |
Unity | <span>ubuntu-unity-desktop</span> | |
Xfce | <span>xubuntu-desktop</span> | |
Ubuntu/Debian | Cinnamon | <span>task-cinnamon-desktop</span> |
GNOME | <span>task-gnome-desktop</span> | |
GNOME Flashback | <span>task-gnome-flashback-desktop</span> | |
KDE Plasma | <span>task-kde-desktop</span> | |
LXDE | <span>task-lxde-desktop</span> | |
LXQt | <span>task-lxqt-desktop</span> | |
MATE | <span>task-mate-desktop</span> | |
Xfce | <span>task-xfce-desktop</span> |
Distro
Desktop Environment
Metapackage
Ubuntu
Budgie
<span>ubuntu-budgie-desktop</span>
(非常不推荐使用)
GNOME
<span>ubuntu-desktop</span>
KDE
<span>kubuntu-desktop</span>
Kylin
<span>ubuntukylin-desktop</span>
LXDE
<span>lubuntu-desktop</span>
MATE
<span>ubuntu-mate-desktop</span>
Studio
<span>ubuntustudio-desktop</span>
Unity
<span>ubuntu-unity-desktop</span>
Xfce
<span>xubuntu-desktop</span>
Ubuntu/Debian
Cinnamon
<span>task-cinnamon-desktop</span>
GNOME
<span>task-gnome-desktop</span>
GNOME Flashback
<span>task-gnome-flashback-desktop</span>
KDE Plasma
<span>task-kde-desktop</span>
LXDE
<span>task-lxde-desktop</span>
LXQt
<span>task-lxqt-desktop</span>
MATE
<span>task-mate-desktop</span>
Xfce
<span>task-xfce-desktop</span>
- **选择好元包后,开始安装。例如,如果你选择 **
<span>ubuntu-desktop</span>
,命令如下:
sudo apt install ubuntu-desktop xwayland
**这将安装 **<span>ubuntu-desktop</span>
和 <span>xwayland</span>
(如果你的元包未包含此依赖)。安装过程可能需要一些时间,请耐心等待。
- **如果使用 Ubuntu,你可能想安装 **
<span>snap-store</span>
。如果不需要,可以跳过此步骤:
sudo snap install snap-store
配置环境
如果使用 Debian,你需要配置区域设置(在 Ubuntu 中不需要):
echo "LANG=en_US.UTF-8" | sudo tee -a /etc/default/locale
创建和修改服务
- **现在所有组件都已安装,我们需要修复 **
<span>/tmp/.X11-unix/</span>
目录,因为它默认是只读挂载的。我们将创建一个新的 systemd 单元:
sudo systemctl edit --full --force wslg-fix.service
- 在编辑器中粘贴以下代码:
[Service]
Type=oneshot
ExecStart=-/usr/bin/umount /tmp/.X11-unix
ExecStart=/usr/bin/rm -rf /tmp/.X11-unix
ExecStart=/usr/bin/mkdir /tmp/.X11-unix
ExecStart=/usr/bin/chmod 1777 /tmp/.X11-unix
ExecStart=/usr/bin/ln -s /mnt/wslg/.X11-unix/X0 /tmp/.X11-unix/X0
ExecStart=/usr/bin/chmod 0777 /mnt/wslg/runtime-dir
ExecStart=/usr/bin/chmod 0666 /mnt/wslg/runtime-dir/wayland-0.lock
[Install]
WantedBy=multi-user.target
- 保存并退出编辑器。
- **启用 **
<span>wslg-fix.service</span>
:
sudo systemctl enable wslg-fix.service
- **我们还需要移除所有对 Wayland 的引用,否则某些应用程序(例如 **
<span>gnome-terminal</span>
)可能在桌面环境外打开。编辑<span>user-runtime-dir@.service</span>
服务:
sudo systemctl edit user-runtime-dir@.service
- 在编辑器中粘贴以下代码:
[Service]
ExecStartPost=-/usr/bin/rm -f /run/user/%i/wayland-0 /run/user/%i/wayland-0.lock
⚠️
[!WARNING] 请仔细阅读编辑器的说明,关于粘贴代码前光标应放置的正确位置。如果粘贴到错误位置,代码将被丢弃。
- 保存并退出编辑器。
- 现在更改默认启动目标,否则每次启动发行版时都会出现一个 shell 窗口(例如,在 Windows 中打开发行版的终端):
sudo systemctl set-default multi-user.target
用 XWayland 替换默认 Xorg
**默认情况下,显示管理器为每个用户会话(包括登录界面)调用多个 **<span>Xorg</span>
实例(如果你使用 GDM 作为显示管理器)。我们将用调用 <span>Xwayland</span>
的新脚本替换 <span>Xorg</span>
脚本。这是我们试图实现的核心魔法。
- **首先,备份原始 **
<span>Xorg</span>
脚本:
sudo mv /usr/bin/Xorg /usr/bin/Xorg.original
- **创建新的 **
<span>Xorg</span>
脚本:
sudo nano /usr/bin/Xorg.Xwayland
- 在编辑器中粘贴以下代码:
#!/bin/bash
for arg do
shift
case $arg in
# Xwayland 不支持 vtxx 参数,因此转换为 ttyxx
vt*)
set -- "$@" "${arg//vt/tty}"
;;
# Xwayland 完全不支持 -keeptty
-keeptty)
;;
# Xwayland 完全不支持 -novtswitch
-novtswitch)
;;
# 其他参数保持不变
*)
set -- "$@" "$arg"
;;
esac
done
# 检查运行时目录是否存在,如果不存在则创建
if [ ! -d $HOME/runtime-dir ]
then
mkdir $HOME/runtime-dir
ln -s /mnt/wslg/runtime-dir/wayland-0 /mnt/wslg/runtime-dir/wayland-0.lock $HOME/runtime-dir/
fi
# 将 XDG_RUNTIME_DIR 变量指向 $HOME/runtime-dir
export XDG_RUNTIME_DIR=$HOME/runtime-dir
# 查找可用的显示编号
for displayNumber in $(seq 1 100)
do
[ ! -e /tmp/.X11-unix/X$displayNumber ] && break
done
# 在这里可以更改或添加选项以适应你的需求
command=("/usr/bin/Xwayland" ":${displayNumber}" "-geometry" "1920x1080" "-fullscreen" "$@")
systemd-cat -t /usr/bin/Xorg echo "Starting Xwayland:" "${command[@]}"
exec "${command[@]}"
请注意虚拟屏幕的分辨率。你可以根据需要更改(1366×768、3840×2160 等)。
- 保存并退出编辑器。
- 设置文件的正确权限并创建链接:
sudo chmod 0755 /usr/bin/Xorg.Xwayland
sudo ln -sf Xorg.Xwayland /usr/bin/Xorg
[!WARNING] **有时,系统更新会将 **
<span>Xorg</span>
链接替换为原始版本。如果发生这种情况,只需重复此步骤,<span>Xwayland</span>
将再次作为<span>Xorg</span>
的替代品工作。
配置 GDM 和 GNOME 的显示器分辨率
**目前,Xwayland 的分辨率是一个烦人的问题。即使使用了 **<span>-geometry</span>
开关,GDM 和 GNOME 也不会遵循它。幸运的是,可以通过创建 <span>monitors.xml</span>
文件来覆盖此设置。
- 首先,在当前用户目录下创建文件:
mkdir ~/.config
nano ~/.config/monitors.xml
- 在编辑器中粘贴以下代码(这里配置为 1920×1080 分辨率,如有需要请更改):
- 保存并退出编辑器。
- 将此文件复制到 GDM 的主目录:
sudo mkdir /var/lib/gdm3/.config
sudo cp ~/.config/monitors.xml /var/lib/gdm3/.config/
- 设置 GDM 用户的 monitors.xml 的正确权限:
sudo chown -R gdm:gdm /var/lib/gdm3/.config/
- **使用 **
<span>wsl.exe --shutdown</span>
重启 WSL,然后重新打开发行版终端。
启用 GUI 运行你的发行版
现在一切就绪,可以启动了。执行以下命令:
sudo systemctl start graphical.target
稍等片刻(通常几秒钟,如果没有 SSD 可能更久),登录界面应该会出现。
登录后,将显示已登录用户的桌面。注销后,屏幕将再次显示登录界面。这适用于 GDM(如果你安装了 Ubuntu 桌面)。在 GDM 中,你可以通过修改配置文件更改此行为:
<span>sudo nano /etc/gdm3/custom.conf</span>
- 取消注释并编辑以下行:
AutomaticLoginEnable=true
AutomaticLogin=[你的用户名,不含括号]
关机
重要提示:一旦启动 WSL 实例,不能直接停止它。你必须执行标准的 Linux 关机操作。以下是两种可选方法:
- 图形界面菜单中的关机选项
<span>sudo poweroff</span>
**完成后,你可以安全地关闭 WSL 实例,使用 **<span>wsl.exe --terminate</span>
或 <span>wsl.exe --shutdown</span>
。
不执行关机过程可能导致 WSL 实例损坏,请小心。
故障排除
- **如果一开始无法工作,尝试查看 **
<span>journalctl</span>
日志:
journalctl -b -t /usr/lib/gdm3/gdm-x-session -t /usr/bin/Xorg --no-pager
如果使用 Debian,命令为:
journalctl -b -t /usr/libexec/gdm-x-session -t /usr/bin/Xorg --no-pager
**在输出中,你应该能看到为 **<span>Xwayland</span>
生成的命令行以及出现的错误消息。当然,即使一切正常,你也可以查看日志以了解发生了什么,或用于调试。
- **检查自定义 **
<span>Xorg</span>
脚本是否被默认版本替换。如果是这种情况,只需重复用 XWayland 替换默认 Xorg部分的步骤。 - **确保 **
<span>Xorg</span>
是你的默认显示服务器,而不是<span>Xephyr</span>
或<span>Wayland</span>
。如果不是,必须将其更改为以<span>Xorg</span>
作为默认显示服务器。 - **如果使用 LightDM,还需检查 **
<span>/var/log/lightdm</span>
的日志(需要使用 sudo 查看该目录中的文件)。<span>Xwayland</span>
的输出将位于<span>/var/log/lightdm/x-0.log</span>
文件中。 - **如果仍不工作,可以尝试使用 **
<span>wsl.exe --shutdown</span>
重启 WSL(在执行之前不要忘记保存所有未保存的内容,因为 WSL 将完全关闭),然后重新打开发行版终端并重复启用 GUI 运行你的发行版部分的步骤。
参考文档:
原文:https://gist.github.com/tdcosta100/e28636c216515ca88d1f2e7a2e188912