描述

项目 描述
操作系统 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" ]; thensudo /usr/sbin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.targetSYSTEMD_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" ]; thenexec 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 命令。

至于发生上述错误的具体原因暂时还未查明,如有读者清楚,还望不吝赐教。

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

  1. window10下WSL使用Ubuntu报错: System has not been booted with systemd as init system (PID 1). Can‘t operat

    用window10下WSL使用Ubuntu来用Docker 当我使用命令sudo systemctl start docker的时候报错: System has not been booted wit ...

  2. win11安装的Ubuntu20.04子系统出现System has not been booted with systemd as init system (PID 1)问题的解决流程

    目录 一.前言 二.具体解决方法 第一步:切换root用户至自己账号 第二步:重新安装xrdp 第三步:重新配置端口并启动xrdp 第四步:打开远程连接窗口 第五步:点击连接,开始进入Linux子系统 ...

  3. 排障集锦:九九八十一难之第十八难!-----System has not been booted with systemd as init system (PID 1). Can‘t operat

    报错现象如下 System has not been booted with systemd as init system (PID 1). Can't operate. Failed to conn ...

  4. System has not been booted with systemd as init system (PID 1). Can‘t operat

    原因 docker run -it centos /bash/bin 在容器中安装服务 systemctl start xxx.service 报错 System has not been boote ...

  5. docker报错:System has not been booted with systemd as init system (PID 1). Can‘t operate.

    docker使用centos7命令 systemctl 报错 $ systemctl status firewalld System has not been booted with systemd ...

  6. Linux 系统服务管理器(初始化系统/init system) -- systemd 及命令 systemctl 的详细介绍

    文章目录 一.系统服务管理器 systemd (一)systemd 的特性 (二)systemd 与 传统 init 系统的区别 (三)systemd 的目录和文件 (四)systemd 的 Unit ...

  7. vb6.0 定义一个公共类_纠正网上的错误:能不能自定义一个类叫java.lang.System/String?...

    前语:不要为了读文章而读文章,一定要带着问题来读文章,勤思考. 作者:一汪清水  来源:https://dwz.cn/i7Pf6VwZ 最近,学习了下java类加载相关的知识.然后看到网上有一道面试题 ...

  8. System.IO.FileNotFoundException:“未能加载文件或程序集“System.Runtime, Version=5.0.0.0, Culture=neutral, Public

    新手学习C#,生成Program.cs时遇到以下错误: System.IO.FileNotFoundException:"未能加载文件或程序集"System.Runtime, Ve ...

  9. System.Net.WebException: The operation has timed out at System.Net.HttpWebRequest.GetResponse()

    System.Net.WebException: The operation has timed out  at System.Net.HttpWebRequest.GetResponse() 在请求 ...

最新文章

  1. 关于Spring Cloud 框架热部署的方法
  2. Android float 四舍五入没有入的一个问题
  3. C语言 error C4996: This function or variable may be unsafe - C语言零基础入门教程
  4. jquery 遍历无限极树_jQuery parent()和children()树遍历函数示例
  5. CodeForces - 95C Volleyball(建边+dij)
  6. bootstrap引入文件方法
  7. 支付那些事儿III---一个BD汪眼中的产品II
  8. python语法元素合集
  9. 华为android怎么换字体大小,华为手机设置字体大小的具体步骤
  10. FFmpegFFplay常用命令汇总
  11. vs2013 MFC入门
  12. Sprintboot 解压Zip文件,ZipEntry的zipEntry.getSize()为-1的问题
  13. 工厂模式——烘烤OO披萨
  14. 张飞的流水帐日记【分享】
  15. rm -rf 误删除数据如何进行恢复
  16. 前辈不是我,借他人事迹助暖通新人!
  17. 软件安装时出现Command line option syntax error?
  18. 华为云服务器还需要确定位置吗,有了云服务器还需要主机吗
  19. ubuntu和windows复制粘贴
  20. 删除数据库表中的重复记录

热门文章

  1. 微服务-消息总线 SpringCloud Bus
  2. 小白怎么运营抖音,制作出漂亮的视频,成为抖音大V
  3. APUE编程:134---进程间通信(命名域套接字:struct sockaddr_un)
  4. sound、noise、voice的区别
  5. 全国大学生数学建模竞赛
  6. GH7.3 本地化包来了,已无限接近100%了。
  7. Rational Rhapsody 检查模式
  8. 使用Solidworks、ADAMS、Simulink进行机电联合仿真
  9. 基于html5的城市公交查询系统,基于WEB的智能公交查询系统的研究与设计
  10. 电脑上做的ppt拿到别的电脑或手机上播放的时候字体错位的解决方法