如何使用 systemd 作为初始化系统(PID 1)来启动系统

如何使用 systemd 作为初始化系统(PID 1)来启动系统

我使用的是安装了 Windows Subsystem for Linux (WSL) 的 Ubuntu 终端环境。版本是 Ubuntu 20.04.1 LTS (GNU/Linux 4.4.0-18362-Microsoft x86_64)。按照各个网站上的说明在我的 WIndows 10 PC 上设置 Wireguard VPN 服务器,我发出了以下命令:

systemctl enable [email protected]
systemctl start [email protected]

这会导致以下错误消息:

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down.

我花了好几天时间研究,现在完全不知道该怎么做。有人能帮帮我吗?

答案1

我知道回答晚了,但社区机器人显然今天选择了这个问题来“顶”,因为它没有答案。我不确定这有多大用处,因为原帖者已经 8 个月没有上过网站了,所以即使社区顶它来征求答案,它仍然不太可能得到公认答案是,至少短期内不会。

您实际上提出了三个独立但相关的问题:

  1. 如何在 WSL 上运行 Wireguard VPN。为此,您尝试使用 Systemd 单元文件启动服务systemctl。引出下一个问题...

  2. 如何在 WSL 上启动 Systemd 服务/单元文件。当您尝试这样做时,您会收到一条错误消息,这会引导您回答标题中的问题...

  3. 如何以 systemd 为 PID 1 进行启动。

让我先从 (3) 开始。目前无法使用 Systemd 作为 PID 1 来运行 WSL。WSL 使用自己的专有闭源init(位于每个 WSL 发行版的根目录中,即/init)作为 PID 1。这对于 WSL 的运行至关重要。它执行许多关键功能,例如启动虚拟网络堆栈等。请参阅我的回答这里了解更多信息。

至于 (2),这并不是说你不能使用 Systemd 的systemctl,但它确实非常困难。说实话,我从来没有这样做过,但你可以在这个答案等等。

WSL 上的 Ubuntu 确实为 中的某些软件包提供了一些旧式的 SysVInit 脚本。因此,某些服务可以使用旧命令(例如)/etc/init.d启动。不过,我猜 Wireguard 的情况并非如此。serviceservice ssh start

但是还有另一种“使用”Systemd 单元文件的方法,那就是确定它们正在做什么并复制它。例如,如果您使用的是不service支持的发行版sshd,那么您可以查看/usr/lib/systemd/system/ssh.service并看到(以及其他行):

ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS

...所以systemctl start ssh首先会检查配置(-t),然后通过命令启动服务/usr/sbin/sshd -D $SSHD_OPTS

因此,关于问题(3),可能可以读取 Wireguard 单元文件来确定它是如何启动的。

但……至少可以说,这将是具有挑战性的。首先,根据这一页,Wireguard 作为内核模块运行。而且... WSL 的默认内核不支持添加模块。

根据这个答案,可以构建自己的内核来实现这一点。并且它由这个帖子我发现讨论如何在 WSL 中安装 Wireguard。我建议先完成这个步骤,然后回来询问这些说明中可能不起作用的任何问题。

答案2

最好的解决方案是在 WSL 中使用 Ubuntu18.04。sudo /etc/init.d/mysql start 完美运行,最好的资源是https://docs.microsoft.com/en-us/windows/wsl/tutorials/wsl-database

相关内容