WSL 2 GUI 问题 - 使用 sudo 命令无法打开 Synaptic 和 pluma

WSL 2 GUI 问题 - 使用 sudo 命令无法打开 Synaptic 和 pluma

我安装了 WSL 2 和 Mate 桌面环境。我可以通过 xrdp 登录。我可以浏览系统和互联网,但我缺少一些功能,例如打开 synaptic 或使用 sudo 命令打开编辑器。此外,控制中心内的一些设置无法打开,我无法更改桌面语言。有没有解决方法,安装一些所需的软件包来管理它?或者通过编辑一些文件和权限?

多谢

答案1

概括

这个问题的细节有点少,但我认为我可以重现大部分(如果不是全部的话)。可能有两个问题导致了问题中列出的问题:

  • WSL 目前缺乏 Systemd 支持
  • 根用户需要链接到.Xauthority

安装

好的,让我们从安装过程开始,以确保我们在同一页面上。在新的 WSL/Ubuntu 20.04 实例中,我执行了以下操作:

sudo apt update && sudo apt upgrade
sudo apt install ubuntu-mate-desktop xrdp synaptic
# Selected lightdm for login during install, but I don't think it matters
sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak
sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini
echo "mate-session" > ~/.xsession

创建~/.xsessionrc者:

export XDG_SESSION_DESKTOP=mate
export XDG_CURRENT_DESKTOP=ubuntu:mate
export XDG_DATA_DIRS=/usr/share/mate:/usr/local/share:/usr/share:/var/lib/snapd/desktop
export XDG_CONFIG_DIRS=/etc/xdg/xdg-mate:/etc/xdg

然后xrdp通过以下方式开始:

sudo service xrdp start

初始启动

此时,我能够使用 Windows 远程桌面连接来localhost:3390连接到 MATE 桌面。

我立即收到崩溃错误blueman-applet。这并不奇怪,因为 WSL 不支持蓝牙,但我可能不会想到会崩溃。blueman-applet从终端运行会显示更多信息,最后显示:

__bus = Gio.bus_get_sync(Gio.BusType.SYSTEM)
gi.repository.GLib.Error: g-io-error-quark: Could not connect: No such file or directory (1)

嗯。听起来像是总线问题。让我们回到这个问题上...

过了一会儿,我又一次遇到了崩溃update-manager。再次从终端运行,结果显示:

dbus.exceptions.DBusException: org.freedesktop.DBus.Error.FileNotFound: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory

好吧,我们确实遇到了一些问题。此时您可能甚至没有注意到这些问题,因为这些错误似乎在第一次出现后就被抑制了。

sudo 问题

> sudo pluma does_this_work.txt
No protocol specified
Cannot open display: 
Run 'pluma --help' to see a full list of available command line options.

Synaptic 也出现了类似的问题。

这很容易通过以下方式解决这个答案

sudo ln -s $HOME/.Xauthority /root

現在sudo synaptic可以sudo pluma正確運行。

无法更改语言和其他设置问题

尝试打开语言设定来自控制中心导致窗口尝试显示但立即崩溃。再次,让我们看看终端输出gnome-language-selector

dbus.exceptions.DBusException: org.freedesktop.DBus.Error.FileNotFound: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory

嘿,我感觉到这里有一种模式……

根本原因和(希望)解决方案

Gnome 需要 Systemd。WSL 不使用 Systemd,而是使用自己的/initPID1。请参阅我的答案在这里了解其功能的详细信息。对于本次讨论来说,最重要的是,请注意它将 Windows 路径附加到 Linux/WSL 路径并处理 Interop,以便您可以启动 Windows 可.exe剪切文件。

可以让 WSL 中的 Ubuntu 认为 Systemd 处于控制状态,我们需要这样做才能使 Gnome 正常工作。

我将给你一个最简单的解决方案。它是不是必然最好的解决方案。由于它是“准系统”,您将无法运行 Windows.exe可剪切文件。您还将丢失 Windows 路径,但由于这实际上只对运行 Windows 程序有用,因此我们将这部分视为同一限制。

如果你想要一个更复杂的解决方案来尝试解决这个问题,请查看这个问题, 具体来说精灵或者WSL2 黑客

但所有这些都只是更复杂的版本:

sudo -b unshare --pid --fork --mount-proc /lib/systemd/systemd --system-unit=multi-user.target

这将在具有自己的 PID 映射的新命名空间中启动 Systemd。在该命名空间内,Systemd 将是 PID1(这是它必须具备的功能,才能正常运行)并拥有所有其他进程。但是,“真实”PID 映射仍然存在于该命名空间之外。

等待几秒钟,运行ps -ef。如果您看到许多/lib/systemd/systemd-udevd进程,则表示 Systemd 仍在启动。稍等片刻,然后重试。

systemd注意不是还有 PID1。那是因为我们有创建命名空间,但我们还没有已输入还没完成。

当进程列表“稳定下来”时,Systemd 就可以运行了。在我的系统上,这实际上只需要 5 秒钟左右。此时,使用以下命令进入命名空间:

sudo -E nsenter --all --wd="$PWD" -t $(pgrep -xo systemd) runuser -P -l $USER -c "exec $SHELL"

ps -ef此时执行将显示systemd为 PID1,以及它启动的所有其他服务。

最佳做法是禁用任何您不需要的 Systemd 单元,但这对于让 MATE 运行得更好并不是必需的。

现在我们处于 Systemd 命名空间中:

sudo systemctl start xrdp
sudo systemctl status xrdp

然后尝试通过 RDP 连接。

到目前为止,事情进展得非常顺利,我想您可能会问:

  • 您可以更改语言(退出 MATE 并通过 RDP 重新连接后生效)
  • 您可以访问用户和组设置、磁盘设置等。
  • 您无法访问蓝牙,因为没有硬件支持,但至少它现在给出了正确的消息,而不是崩溃。
  • 您不应该进行任何网络或防火墙配置,因为 WSL 仍然需要管理这些

笔记

一旦您在实例中启动了 Systemd,它就会“接管”。在启动时,它会创建大量文件并启动进程。如果您同时启动另一个 WSL Ubuntu 会话,如果不进入命名空间,您可能会遇到问题。例如:

> sudo service xrdp status
Failed to retrieve unit state: Connection reset by peer
Failed to get properties: Connection reset by peer

这是因为该service命令检测到某些文件/var/run已由 Systemd 创建,并尝试使用 Systemd。

如果您想返回到 Interop 可以工作的“正常” WSL 工作环境(例如,您可以运行 Visual Studio Code),那么您必须(从 PowerShell 或 CMD)wsl --terminate <distroname>(distroname 很可能是Ubuntu),然后重新启动 WSL。

相关内容