WSL 错误 System has not been booted with systemd as init system (PID 1). Can‘t operate
Posted 两个月亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。
使 WSL2 能够使用 systemctl 命令(非临时)
注
1. 在该操作完成后 WSL 2 可能会发生一些变化,如 每次登录都需要输入密码(即使是普通用户),如果无法接受请不要执行下述操作或在执行完成后 “原路返回”。
2. 目前 WSL 仅支持使用 WSL 2 的发行版使用 systemctl 命令,如果不知道需更改的 Linux 发行版使用的 WSL 版本,请键入如下命令进行查看。
wsl -l -v
# 或
wsl --list --verbose
通过终端的输出可以发现,我使用的是 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 用户下发生),请不要慌张,此前曾以为这种现象而认为这种方法没有效果。
遇到这种现象后请先使用 exit 命令退出 Linux 终端。
退出后再次进入 Linux 终端,不要使用 su root 命令切换用户,使用 sudo -s 命令来切换为 root 用户。
此时,可正常使用 systemctl 命令。
至于发生上述错误的具体原因暂时还未查明,如有读者清楚,还望不吝赐教。
System.ServiceProcess.TimeoutException: Time out has expired and the operation has not been complete
项目代码如下
ServiceController service = new ServiceController("ModbusAgent"); service.Stop(); TimeSpan timeout = new TimeSpan(50000); service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
按照Stackoverflow:Time out has expired and the operation has not been completed in Service manager的说法,不要对其设置服务超时
于是代码改成:
ServiceController service = new ServiceController("ModbusAgent"); service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped);
问题解决
以上是关于WSL 错误 System has not been booted with systemd as init system (PID 1). Can‘t operate的主要内容,如果未能解决你的问题,请参考以下文章
System.ServiceProcess.TimeoutException: Time out has expired and the operation has not been complete
安装IBM Rational Software Architect时出现问题:your system has not been modified
beego安装后 bee new 时报错"bee: command not found"
GO 解决使用bee工具,报 bash: bee: command not found
include/caffe/common.cuh: error: function "atomicAdd(double *, double)" has already bee(代码