WSL2 与 Ubuntu 和 VCXSRV:xeyes 和 git citool 工作但无法启动 ubuntu-desktop

WSL2 与 Ubuntu 和 VCXSRV:xeyes 和 git citool 工作但无法启动 ubuntu-desktop

xeyes 和 git citool 正在工作,但我无法启动 ubuntu-desktop。尝试过

startx

或者

sudo startx

但错误消息显示:未找到屏幕(EE)

是否可以让 ubuntu-desktop 在 Windows 10 Pro 上使用 vcxsrv 运行?在互联网上搜索了几个小时但找不到解决方案。

答案1

在开始之前,请允许我说“不要这样做”;-)。我已经做到了,我会告诉你怎么做,但是……只是不要这样做。当我们进入答案时我会解释原因。

回答问题有一个“简单的部分”,但是……困难的部分。

让我们讨论两个主要问题:

简单的部分

首先,通过发出startx,您尝试在 Linux 中启动 X 服务器。实际上您已经通过运行 VcXsrv 做到了这一点。此时您真正需要的是会话管理器——那就是gnome-session.这是最简单的部分。

困难的部分

困难的部分是 Gnome(以及 Ubuntu 桌面)确实需要系统d。 WSL 不支持 Systemd,至少在没有大量黑客攻击的情况下是这样。这种黑客行为改变了 WSL 中很多事情的工作方式。您应该能够轻松地深入了解 WSL、Linux 和 Systemd 的内部结构,以便解决“出错”的问题。

虽然有一些项目试图为您进行这种黑客攻击,但我仍然建议您对怎么样为什么对您的 WSL 实例所做的更改。

因此,在非常高的层面上,我将在这里介绍其中的一些内容。

一些替代方案

但首先让我提供一些在 WSL 上运行 Ubuntu 桌面的替代方案:

  • 如果您确实想要在 WSL 上获得 Linux 桌面体验,请选择不需要 Systemd 的桌面体验,例如 Xfce4。
  • 如果您确实想要在 Windows 上运行 Ubuntu Desktop/Gnome,请在虚拟机中运行它。您将放弃 WSL 提供的与 Windows 的紧密集成,但您将拥有完全支持 Systemd 的 Ubuntu。

好吧,既然我已经尝试说服你了,但失败了……;-)

如何在 WSL2 上运行 Systemd,允许您在 VcXsrv 上运行 Ubuntu 桌面

让我们介绍一些“帮助”您在 WSL 上运行 Systemd 的项目:

我还要指出 Genie 用于这些说明在运行 Ubuntu 桌面时。

如果您想跳过其余部分,可以直接转到这些说明。或者,我可以向您展示“快速而肮脏”的启动和运行方式。然后您可以决定是否要完成完整的设置。

最终,所有这些的作用是在 WSL/Linux 中创建一个新的命名空间,其中 Systemd 可以作为 PID1 运行。

您可以通过执行以下命令看到这一点(并让 Ubuntu 桌面快速运行):

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

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

请注意,这是启动 Systemd 的“最低限度”命令行。它至少不会支持:

  • Windows Interop(运行 Windows .exe 的能力)
  • Windows 路径(无论如何,如果没有 Windows Interop,则不需要)

上面列出的脚本和项目需要做额外的工作才能让这些东西正常工作。

等待几秒钟 Systemd 启动,然后:

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

这将进入命名空间,您现在可以使用ps -efH它来查看它systemd在该命名空间中作为 PID 1 运行。

到时候,就有足够的Systemd 正在运行并配置为运行gnome-session并连接到 VcXsrv。不过,启动可能需要几分钟。

请注意,尝试此操作后,您确实应该退出 WSL,发出 awsl --terminate <distroname>并重新启动它。否则,有很多事情同时无法进行。

同样,为了“更好”地做到这一点,请使用上面列出的脚本/项目之一。他们将尝试在该命名空间内设置环境变量、套接字和符号链接,以使事物能够更正常地运行。

相关内容