解决WSL执行systemctl命令报错:Failed to get D-Bus connection

  • 解决WSL执行systemctl命令报错:Failed to get D-Bus connection已关闭评论
  • 158 次浏览
  • A+
所属分类:linux技术
摘要

笔者通过WSL安装了CentOS7系统,刚开始一切都很顺利。当执行systemctl命令时,却意外报错:Failed to get D-Bus connection: Operation not permitted ,让小白的我不知所措。经过一番折腾,笔者终于找到了正确的解决办法——原来它和systemd有关。


问题描述

笔者通过WSL安装了CentOS7系统,刚开始一切都很顺利。当执行systemctl命令时,却意外报错:Failed to get D-Bus connection: Operation not permitted,让小白的我不知所措。经过一番折腾,笔者终于找到了正确的解决办法——原来它和systemd有关。

解决WSL执行systemctl命令报错:Failed to get D-Bus connection

问题原因

我们先来了解下systemd是什么东东?它并不是一个命令,而是一组命令,涉及到系统管理的各个方面。根据Linux惯例,字母d是守护进程 (daemon) 的缩写,systemd这个名字的含义就是要守护整个系统。initsystemd都是Linux的守护进程,  但后者功能更强大,已取代init (initd的PID是0) 成为Linux系统的第一个进程 (systemd的PID是1)。下面是systemd的架构图:

解决WSL执行systemctl命令报错:Failed to get D-Bus connection

systemctlsystemd的主命令,用于管理系统。除此之外,还有hostnamectl(查看当前主机信息)、timedatectl(查看当前时区设置)、loginctl(查看当前登录的用户)等命令。

为什么CentOS在WSL里会出现上述错误呢?想必你也猜到一半了,没错,就是systemd没有启用引起的(WSL2现已支持)。Ubuntu发行版默认安装已启用systemd,而其它Linux发行版上默认还是init,需要手动启用才行。可以通过以下命令来查看:

#  ps --no-headers -o comm 1
init(CentOS7)

解决办法

根据微软文档介绍,启用systemd必须满足以下条件:

1. 确保 WSL 版本为 0.67.6 或更高版本。   2. 添加 /etc/wsl.conf 配置文件,设置systemd为true。

我们先执行命令: wsl --version,检测下当前WSL的版本,显示结果如下:

解决WSL执行systemctl命令报错:Failed to get D-Bus connection

若非上述结果,说明你的WSL版本过低,需要执行WSL更新命令:  wsl --update

解决WSL执行systemctl命令报错:Failed to get D-Bus connection

更新完之后,然后给CentOS添加wsl.conf配置文件(设置systemd为启用),可通过下面命令来完成:

#  echo -e "[boot]nsystemd=true" | sudo tee -a /etc/wsl.conf

解决WSL执行systemctl命令报错:Failed to get D-Bus connection

至此,systemd已经启用。

重新进入WSL,我们再执行systemctl命令看下,这回不再报错!

解决WSL执行systemctl命令报错:Failed to get D-Bus connection


参考资料:

使用 systemd 通过 WSL 管理 Linux 服务 | Microsoft Learn

Systemd 入门教程:命令篇 - 阮一峰的网络日志 (ruanyifeng.com)