WSL 错误 System has not been booted with systemd as init system (PID 1). Can‘t operate

这篇具有很好参考价值的文章主要介绍了WSL 错误 System has not been booted with systemd as init system (PID 1). Can‘t operate。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

描述

项目 描述
操作系统 Windows 10 专业版
版本 WSL 2

前情

适用与 Linux 的 Windows 的子系统(WSL) 默认情况下是无法使用 systemctl 命令,使用该命令 WSL 将抛出如下错误。

System has not been booted with systemd as init system (PID 1). Can’t operate.

我们通常可以使用 service 命令 或通过 /etc/init.d 来替代 systemctl 命令。
具体操作如下(仅部分,这里通过操作 postgresql 服务来演示):

项目 systemctl service /etc/init.d
开启 systemctl start postgresql service postgresql start /etc/init.d/postgresql start
关闭 systemctl stop postgresql service postgresql stop /etc/init.d/postgresql stop
状态 systemctl status postgresql service postgresql status /etc/init.d/postgresql status

直面挑战

使用其他命令可以代替 systemctl,但这终归是一场逃亡。这不,在使用 gvm-setup 下载 gvm(即漏洞扫描工具 OpenVAS 的新名称)相关数据时,gvm-setup 非要使用 systemctl 命令来启动 postgresql,即使你已经人为启动了 postgresql。

WSL 错误 System has not been booted with systemd as init system (PID 1). Can‘t operate

使 WSL2 能够使用 systemctl 命令(非临时)

1. 在该操作完成后 WSL 2 可能会发生一些变化,如 每次登录都需要输入密码(即使是普通用户),如果无法接受请不要执行下述操作或在执行完成后 “原路返回”。

WSL 错误 System has not been booted with systemd as init system (PID 1). Can‘t operate

2. 目前 WSL 仅支持使用 WSL 2 的发行版使用 systemctl 命令,如果不知道需更改的 Linux 发行版使用的 WSL 版本,请键入如下命令进行查看。
wsl -l -v
# 或
wsl --list --verbose

WSL 错误 System has not been booted with systemd as init system (PID 1). Can‘t operate
通过终端的输出可以发现,我使用的是 kali-linux,使用的版本是 WSL 2。

若你仍在使用 WSL 1,可在 cmd(以管理员身份运行)中输入如下命令升级 WSL。
wsl --update
在升级完成后,请键入如下命令以更改对应的 Linux 发行版使用的 WSL 版本。
wsl --set-version <Linux 发行版名称> 2

以 kali-linux 为例,将其使用的 WSL 升级到 WSL 2使用的命令为

wsl --set-version kali-linux 2

获取软件包 daemonize 及 fontconfig

请在进入 Linux 后,在终端输入如下命令:

apt install daemonize fontconfig

在 /etc/profile 文件末尾(并不强制)加入下述代码

SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
if [ -z "$SYSTEMD_PID" ]; then
  sudo /usr/sbin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
  SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
fi
if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then
  exec sudo /usr/bin/nsenter -t $SYSTEMD_PID -a su - $LOGNAME
fi

/etc/sudoers 文件末尾(并不强制)加入下述代码

%sudo ALL=(ALL) NOPASSWD: /usr/sbin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
%sudo ALL=(ALL) NOPASSWD: /usr/bin/nsenter -t [0-9]* -a su - [a-zA-Z0-9]*

使修改生效

sudo -s
source /etc/profile

修改后遇到的一些问题

在修改后你可能会遇到下面的错误(仅在 root 用户下发生),请不要慌张,此前曾以为这种现象而认为这种方法没有效果。
WSL 错误 System has not been booted with systemd as init system (PID 1). Can‘t operate
遇到这种现象后请先使用 exit 命令退出 Linux 终端。
退出后再次进入 Linux 终端,不要使用 su root 命令切换用户,使用 sudo -s 命令来切换为 root 用户。

此时,可正常使用 systemctl 命令。
WSL 错误 System has not been booted with systemd as init system (PID 1). Can‘t operate

至于发生上述错误的具体原因暂时还未查明,如有读者清楚,还望不吝赐教。文章来源地址https://www.toymoban.com/news/detail-416879.html

到了这里,关于WSL 错误 System has not been booted with systemd as init system (PID 1). Can‘t operate的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包