Windows wsl2支持systemd
背景
很多Linux发行版都是使用systemd来管理程序进程,但是在WSL中默认是用init来管理进程的。
为了符合长久的使用习惯,且省去不必要的学习成本,就在WSL的发行版(我这里安装的是Ubuntu20.04)中支持systemd,也就可以使用systemctl命令来启停进程。
相关知识
能够支持使用systemctl命令,提供完整 systemd 的项目有很多:
- diddledani/one-script-wsl2-systemd: The one-script variant of the systemd hack for WSL2 (github.com)
- ubuntu-wsl2-systemd-script
- wsl2-hacks
- genie
- subsystemd
- Angea
这些项目的核心原理并无大异,无非是细节处理的好坏和附加功能的多少,但最重要的一点可能是工作层次不同。
前三个脚本都工作在图中的 shell 层,要依赖外置命令执行系统调用。
genie 工作在应用程序层,它使用 C# 编写,通过 shell 执行系统调用,比前三个还多了一层。
最后两个虽然也是应用程序,但它们由 Rust 编写,不经 shell,而直接由 C system call wrapper 执行系统调用,依赖最少,动态链接编译后只有几百 K。
systemd
在较新的Linux系统上,都使用systemd 管理进程,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。
systemd为系统启动和管理提供了完整的解决方案。它提供了一组命令。字母d是守护进程(daemon)的缩写。
init
WSL2 的发行版均拥有微软提供的 init,它是一种 systemd 的替代方案,不支持 systemctl 命令,
WSL2 本身是由 Windows 负责运行的,因此使用 tree 或 ps 命令时会看到根进程不是 systemd,这将导致无法启动 Linux 系统服务的守护进程 (deamon)。
当我们执行 systemctl 命令的时候,会显示出我们的 init system (PID 1) 并非 systemd,而是微软提供的 init。
systemctl
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
安装
首先,需要确认使用的是WSL2版本,可以在PowerShell中执行如下命令查看:
wsl -l -v
如果显示为1,可以使用如下命令进行配置,其中<Version>修改成2即可:
wsl --set-default-version <Version>
还可以使用如下方式设置默认的Linux发行版,其中<distro name>替换为要配置的Linux发行版名称。
例如,wsl —set-version Ubuntu-20.04 会将Ubuntu20.04发行版设置为使用WSL2:
wsl --set-version <distro name>
在网上找到很多种支持的方法,最简单的就是微软官方提供的方法,仅需要添加一个配置文件即可。
1、打开PowerShell命令行,更新WSL。
wsl --update
2、打开Ubuntu 22.04,在 /etc
目录新建wsl.conf
文件,添加如下内容:
[boot]
systemd=true
3、关闭Ubuntu窗口。
4、打开PowerShell命令行,重启WSL。
wsl --shutdown
5、重新在Windows Terminal中打开Ubuntu发行版,输入如下命令检查是否成功:
systemctl
出现上述的结果则代表支持systemd成功。
参考
Systemd support is now available in WSL!
版本
Windows 10 专业版 22H2
Ubuntu 20.04
via https://www.kuangstudy.com/m/bbs/1630743121099210753