在 WSL 上使用 systemd

前言

巨硬搞的 WSL 非常好用，然鹅，因为他们用了自定义的 init 启动，使用 systemd 会报下面的错误：

Copy
System has not been booted with systemd as init system (PID 1). Can’t operate.

通过 genie 使用 systemd

genie 通过创建一个 pid 空间来实现在 WSL 上使用 systemd。

genie 基于 .NET Core 3 构建，使用前需要先安装 .NET Core 运行环境，安装方法参考微软的官方文档。

然后安装 genie 即可：

Copy
curl -s https://packagecloud.io/install/repositories/arkane-systems/wsl-translinux/script.deb.sh | sudo bash
sudo apt install systemd-genie

genie 的使用方法比较简单：

Copy
# 启动 systemd 环境
genie -i
# 启动 systemd 环境，并在环境中打开 shell
genie -s
# 启动 systemd 环境，并在环境中运行命令
genie -c command

开机启动

只做上面的配置，还无法完成开机自启 enabled services，需要继续配置启动项。

首先进入 WSL 环境，创建 /etc/init.wsl 文件，内容如下：

Copy
#!/bin/bash
/usr/bin/genie -i

然后回到 Windows，Win + R 组合键打开运行，输入 shell:startup 进入启动目录。

创建一个 vbs 文件，名称随意，内容如下：

Copy
Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d Debian -u root /etc/init.wsl", vbhide

注：参数中的 Debian 需要改成你自己使用的 WSL 发行版名称。

参考

在 WSL2 上使用 systemctl