在 WSL2 中使用 WSLg (XWayland) 实现完整桌面环境

本教程将指导你在 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>,然后重新打开发行版终端)。

现在我们准备好了。

安装组件

安装图形界面

  1. **首先,选择你喜欢的桌面环境元包。以下是最常见的元包列表: **
DistroDesktop EnvironmentMetapackage
UbuntuBudgie<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/DebianCinnamon<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>

  1. **选择好元包后,开始安装。例如,如果你选择 **<span>ubuntu-desktop</span>,命令如下:
sudo apt install ubuntu-desktop xwayland

**这将安装 **<span>ubuntu-desktop</span><span>xwayland</span>(如果你的元包未包含此依赖)。安装过程可能需要一些时间,请耐心等待。

  1. **如果使用 Ubuntu,你可能想安装 **<span>snap-store</span>。如果不需要,可以跳过此步骤:
sudo snap install snap-store

配置环境

如果使用 Debian,你需要配置区域设置(在 Ubuntu 中不需要):

echo "LANG=en_US.UTF-8" | sudo tee -a /etc/default/locale

创建和修改服务

  1. **现在所有组件都已安装,我们需要修复 **<span>/tmp/.X11-unix/</span> 目录,因为它默认是只读挂载的。我们将创建一个新的 systemd 单元:
sudo systemctl edit --full --force wslg-fix.service
  1. 在编辑器中粘贴以下代码:
[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
  1. 保存并退出编辑器。
  2. **启用 **<span>wslg-fix.service</span>
sudo systemctl enable wslg-fix.service
  1. **我们还需要移除所有对 Wayland 的引用,否则某些应用程序(例如 **<span>gnome-terminal</span>)可能在桌面环境外打开。编辑 <span>user-runtime-dir@.service</span> 服务:
sudo systemctl edit user-runtime-dir@.service
  1. 在编辑器中粘贴以下代码:
[Service]
ExecStartPost=-/usr/bin/rm -f /run/user/%i/wayland-0 /run/user/%i/wayland-0.lock

⚠️

[!WARNING] 请仔细阅读编辑器的说明,关于粘贴代码前光标应放置的正确位置。如果粘贴到错误位置,代码将被丢弃。

  1. 保存并退出编辑器。
  2. 现在更改默认启动目标,否则每次启动发行版时都会出现一个 shell 窗口(例如,在 Windows 中打开发行版的终端):
sudo systemctl set-default multi-user.target

用 XWayland 替换默认 Xorg

**默认情况下,显示管理器为每个用户会话(包括登录界面)调用多个 **<span>Xorg</span> 实例(如果你使用 GDM 作为显示管理器)。我们将用调用 <span>Xwayland</span> 的新脚本替换 <span>Xorg</span> 脚本。这是我们试图实现的核心魔法。

  1. **首先,备份原始 **<span>Xorg</span> 脚本:
sudo mv /usr/bin/Xorg /usr/bin/Xorg.original
  1. **创建新的 **<span>Xorg</span> 脚本:
sudo nano /usr/bin/Xorg.Xwayland
  1. 在编辑器中粘贴以下代码:
#!/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 等)。

  1. 保存并退出编辑器。
  2. 设置文件的正确权限并创建链接:
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> 文件来覆盖此设置。

  1. 首先,在当前用户目录下创建文件:
mkdir ~/.config
nano ~/.config/monitors.xml
  1. 在编辑器中粘贴以下代码(这里配置为 1920×1080 分辨率,如有需要请更改):
  1. 保存并退出编辑器。
  2. 将此文件复制到 GDM 的主目录:
sudo mkdir /var/lib/gdm3/.config
sudo cp ~/.config/monitors.xml /var/lib/gdm3/.config/
  1. 设置 GDM 用户的 monitors.xml 的正确权限:
sudo chown -R gdm:gdm /var/lib/gdm3/.config/
  1. **使用 **<span>wsl.exe --shutdown</span> 重启 WSL,然后重新打开发行版终端。

启用 GUI 运行你的发行版

现在一切就绪,可以启动了。执行以下命令:

sudo systemctl start graphical.target

稍等片刻(通常几秒钟,如果没有 SSD 可能更久),登录界面应该会出现。

登录后,将显示已登录用户的桌面。注销后,屏幕将再次显示登录界面。这适用于 GDM(如果你安装了 Ubuntu 桌面)。在 GDM 中,你可以通过修改配置文件更改此行为:

  1. <span>sudo nano /etc/gdm3/custom.conf</span>
  2. 取消注释并编辑以下行:
 AutomaticLoginEnable=true
 AutomaticLogin=[你的用户名,不含括号]

关机

重要提示:一旦启动 WSL 实例,不能直接停止它。你必须执行标准的 Linux 关机操作。以下是两种可选方法:

  • 图形界面菜单中的关机选项
  • <span>sudo poweroff</span>

**完成后,你可以安全地关闭 WSL 实例,使用 **<span>wsl.exe --terminate</span><span>wsl.exe --shutdown</span>

不执行关机过程可能导致 WSL 实例损坏,请小心。

故障排除

  1. **如果一开始无法工作,尝试查看 **<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> 生成的命令行以及出现的错误消息。当然,即使一切正常,你也可以查看日志以了解发生了什么,或用于调试。

  1. **检查自定义 **<span>Xorg</span> 脚本是否被默认版本替换。如果是这种情况,只需重复用 XWayland 替换默认 Xorg部分的步骤。
  2. **确保 **<span>Xorg</span> 是你的默认显示服务器,而不是 <span>Xephyr</span><span>Wayland</span>。如果不是,必须将其更改为以 <span>Xorg</span> 作为默认显示服务器。
  3. **如果使用 LightDM,还需检查 **<span>/var/log/lightdm</span> 的日志(需要使用 sudo 查看该目录中的文件)。<span>Xwayland</span> 的输出将位于 <span>/var/log/lightdm/x-0.log</span> 文件中。
  4. **如果仍不工作,可以尝试使用 **<span>wsl.exe --shutdown</span> 重启 WSL(在执行之前不要忘记保存所有未保存的内容,因为 WSL 将完全关闭),然后重新打开发行版终端并重复启用 GUI 运行你的发行版部分的步骤。

参考文档:

原文:https://gist.github.com/tdcosta100/e28636c216515ca88d1f2e7a2e188912

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇