我在 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
我发现这很有帮助:
- https://github.com/DamionGans/ubuntu-wsl2-systemd-script注:此方法不再有效
- 安装所需工具的脚本
- 在单独的命名空间中启动 systemd 的脚本
- 在 systemd 命名空间中运行脚本的脚本
- https://github.com/arkane-systems/genie
- 意识形态几乎相同,但却是单一二进制。
- 需要 DotNet
- 需要加工(即不适用于 CentOS7)
答案4
现在本机wsl
负责systemd
:参见这里