在wsl2中使用wslg实现完整桌面环境
本教程将指导你在 WSL2 中设置图形用户界面(GUI)。无需在 WSL 外部安装额外软件(如 VcXsrv 或 xrdp)。
我们需要安装的关键组件是你想要的桌面环境元包(GNOME、KDE、Xfce、Budgie 等),然后将默认的 Xorg 替换为调用 Xwayland 的脚本。
在这个演示中,我将使用 Ubuntu 24.04 并安装 GNOME 桌面。不幸的是,较旧版本的 Ubuntu 缺少一些基本组件,因此无法在旧版本中完全重现此设置(至少不能完全实现)。由于关键组件并不局限于 Ubuntu 或 GNOME,你可以使用你喜欢的发行版和图形界面。请查看示例截图部分以了解更多示例。
现在开始吧。首先,你需要一个已安装好的,且能正常运行的 WSL2 。
⚠️
WSLg 可能无法按预期工作,因为 Wayland 套接字对所有人禁用,并非所有应用程序都能处理这种情况。但如果你想原生运行 Wayland 应用程序,可以使用命令
export XDG_RUNTIME_DIR=$HOME/runtime-dir,然后启动你的 WSLg 应用程序。
在正式开始之前,让我们确保系统已更新。
sudo apt update
sudo apt upgrade
你还需要确保 /etc/wsl.conf 文件包含以下内容:
[boot]
systemd=true
如果没有,请创建或编辑此文件,添加这些行,然后重启 WSL(例如,使用 wsl.exe --shutdown,然后重新打开发行版终端)。
现在我们准备好了。
安装组件
安装图形界面
- 首先,选择你喜欢的桌面环境元包。以下是最常见的元包列表:
| Distro | Desktop Environment | Metapackage |
| Ubuntu | Budgie |
|
| GNOME |
| |
| KDE |
| |
| Kylin |
| |
| LXDE |
| |
| MATE |
| |
| Studio |
| |
| Unity |
| |
| Xfce |
| |
| Ubuntu/Debian | Cinnamon |
|
| GNOME |
| |
| GNOME Flashback |
| |
| KDE Plasma |
| |
| LXDE |
| |
| LXQt |
| |
| MATE |
| |
| Xfce |
|
Distro
Desktop Environment
Metapackage
Ubuntu
Budgie
ubuntu-budgie-desktop (非常不推荐使用)
GNOME
ubuntu-desktop
KDE
kubuntu-desktop
Kylin
ubuntukylin-desktop
LXDE
lubuntu-desktop
MATE
ubuntu-mate-desktop
Studio
ubuntustudio-desktop
Unity
ubuntu-unity-desktop
Xfce
xubuntu-desktop
Ubuntu/Debian
Cinnamon
task-cinnamon-desktop
GNOME
task-gnome-desktop
GNOME Flashback
task-gnome-flashback-desktop
KDE Plasma
task-kde-desktop
LXDE
task-lxde-desktop
LXQt
task-lxqt-desktop
MATE
task-mate-desktop
Xfce
task-xfce-desktop
- 选择好元包后,开始安装。例如,如果你选择
ubuntu-desktop,命令如下:
sudo apt install ubuntu-desktop xwayland
这将安装 ubuntu-desktop 和 xwayland(如果你的元包未包含此依赖)。安装过程可能需要一些时间,请耐心等待。
- 如果使用 Ubuntu,你可能想安装
snap-store。如果不需要,可以跳过此步骤:
sudo snap install snap-store
配置环境
如果使用 Debian,你需要配置区域设置(在 Ubuntu 中不需要):
echo "LANG=en_US.UTF-8" | sudo tee -a /etc/default/locale
创建和修改服务
- 现在所有组件都已安装,我们需要修复
/tmp/.X11-unix/目录,因为它默认是只读挂载的。我们将创建一个新的 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
- 保存并退出编辑器。
- 启用
wslg-fix.service:
sudo systemctl enable wslg-fix.service
- 我们还需要移除所有对 Wayland 的引用,否则某些应用程序(例如
gnome-terminal)可能在桌面环境外打开。编辑user-runtime-dir@.service服务:
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
默认情况下,显示管理器为每个用户会话(包括登录界面)调用多个 Xorg 实例(如果你使用 GDM 作为显示管理器)。我们将用调用 Xwayland 的新脚本替换 Xorg 脚本。这是我们试图实现的核心魔法。
- 首先,备份原始
Xorg脚本:
sudo mv /usr/bin/Xorg /usr/bin/Xorg.original
- 创建新的
Xorg脚本:
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[@]}"
请注意虚拟屏幕的分辨率。你可以根据需要更改(1366x768、3840x2160 等)。
- 保存并退出编辑器。
- 设置文件的正确权限并创建链接:
sudo chmod 0755 /usr/bin/Xorg.Xwayland
sudo ln -sf Xorg.Xwayland /usr/bin/Xorg
[!WARNING] 有时,系统更新会将
Xorg链接替换为原始版本。如果发生这种情况,只需重复此步骤,Xwayland将再次作为Xorg的替代品工作。
配置 GDM 和 GNOME 的显示器分辨率
目前,Xwayland 的分辨率是一个烦人的问题。即使使用了 -geometry 开关,GDM 和 GNOME 也不会遵循它。幸运的是,可以通过创建 monitors.xml 文件来覆盖此设置。
- 首先,在当前用户目录下创建文件:
mkdir ~/.config
nano ~/.config/monitors.xml
- 在编辑器中粘贴以下代码(这里配置为 1920x1080 分辨率,如有需要请更改):
0
0
1
yes
XWAYLAND0
unknown
unknown
unknown
1920
1080
59.963
- 保存并退出编辑器。
- 将此文件复制到 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/
- 使用
wsl.exe --shutdown重启 WSL,然后重新打开发行版终端。
启用 GUI 运行你的发行版
现在一切就绪,可以启动了。执行以下命令:
sudo systemctl start graphical.target
稍等片刻(通常几秒钟,如果没有 SSD 可能更久),登录界面应该会出现。
登录后,将显示已登录用户的桌面。注销后,屏幕将再次显示登录界面。这适用于 GDM(如果你安装了 Ubuntu 桌面)。在 GDM 中,你可以通过修改配置文件更改此行为:
sudo nano /etc/gdm3/custom.conf- 取消注释并编辑以下行:
AutomaticLoginEnable=true
AutomaticLogin=[你的用户名,不含括号]
关机
重要提示:一旦启动 WSL 实例,不能直接停止它。你必须执行标准的 Linux 关机操作。以下是两种可选方法:
- 图形界面菜单中的关机选项
sudo poweroff
完成后,你可以安全地关闭 WSL 实例,使用 wsl.exe --terminate 或 wsl.exe --shutdown。
不执行关机过程可能导致 WSL 实例损坏,请小心。
故障排除
- 如果一开始无法工作,尝试查看
journalctl日志:
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
在输出中,你应该能看到为 Xwayland 生成的命令行以及出现的错误消息。当然,即使一切正常,你也可以查看日志以了解发生了什么,或用于调试。
- 检查自定义
Xorg脚本是否被默认版本替换。如果是这种情况,只需重复用 XWayland 替换默认 Xorg部分的步骤。 - 确保
Xorg是你的默认显示服务器,而不是Xephyr或Wayland。如果不是,必须将其更改为以Xorg作为默认显示服务器。 - 如果使用 LightDM,还需检查
/var/log/lightdm的日志(需要使用 sudo 查看该目录中的文件)。Xwayland的输出将位于/var/log/lightdm/x-0.log文件中。 - 如果仍不工作,可以尝试使用
wsl.exe --shutdown重启 WSL(在执行之前不要忘记保存所有未保存的内容,因为 WSL 将完全关闭),然后重新打开发行版终端并重复启用 GUI 运行你的发行版部分的步骤。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)