如何使用 systemd 作为 init 系统启动系统 (PID 1)

Joh*_*ker 3 vpn systemd windows-subsystem-for-linux wireguard

我使用的是安装了 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 wg-quick@wg0.service
systemctl start wg-quick@wg0.service
Run Code Online (Sandbox Code Playgroud)

这会导致以下错误消息:

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

我花了几天时间进行研究,现在对如何继续感到非常困惑。谁能帮帮我吗。

Not*_*1ds 5

我知道,答案很晚,但社区机器人今天显然选择了这个问题来“碰撞”,因为它没有答案。我不确定这有多大用处,因为 OP 已经 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 确实为/etc/init.d. 因此,某些服务可以使用旧命令启动service(例如service ssh start)。但我猜 Wireguard 的情况并非如此。

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

ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
Run Code Online (Sandbox Code Playgroud)

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

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

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

根据这个答案,可以构建自己的内核来实现这一点。我发现讨论如何在 WSL 中安装 Wireguard 的这篇文章支持了这一点。我建议解决这个问题,然后回来询问有关这些说明中可能不起作用的任何问题。