如何在 WSL2 上启用 systemd:Ubuntu 20 和 CentOS 8

如何在 WSL2 上启用 systemd:Ubuntu 20 和 CentOS 8

我在 WSL2(适用于 Linux 的 Windows 子系统,v2)上,并从以下位置获取了 CentOS 8 WSL:
https://github.com/yuk7/CentWSL

并且从 Windows Store 下载的 Ubuntu 20 WSLsystemd也没有启用。

它可以像往常一样运行,但是,它systemd并没有运行,尽管它确实存在于文件系统中:

$ cat /etc/*-release | grep NAME
NAME="CentOS Linux"
PRETTY_NAME="CentOS Linux 8 (Core)"
CPE_NAME="cpe:/o:centos:centos:8"

$ stat /lib/systemd/systemd
  File: /lib/systemd/systemd
  Size: 2523648         Blocks: 4936       IO Block: 4096   regular file
Device: 2h/2d   Inode: 1407374884100769  Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-05-31 13:17:53.497597100 +0700
Modify: 2020-04-10 04:52:32.000000000 +0700
Change: 2020-05-30 12:06:52.791586300 +0700
 Birth: -

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

/sbin/init已经是指向的符号链接systemd

$ stat /sbin/init
  File: /sbin/init -> ../lib/systemd/systemd
  Size: 22              Blocks: 0          IO Block: 4096   symbolic link
Device: 2h/2d   Inode: 2251799814381086  Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-04-10 04:52:20.000000000 +0700
Modify: 2020-04-10 04:52:20.000000000 +0700
Change: 2020-05-30 12:06:53.461589000 +0700
 Birth: -

我找到了两个初始化文件:

/init
/sbin/init --> /lib/systemd/systemd

可能 WSL2 Linux 内核加载/init而不是/sbin/init

如何systemd在此发行版中启用 sshd、nginx 等守护进程?需要触摸/sbin/init或此类文件吗?

答案1

我这里有一个解决方法,但是对于那些明确需要 systemd 的服务它不起作用:

/init在WSL2 上仍然使用/sbin/init,适用于常规服务,而不是那些明确需要“systemd”的服务。

找出 systemctl 的位置:

which systemctl

使用 systemctl 的路径执行以下命令。

安装 Python 2(如果默认情况下不可用):

sudo dnf install python2 -y
sudo ln -s /usr/bin/python2 /usr/bin/python

用 Python 包装 systemctl(或者以某种方式让 systemctl 与不在 PID 1 上的 systemd 一起工作):

sudo mv /usr/bin/systemctl /usr/bin/systemctl.old
curl https://raw.githubusercontent.com/gdraheim/docker-systemctl-replacement/master/files/docker/systemctl.py >temp
sudo mv temp /usr/bin/systemctl
sudo chmod +x /usr/bin/systemctl

测试systemctl:

sudo dnf install nginx -y
sudo systemctl start nginx
curl localhost
sudo systemctl stop nginx

答案2

systemd-geniehttps://github.com/arkane-systems/genie推荐用于 systemd.io 支持和认可的每个发行版。它既可以在系统模式(systemd --system)下工作,也可以在用户模式(systemd --user)下工作。它维护良好,易于与 wsl 和 Windows 终端集成。无需额外的脚本。

答案3

我发现这很有帮助:

答案4

现在本机wsl负责systemd:参见这里

相关内容