gute Fee Asked: 2021-12-11 05:28:52 +0800 CST2021-12-11 05:28:52 +0800 CST 2021-12-11 05:28:52 +0800 CST 带有 Ubuntu 和 VCXSRV 的 WSL2:xeyes 和 git citool 工作但无法启动 ubuntu-desktop 772 xeyes 和 git citool 正在工作,但我无法启动 ubuntu-desktop。试过了 startx 或者 sudo startx 但错误消息显示:未找到屏幕(EE) 是否有可能让 ubuntu-desktop 在 Windows 10 Pro 上使用 vcxsrv 运行?在互联网上搜索了几个小时,但找不到解决方案。 ubuntu desktop 1 个回答 Voted Best Answer NotTheDr01ds 2021-12-11T14:17:28+08:002021-12-11T14:17:28+08:00 在我开始之前,让我说“不要那样做”;-)。我已经做到了,我会告诉你怎么做,但是......只是不要。当我们进入答案时,我将说明原因。 您回答问题有一个“简单的部分”,嗯......困难的部分。 让我们讨论两个主要问题: 容易的部分 首先,通过发出startx,您正在尝试在 Linux 中启动 X 服务器。您实际上已经通过运行 VcXsrv 做到了这一点。此时您真正需要的是会话管理器——即gnome-session. 那是容易的部分。 困难的部分 困难的部分是 Gnome(以及因此 Ubuntu 桌面)确实需要Systemd。WSL 不支持 Systemd,至少不是没有很多hackery。那个hackery改变了WSL中很多事情的工作方式。您应该能够相当深入地研究 WSL、Linux 和 Systemd 的内部结构,以便对“出错”的事情进行故障排除。 虽然有一些项目试图为您做这种黑客行为,但我仍然建议您了解对WSL实例进行更改的方式和原因。 所以,在一个非常高的层次上,我将在这里介绍其中的一些内容。 一些替代品 但让我首先提供一些在 WSL 上运行 Ubuntu Desktop 的替代方案: 如果您真的想要在 WSL 上获得 Linux 桌面体验,请选择不需要 Systemd 的,例如 Xfce4。 如果你真的想要 Windows 上的 Ubuntu Desktop/Gnome,那么在 VM 中运行它。您将放弃 WSL 提供的与 Windows 的紧密集成,但您将拥有一个具有完全支持的 Systemd 的 Ubuntu。 好的,所以现在我试图说服你但失败了...... ;-) 如何在 WSL2 上运行 Systemd,允许您在 VcXsrv 上运行 Ubuntu 桌面 让我们介绍一些“帮助”您在 WSL 上运行 Systemd 的项目: 精灵 WSL2-黑客 发行版 我还要指出,Genie 用于运行 Ubuntu 桌面的这些说明。 如果您想跳过其余部分,可以直接查看这些说明。或者,我可以向您展示“快速而肮脏”的启动和运行方式。然后,您可以决定是否要完成完整设置。 最终,所有这些都是在 WSL/Linux 中创建一个新的命名空间,其中 Systemd 可以作为 PID1 运行。 您可以通过执行以下命令看到这一点(并让 Ubuntu Desktop 快速运行): sudo -b unshare --pid --fork --mount-proc /lib/systemd/systemd --system-unit=multi-user.target 这会在具有自己的 PID 映射的新命名空间中启动 Systemd。在该命名空间内,Systemd 将是 PID1(它必须运行)并拥有所有其他进程。但是,“真正的”PID 映射仍然存在于该命名空间之外。 请注意,这是启动 Systemd 的“最低限度”命令行。它至少不支持: Windows 互操作(运行 Windows .exe 的能力) Windows PATH(无论如何,如果没有 Windows 互操作,这不是必需的) 上面列出的脚本和项目做了额外的工作以使这些东西也能正常工作。 等待几秒钟让 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>并重新启动它。否则,有许多事情在此期间将无法正常工作。 同样,要“更好”地做到这一点,请使用上面列出的脚本/项目之一。他们将尝试在该命名空间内设置环境变量、套接字和符号链接,以使事情更正常地运行。
在我开始之前,让我说“不要那样做”;-)。我已经做到了,我会告诉你怎么做,但是......只是不要。当我们进入答案时,我将说明原因。
您回答问题有一个“简单的部分”,嗯......困难的部分。
让我们讨论两个主要问题:
容易的部分
首先,通过发出
startx
,您正在尝试在 Linux 中启动 X 服务器。您实际上已经通过运行 VcXsrv 做到了这一点。此时您真正需要的是会话管理器——即gnome-session
. 那是容易的部分。困难的部分
困难的部分是 Gnome(以及因此 Ubuntu 桌面)确实需要Systemd。WSL 不支持 Systemd,至少不是没有很多hackery。那个hackery改变了WSL中很多事情的工作方式。您应该能够相当深入地研究 WSL、Linux 和 Systemd 的内部结构,以便对“出错”的事情进行故障排除。
虽然有一些项目试图为您做这种黑客行为,但我仍然建议您了解对WSL实例进行更改的方式和原因。
所以,在一个非常高的层次上,我将在这里介绍其中的一些内容。
一些替代品
但让我首先提供一些在 WSL 上运行 Ubuntu Desktop 的替代方案:
好的,所以现在我试图说服你但失败了...... ;-)
如何在 WSL2 上运行 Systemd,允许您在 VcXsrv 上运行 Ubuntu 桌面
让我们介绍一些“帮助”您在 WSL 上运行 Systemd 的项目:
我还要指出,Genie 用于运行 Ubuntu 桌面的这些说明。
如果您想跳过其余部分,可以直接查看这些说明。或者,我可以向您展示“快速而肮脏”的启动和运行方式。然后,您可以决定是否要完成完整设置。
最终,所有这些都是在 WSL/Linux 中创建一个新的命名空间,其中 Systemd 可以作为 PID1 运行。
您可以通过执行以下命令看到这一点(并让 Ubuntu Desktop 快速运行):
这会在具有自己的 PID 映射的新命名空间中启动 Systemd。在该命名空间内,Systemd 将是 PID1(它必须运行)并拥有所有其他进程。但是,“真正的”PID 映射仍然存在于该命名空间之外。
请注意,这是启动 Systemd 的“最低限度”命令行。它至少不支持:
上面列出的脚本和项目做了额外的工作以使这些东西也能正常工作。
等待几秒钟让 Systemd 启动,然后:
这进入了命名空间,您现在可以使用它
ps -efH
来查看它systemd
在该命名空间中作为 PID 1 运行。到那时, Systemd 已经足够运行并配置为运行
gnome-session
并连接到 VcXsrv。不过,启动可能需要几分钟。请注意,尝试此操作后,您确实应该退出 WSL,发出 a
wsl --terminate <distroname>
并重新启动它。否则,有许多事情在此期间将无法正常工作。同样,要“更好”地做到这一点,请使用上面列出的脚本/项目之一。他们将尝试在该命名空间内设置环境变量、套接字和符号链接,以使事情更正常地运行。