昨天我不得不在 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 的发行版)似乎相当有前景。