在Windows
中使用WSL
的CentOS
时,使用systemctl
命令报错:
System has not been booted with systemd as init system (PID 1). Can’t operate.
[root@GC Administrator]# systemctl start docker
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
这是因为这个CentOS
系统并没有使用systemd
,可能使用的是SysV init(sysvinit)
初始化系统。
可以通过如下命令查看:
[root@GC Administrator]# ps -p 1
PID TTY TIME CMD
1 ? 00:00:00 init(CentOS8)
其中 CMD
列,显示 init
,可以确定使用的是SysV init
初始化系统。
什么是Systemd?
Systemd
是Linux
系统的一套基本构建模块。它提供了一个系统和服务管理器,作为PID 1
运行并启动系统的其余部分。
systemctl
作为systemd
的一个工具,提供与Linux机器上的服务交互
如何解决这个问题,网上有一堆方案(有些过时了,有些是直接放弃使用systemctl
,改用别的命令替代,好不好使我没试,下面给出我的解决方案,当然也是来源网上的)
先决条件:
确保运行的是来自 Microsoft Store
且版本号为0.67.6
及以上版本的WSL
可以通过wsl --version
命令来查看版本
C:\Users\Administrator>wsl --version
命令行选项无效: --version
如上,提示--version
命令行选项无效。则说明你使用的wsl
版本号过低,或者你的wsl
使用不是来自Microsoft Store
,而是Windows
内置的wsl
你需要通过wsl --update
,将wsl
升级到Microsoft Store
的最新版本。
C:\Users\Administrator>wsl --update
正在安装: 适用于 Linux 的 Windows 子系统
已安装 适用于 Linux 的 Windows 子系统。
如果你还没有安装任何wsl,你可以使用
wsl --install
命令进行安装,当然wsl
的安装对操作系统有要求,详见官网:安装 WSL
WSL
升级完成后,就可以使用--version
参数了
C:\Users\Administrator>wsl --version
WSL 版本: 1.2.5.0
内核版本: 5.15.90.1
WSLg 版本: 1.0.51
MSRDC 版本: 1.2.3770
Direct3D 版本: 1.608.2-61064218
DXCore 版本: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows 版本: 10.0.19045.3208
在CentOS实例中,添加/etc/wsl.conf
文件,并编辑内容如下:
C:\Users\Administrator>wsl -d CentOS8
[root@GC Administrator]# vi /etc/wsl.conf
[root@GC Administrator]# cat /etc/wsl.conf
[boot]
systemd=true
然后使用wsl --shutdown
命令,将运行中的Linux发行版关闭。
重新运行CentOS。
再次查看初始化信息,可以看出已经使用了systemd
,
并且systemctl
命令已可正常使用
C:\Users\Administrator>wsl --shutdown
C:\Users\Administrator>wsl -d CentOS8
[root@GC Administrator]# ps -p 1
PID TTY TIME CMD
1 ? 00:00:00 systemd
[root@GC Administrator]# systemctl start docker
[root@GC Administrator]# docker --version
Docker version 24.0.5, build ced0996
参考资料:
Systemd support is now available in WSL!
https://github.com/microsoft/WSL/releases