在WSL2里,Linux发行版默认是不配置systemd的。但是很多东西都需要这个服务,例如Docker。本文将会演示如何配置Ubuntu 20.4下的systemd

安装开启需要的软件

得益于genie项目,在WSL2启动systemd成为了一件比较简单的事情

确认版本

输入下面的命令确认你在用wsl2

1
wsl -l -v

如果显示下面的结果就是wsl2

如果显示的是1的话,使用下面的命令变成wsl2

1
wsl --set-version Ubuntu 2

安装软件

进入WSL,输入下面的命令添加软件源并安装genie

1
2
3
4
5
6
7
8
9
10
11
wget -O /etc/apt/trusted.gpg.d/wsl-transdebian.gpg https://arkane-systems.github.io/wsl-transdebian/apt/wsl-transdebian.gpg

chmod a+r /etc/apt/trusted.gpg.d/wsl-transdebian.gpg

cat << EOF > /etc/apt/sources.list.d/wsl-transdebian.list
deb https://arkane-systems.github.io/wsl-transdebian/apt/ $(lsb_release -cs) main
deb-src https://arkane-systems.github.io/wsl-transdebian/apt/ $(lsb_release -cs) main
EOF

apt update
sudo apt install -y systemd-genie

完成设置

由于Ubuntu systemd启动时会加载一些不必要的服务导致启动卡顿,首先需要对服务进行配置

有问题的服务列表可以到这里找到

开始设置之前

需要将target更改为multi-user

1
systemctl set-default multi-user.target  

首先我们需要重启wsl并尝试启动systemd

1
2
wsl --shutdown
wsl genie -s

这时候将会尝试启动systemd服务并进入genie的沙盒环境中,首次启动将会非常慢。启动进入之后将会打印出有问题的服务,可以按照下面的步骤进行配置

ssh.service

1
sudo ssh-keygen -A

systemd-remount-fs.service

可以简单的使用下面的命令修复,需要先确认一下你的设备位置是不是/dev/sdb

1
sudo e2label /dev/sdb cloudimg-rootfs

multipathd.service

1
sudo systemctl disable multipathd.service

完成上面的步骤之后重启wsl并进入沙盒环境就能看到systemd已经正常可用

自动启动

在你的~/.profile末尾加入下面的命令

1
2
3
4
5
6
7
8
9
10
# Are we in the bottle?
if [[ ! -v INSIDE_GENIE ]]; then
read -t 3 -p "yn? * Preparing to enter genie bottle (in 3s); abort? "
echo

if [[ $yn != "y" ]]; then
echo "Starting genie:"
exec /usr/bin/genie -s
fi
fi

这样每次进入wsl你都会进入到带systemd的环境中了