在WSL2上使用systemctl

  |   0 评论   |   1,454 浏览

起因

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的安装源:

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

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

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

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

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

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

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

另一种:

1genie -c systemctl start xxxx

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

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

其他

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

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

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

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

评论

发表评论


取消