如果微软如此大力推广 systemd,那么为什么我要使用 System V 在 Ubuntu 18.04 LTS WSL 中重启我的服务?

如果微软如此大力推广 systemd,那么为什么我要使用 System V 在 Ubuntu 18.04 LTS WSL 中重启我的服务?

昨天我不得不在 WSL 中重新启动我的 apache2 服务器,令我惊讶的是我无法systemctl像在 Ubuntu 上那样使用;而必须恢复到sudo /etc/init.d/apache2 restart.

但我认为 Lennart Poettering 与微软有联系;这里发生了什么?

答案1

您在标题和问题之间有几个问题和陈述需要解决:

如果微软这么大力推动 systemd

我以为 Lennart Poettering 与微软有联系

正如评论中指出的,微软和 Poettering 之间、微软和 Systemd 之间都没有关系。

我很惊讶我不能systemctl像在 Ubuntu 上那样使用;而必须恢复到 sudo /etc/init.d/apache2 restart

这在 WSL 下是可以预料到的。 WSL 中“缺失的部分”之一仍然是对替代 PID1 管理程序(又名 Systemd,尽管公平地说还有其他一些管理程序)的支持。

您会在 WSL github 存储库中发现许多与此相关的问题,但我相信两个主要问题是:

问题的核心在于,WSL 使用自己的/init进程来引导 Windows 和 Linux/WSL 之间的大部分互操作。我已经列出了部分清单这个询问 Ubuntu 答案

Systemd 的整体设计(至少在这方面)要求它是 PID1任何及其所有功能都可以正常工作。

它是可能的使用 WSL2 启动一个新的 PID 命名空间,使用 Systemd 作为 PID1,进入该命名空间,然后使用systemctl功能。然而,它也有很多警告。

不过,要在实践中看到这一点(不是“正常使用”):

sudo -b unshare --pid --fork --mount-proc /lib/systemd/systemd --system-unit=basic.target
# Wait 10-20 seconds for things to start up
sudo -E nsenter --all -t $(pgrep -xo systemd) runuser -P -l $USER -c "exec $SHELL"

您应该能够通过 启动 Apache systemctl

请注意,这会导致多个其他但问题是:

  • 由于 Systemd 删除了 WSL 处理程序,您将无法运行 Windows 可执行文件binfmt_misc
  • Windows 路径不会附加到 WSL2/Linux 路径。
  • systemd-tmpfiles由于删除了套接字,WSLg 无法在 Windows 11 中工作
  • 和别的

有一些第三方脚本(Genie、WSL2Hacks 等)旨在让 WSL2 和 Systemd 协同工作,但是您真的大部分情况下不需要它们。

对于大多数任务,如您所见,您可以简单地使用init.d脚本(如果您的发行版中提供了这些脚本)。您还可以考虑使用替代进程管理程序,例如 Supervisord,它不要求它是 PID1。它甚至可以设置为在 Windows 11 中自动启动并运行您需要的任何启动任务。

就我个人而言,我一直在 WSL 下尝试非 Systemd 发行版。dinit到目前为止,带有进程管理器的 Artix(基于 Arch 的发行版)似乎相当有前景。

相关内容