我安装了 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,而是使用自己的/init
PID1。请参阅我的答案在这里了解其功能的详细信息。对于本次讨论来说,最重要的是,请注意它将 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。