![WSL2 与 Ubuntu 和 VCXSRV:xeyes 和 git citool 工作但无法启动 ubuntu-desktop](https://linux22.com/image/199529/WSL2%20%E4%B8%8E%20Ubuntu%20%E5%92%8C%20VCXSRV%EF%BC%9Axeyes%20%E5%92%8C%20git%20citool%20%E5%B7%A5%E4%BD%9C%E4%BD%86%E6%97%A0%E6%B3%95%E5%90%AF%E5%8A%A8%20ubuntu-desktop.png)
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>
并重新启动它。否则,有很多事情同时无法进行。
同样,为了“更好”地做到这一点,请使用上面列出的脚本/项目之一。他们将尝试在该命名空间内设置环境变量、套接字和符号链接,以使事物能够更正常地运行。