Please enable Javascript to view the contents

在WSL2上使用systemctl

 ·   ·  ☕ 3 分钟  ·  ✍️ joyqat

起因

Windows 10 2004版本终于正式推出了WSL2,与WSL1比较,WSL2更像(大胆点,像改成是)一个运行在hyper-V里面的虚拟机(连磁盘都是虚拟磁盘啦)。不过有微软的黑科技加成,WSL2依然可以从linux下的命令行直接运行/调用windows程序。因为本质虚拟机,所以原来在WSL1里面的一些问题也就不存在了(例如网络工具、docker、编译器运行时等)。理所当然的切换到了WSL2。

然而,WSL2的启动方式和WSL1似乎是一致的,都是通过微软自定义的init启动。进程树的root pid不是0,而是1,原来不能使用的systemctl依旧不能使用。会直接提示:

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

而这直接导致了我通过apt安装的docker.io不能使用(因为需要通过systemctl来启动)。

通过genie来使用systemctl

来看一下genie的项目介绍:

A quick way into a systemd “bottle” for WSL
——“快速进入systemd环境的方法”

genie通过创建一个pid空间来实现在WSL2上使用systemd(以及相关联的systemctl等工具)。废话不多说,以下以Ubuntu 20.04为例,来看一下具体的使用方法:
genie基于.net core 3构建,所以要先安装.net core运行时环境。参考微软的文档,可以直接安装deb包来添加.net core的安装源:

1
2
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb

然后,genie的二进制包通过packagecloud.io分发,通过以下命令配置&安装:

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

这样genie就安装完毕了。genie的使用方法也相对简单:

1
2
3
4
5
6
# 启动systemd环境
genie -i
# 启动systemd环境,并在环境中打开shell
genie -s
# 启动systemd环境,并在环境中运行命令
genie -c command

所以systemctl可以通过两种方式使用,一种:

1
2
3
4
5
6
genie -s
# 这时应该启动了新的shell,shell的host后面会带上-wsl尾缀
# 此时可以正常使用systemctl等命令
systemctl start xxxx
# 完事之后可以返回原shell
exit

另一种:

1
genie -c systemctl start xxxx

所以,对于我来说,可以一个脚本解决我遇到的问题:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
# 从apt源安装并使用docker.io,同时配置genie
if [ "$EUID" -ne 0 ]
  then echo "Please run as root"
  exit
fi
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
dpkg -i packages-microsoft-prod.deb
curl -s https://packagecloud.io/install/repositories/arkane-systems/wsl-translinux/script.deb.sh | sudo bash
apt install systemd-genie docker.io
# 避免可能的竞争条件,https://github.com/arkane-systems/genie/issues/70
genie -i
sleep 0.05
# 按照推荐,因为不使用,所以禁用getty@tty1
genie -c systemctl disable getty@tty1
# 启用并启动docker
genie -c systemctl enable docker
genie -c systemctl start docker
# 以下是配置不需要root权限也可以使用docker命令,不需要的话可以去掉
groupadd docker
gpasswd -a $SUDO_USER docker
newgrp docker
# 后面每次重启WSL2之后,只需要genie -i即可

其他

如果需要启动WSL2的时候就启用genie,可以把genie -i命令加入.bashrc。

如果需要卸载,可以使用:

1
2
3
sudo apt purge systemd-genie apt-transport-https packages-microsoft-prod
sudo rm /etc/apt/sources.list.d/arkane-systems_wsl-translinux.list
# 别忘了使用apt update更新apt缓存

WSL2的详细配置,可以参考这个官方文档

分享
您的鼓励是我最大的动力
alipay QR Code
wechat QR Code

joyqat
作者
joyqat