Failed to get D-Bus connection: Connection refused 解决方案

Failed to get D-Bus connection: Connection refused 解决方案

前言

centos7中对于服务管理出现了比较大的改动,开始引入systemd来管理我们的服务,并且向下兼容service服务管理方式。那么二者有什么区别呢?

  • 传统服务的启动方式最终都是通过Init进程启动的,由于init进程是串行启动,只有一个进程启动完才可以启动下一个。而systemd是并行启动的,效率很高,启动速度快。
  • 传统服务启动脚本相对新版脚本比较重。也会影响启动速度

systemd管理系统相对于传统模式还有很多的优点,包括日志服务,快照恢复等功能。这里不过多讲解,我会另外写一篇关于systemd服务相关的博客来补充这部分知识点。

前面介绍了一些systemd概念。为什么启动service服务会报告D-bus 问题呢?其实二者联系是很大的,systemd管理服务的启动与关闭主要依靠D-bus 提供的功能,当D_bus出现权限或者进程不存在了,就会导致service 出现问题。

情景:

1.初用docker的新手都会使用centos7镜像来试试玩法,他们往往都会进入容器然后试图在容器用systemctl 来管理服务。但是会提示

Failed to get D-Bus connection: Operation not permitted

原因:

先要从docker 进程模式来说起:docker容器主张把进程运行在前台,一个容器的生命周期是围绕这你这个主进程的,一旦主进程没了。容器也就退出了。nginx默认运行在后台,所以我们会发现当在容器部署nginx时,必须加的参数是nginx -g daemon off 否则nginx 容器 启动后会立即退出。说完了进程模式,我们在说systemd。systemd本身是centos7系统的一个守护进程。属于后台进程。另一方面,根据容器的工作原理可知容器本身就不是一个完整的系统,他是利用宿主机内核虚拟化的,他仅仅是一个文件系统,默认会用普通用户来访问我们的内核,而systemd他是需要特权模式访问内核的,也就是说docker容器默认无权限访问内核。所以如果你执意要用,并不是没有办法。需要开启特权模式。

解决方法:

docker run -d -name centos7 –privileged=true centos:7 /usr/sbin/init
备注:记得带上 /usr/sbin/init  重新init 将配置生效,否则不会成功。如果没有下载service 软件包 ,需要先下载
2.Failed to get D-Bus connection: Connection refused
原因1:D-bus进程不存在,或者进程存在但是出现问题。
解决:结合  日志 分析,如果没异常 kill 掉进程重启该服务。
原因2:如果你是ubuntu或者debain系统。(centos请忽略)可能是包丢失
解决: sudo apt-get install libpam-systemd

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Loading...