在 wsl2 中启用 systemd 的方法至少有如下三种:
本文主要介绍第三种方法,并在后文介绍选用第三种方法的优势。
安装分为两个选项:
以下分别介绍。
下载并解压distrod_wsl_launcher,执行解压出的二进制文件
跟随引导安装一个新的发行版
[可选项]使用如下命令使你的发行版在 windows 启动时自动运行:
sudo /opt/distrod/bin/distrod enable --start-on-windows-boot
下载并运行最新的安装脚本:
curl -L -O "https://raw.githubusercontent.com/nullpo-head/wsl-distrod/main/install.sh"
chmod +x install.sh
sudo ./install.sh install
在你的发行版中开启 distrod
有两个选择:
在 windows 启动时运行你的发行版:
/opt/distrod/bin/distrod enable --start-on-windows-boot
否则:
/opt/distrod/bin/distrod enable
注:接下来仍然可以通过执行/opt/distrod/bin/distrod enable --start-on-windows-boot
让发行版跟随 windows 启动。
重新启动你的发行版
关掉你的 wsl 窗口,在 PowerShell 中执行如下命令:
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 做到了:
--start-on-windows-boot
参数后,Distrod 会注册一个 windows 任务,使得 wsl 在 windows 开机时就会运行。对比其它方法需要手动编写 shell 脚本实现自动启动,安装更简单、使用更方便的 Distrod 无疑更被用户青睐。
在安装、使用过程中遇到任何问题,可以参考官方资料。
文章中发现任何错误欢迎在评论区指出!~