在 wsl2 中完美启用 systemd

在 wsl2 中启用 systemd 的方法至少有如下三种：

genie

subsystemctl

wsl-distrod

本文主要介绍第三种方法，并在后文介绍选用第三种方法的优势。

安装方法

安装分为两个选项：

安装一个新的带有 systemd 的发行版

为现有的发行版增加 systemd 支持

以下分别介绍。

安装一个新的带有 systemd 的发行版

下载并解压distrod_wsl_launcher，执行解压出的二进制文件

跟随引导安装一个新的发行版

[可选项] 使用如下命令使你的发行版在 windows 启动时自动运行：

Copy
sudo /opt/distrod/bin/distrod enable --start-on-windows-boot

为现有的发行版增加 systemd 支持

下载并运行最新的安装脚本：

Copy
curl -L -O "https://raw.githubusercontent.com/nullpo-head/wsl-distrod/main/install.sh"
chmod +x install.sh
sudo ./install.sh install

在你的发行版中开启 distrod

有两个选择：

在 windows 启动时运行你的发行版：

Copy
/opt/distrod/bin/distrod enable --start-on-windows-boot

否则：

Copy
/opt/distrod/bin/distrod enable

注：接下来仍然可以通过执行/opt/distrod/bin/distrod enable --start-on-windows-boot让发行版跟随 windows 启动。

重新启动你的发行版

关掉你的 wsl 窗口，在 PowerShell 中执行如下命令：

Copy
wsl --shutdown

接下来重新打开一个新的 wsl 窗口，你的 shell 将在 systemd 会话中运行。

与其它方法的对比

在官方文档中，Distrod 描述了其工作原理：

简而言之，Distrod 是一个二进制文件，它会创建一个简单的容器，将 systemd 作为 init 进程，并在该容器中启动您的 wsl 会话。为了做到这一点， Distrod 做了以下事情：

修改具体发行版的 rootfs，以使其与 wsl 和 systemd 兼容。

修改 systemd 服务，使其与 wsl 兼容。

把/opt/distrod/bin/distrod和其它资源放进 rootfs。

把 Distrod 二进制文件注册为登录 shell。

当 Distrod 作为登录 shell 被 wsl 的 init 进程启动时，Distrod：

在简单的容器中启动 systemd

在这个容器中启动你实际的 shell

在 systemd 会话和 wsl 交互环境间建立桥梁。

事实上 Distrod 和 genie、subsystemctl 的工作原理是类似的：创建一个容器，在容器内以 pid 1 启动 systemd 并使用 shell。在其官方文档中也有提过：

把 Distrod 作为一个独立的一次性命令：在这种情况下， distrod 的工作方式就像 genie 和 subsystemctl。

但是，Distrod 在自启动方面做了更多的工作。通过上述操作，Distrod 做到了：

安装并启用后，启动 wsl 会自动启动 systmed。

添加--start-on-windows-boot参数后，Distrod 会注册一个 windows 任务，使得 wsl 在 windows 开机时就会运行。

对比其它方法需要手动编写 shell 脚本实现自动启动，安装更简单、使用更方便的 Distrod 无疑更被用户青睐。

结语

在安装、使用过程中遇到任何问题，可以参考官方资料。

文章中发现任何错误欢迎在评论区指出！~