MENU

systemd on WSL2

2021 年 10 月 17 日 • 阅读: 4682 • 后端

Intro

最先接触的 Linux 系统是 Ubuntu,唯一会用的命令是 apt-get,每天打开系统的第一件事是 upgrade 所有软件。那时只会跟着网上教程装装中文输入法,把界面美化一通,折腾累了就回到 Windows。

后来用过多台 OpenWrt 路由器,跟着大神的教程配置自启服务,因为还不会 Shell 脚本,根本看不懂具体内容。

后来学会了更多命令,也能写一些 Shell 脚本,开始在 VPS 上部署自己的服务。此时,主流 Linux 系统都已使用 systemd 作为默认 init 程序,因为对 OpenWrt Init Scripts 的第一印象不好,我很快接受了 systemd 这种基于文件而非编程式的配置方式,所以并没有像资深 Linux 用户一样,对 systemd 感到不满。

当 Windows 支持 WSL 时,我已不再使用 Linux GUI,因为它确实没有许多实用的界面程序。但因为兼容性问题,我还得通过 Hyper-V 上的 VM 跑 DockerKubernetes。如今,Docker 已经能不借助 Docker Desktop for Windows 运行在 WSL2 上,这节省我许多内存,也提高了些许流畅性。

现在,我倾向将所有服务都跑在 Docker 里,唯一的遗憾是 systemd 的缺失。

➜  LOGI systemctl
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

Reason

WSL 之所以不支持 systemd 是因为微软实现了自己的 init 进程,便于在 Windows 中管理这些虚拟机。

➜  LOGI ps -ef | grep init | grep -v $$
root         1     0  0 16:10 ?        00:00:00 /init
root         7     1  0 16:10 ?        00:00:00 /init
root         8     7  0 16:10 ?        00:00:00 /init

为此,社区大佬提出可以创建新的 PID namespace,让 systemd 的成为 PID 1

Answer

第一个提出此方案的帖子可能是 Running Snaps on WSL2 (Insiders only for now)。关键命令是

unshare --fork --pid --mount-proc /lib/systemd/systemd

之后衍生项目陆续出现,如:

这些项目的核心原理并无大异,无非是细节处理的好坏和附加功能的多少,但最重要的一点可能是工作层次不同。

Linux Architecture

前三个脚本都工作在图中的 shell 层,要依赖外置命令执行系统调用。genie 工作在 应用程序 层,它使用 C# 编写,通过 shell 执行系统调用,比前三个还多了一层。最后两个虽然也是 应用程序,但它们由 Rust 编写,不经 shell,而直接由 C system call wrapper 执行系统调用,依赖最少,动态链接编译后只有几百 K。

我使用了最后一个,虽然不尽完美,但足以顺畅运行 k8s

References

TG 大佬群 QQ 大佬群

最后编辑于: 2021 年 11 月 29 日
返回文章列表 文章二维码
本页链接的二维码
打赏二维码
添加新评论

Loading captcha...

已有 3 条评论
  1. tao tao   Windows 10 x64 Edition  Google Chrome 105.0.0.0

    每个文章上的封面都是你手动上传的吗

  2. 陈大C 陈大C   Windows 10 x64 Edition  Google Chrome 96.0.4664.55

    LOGI可以出一篇WSL功能介绍吗

    1. LOGI LOGI   Windows 10 x64 Edition  Google Chrome 96.0.4664.93

      @陈大Chttps://docs.microsoft.com/zh-cn/windows/wsl/