起因
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的详细配置,可以参考这个官方文档。