Mac M1使用Docker报错 Failed to get D-Bus connection: No such file or directory的解决方案

news2025/1/21 0:57:25

0x00 前言

最近在Mac上安装docker的CentOS7镜像,打算开个sshd服务,使用命令:

$ systemctl start sshd

结果在启动sshd服务的时候提示报错:

Failed to get D-Bus connection: No such file or directory

0x01 运行环境

版本
MacOS 版本Monterey 12.0.1
芯片M1
Docker Desktop 版本4.15.0

0x02 问题分析

D-Bus是一种与socket类似的高效、易用的进程间通信方式.
D-Bus分为两种:system bus(系统总线),用于系统(Linux)与用户程序之间进行通信和消息的传递;session bus(会话总线),用于用户程序之间进行通信.

因为systemctl与systemd通信使用的是D-Bus,所以D-Bus报错意味着要么client有问题,要么systemd有问题。这里确认是systemd出了问题,容器中的systemd进程没有启动。

systemctl是什么?

That’s because “systemctl” talks to the systemd daemon by using the d-bus. In a container there is no systemd-daemon. Asking for a start will probably not quite do what you expect - the dev-mapping need to be a bit longer.

systemd是与cgroup融合,进行系统资源管理的程序。这里cgroup如果出现问题,就会导致systemd出现问题。

docker desktop在 4.3.0的版本release-notes【传动门】中提到:

Docker Desktop now uses cgroupv2. If you need to run systemd in a container then:
Ensure your version of systemd supports cgroupv2. It must be at least systemd 247. Consider upgrading any centos:7 images to centos:8.
Containers running systemd need the following options: --privileged --cgroupns=host -v /sys/fs/cgroup:/sys/fs/cgroup:rw.

大义是:
Docker Desktop软件从4.3.0版本开始使用cgroups v2。如果你想在容器中运行systemd:
方法1: 确保你的systemd版本支持cgroups v2,systemd最低版本为247。可以考虑直接升级centos7到centos8.
方法2: 使用如下参数在容器中运行systemd:--privileged --cgroupns=host -v /sys/fs/cgroup:/sys/fs/cgroup:rw

这里再收下cgroup是什么?

Cgroups 是 control groups 的缩写,是 Linux 内核提供的一种可以限制,记录,隔离进程组(process groups)所使用物理资源的机制。最初有 google 工程师提出,后来被整合进 Linux 的内核。因此,Cgroups 为容器实现虚拟化提供了基本保证,是构建 Docker,LXC 等一系列虚拟化管理工具的基石。

docker容器是linux基于命名空间将cpu,内存,网络等系统资源实现文件系统和进程隔离实现的。

如何对多个容器的资源使用进行限制就成了解决进程虚拟资源隔离之后的主要问题,而 Control Groups(简称 CGroups)就是能够隔离宿主机器上的物理资源,例如 CPU、内存、磁盘 I/O 和网络带宽。

Linux 的 CGroup 能够为一组进程分配资源,也就是我们在上面提到的 CPU、内存、网络带宽等资源,通过对资源的分配,CGroup 能够提供以下的几种功能:
在这里插入图片描述
在cgroups v1版本中,/sys/fs/cgroups目录下定义了cpu,memory,device等资源,新建一个cgroup分组,就是在这些资源下创建分组目录。比如docker创建一个新的容器,在cpu目录下就会出现docker文件夹,docker文件夹下有5ada8be1dadb9d66f565a1d58b214df37c630c80022e5d141282d17ab8248e97的目录,其中5ada8xxxx就是容器的hash。

sh-4.2# ls /sys/fs/cgroup/
blkio  cpu  cpu,cpuacct  cpuacct  cpuset  devices  freezer  hugetlb  memory  net_cls  net_cls,net_prio  net_prio  perf_event  pids  rdma  systemd

在这里插入图片描述
cgroup v1版本权限过大,隔离策略混乱会导致一些安全性问题,所以才有了cgroup v2版本,可以容docker在非root权限下运行docker daemon,减少了docker容器权限过大,导致逃逸等安全问题。
所以在docker desktop 4.3.0版本使用了cgroup v2,而centos7默认systemd是216版本,这俩东西不兼容,导致systemctl无法正常使用。

老外在https://github.com/docker/for-mac/issues/6073 中提出了这个问题,开始以为是mac的问题,后来发现在ubuntu20.10中也有这个问题。于是大家开始找解决方法。
这里的解决方法在刚才已经提到,就是升级systemd版本,或者使用映射把容器的cgroup放出来给docker desktop用。

当然,后来鉴于centos7属于主流操作系统,用的人太多了,维护者在settings.json中加入了对cgroup v1的兼容。改一个配置就能解决此问题,不用映射/sys/fs/cgroup也不用升级systemd了。

在docker desktop 4.4.2版本的公告中可以看到解决方法:

Added a deprecated option to settings.json: “deprecatedCgroupv1”: true, which switches the Linux environment back to cgroups v1. If your software requires cgroups v1, you should update it to be compatible with cgroups v2. Although cgroups v1 should continue to work, it is likely that some future features will depend on cgroups v2. It is also possible that some Linux kernel bugs will only be fixed with cgroups v2.

0x03 解决方案

具体操作如下:
编辑~/Library/Group\ Containers/group.com.docker/settings.json修改"legacyCgroupv1"参数为true,默认是false

legacyCgroupv1: true,

0x04 参考文献

https://github.com/docker/for-mac/issues/6073
https://github.com/scylladb/scylladb/issues/7071
https://bugzilla.redhat.com/show_bug.cgi?id=1760645
https://www.leyeah.com/article/cgroups-dockerprinciple-677345
https://www.cnblogs.com/sparkdev/p/9523194.html
https://ehds.github.io/2021/01/21/docker_systemctl/
https://www.infoq.cn/article/fuoi4c3l0npztxarhjnn
https://zorrozou.github.io/docs/%E8%AF%A6%E8%A7%A3Cgroup%20V2.html
https://zhuanlan.zhihu.com/p/143253843

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Qt开发》基于QwtPolar的极坐标图绘制

QwtPolar绘制极坐标图 该示例包含以下功能: 使用QwtPolarPlot绘制极坐标曲线实现曲线的缩放和平移调整极坐标为顺时针顺序1. 创建项目 创建项目名称为QwtPolarDemo1,并添加一个Qt5Class类,命名为myPlot。 2. 配置项目 在项目——属性——C/C——常规…

【C++】——初识C++(一)

文章目录1. 进入C1.1 main()函数1.2 C注释1.3 C预处理器和iostream文件1.4 头文件名1.5 名称空间1.6 使用cout进行C输出1.6.1 控制符endl1.6.2 换行符1.6.3 使用cout进行拼接1.7 cin1.8 变量1.8.1 变量名1.9 常量1.10 关键字1. 进入C 第一个程序 // my…

构建数据大屏,塑造IT运维可视化核心竞争力

随着大数据、云计算等新兴技术的发展与运用,在金融、交通、教育、政府等行业的信息化在飞速发展。与此同时,各行业的IT建设与维护管理成本也在与日俱增,大量的运维工作下产生庞大的运维数据,如何进行运维数据可视化建设也逐渐成为…

qt之smtp-demo封装与测试

简介 SMTP是一种提供可靠且有效的电子邮件传输的协议,它建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。 SMTP的工作过程是建立连接、邮件传送、连接释放。 SMTP的默认端口是25。…

游戏思考26:使用EASTL配合共享内存做自定义STL(未完待续12/27)

文章目录一、前置学习1&#xff09;萃取&#xff08;1&#xff09;迭代器所指对象的类型-value_type<1>第一个限制-返回参数需要指明迭代器的value_type<2>第二个限制坑点-不是所有迭代器都是class type&#xff0c;原生指针就不是<3>第三个限制坑点-如果针对…

2022-12版本的Rstudio它来了,它喊我升级了

1. Rstudio喊我升级 最近每一次打开Rstudio&#xff0c;总是推送给我最新版的Rstudio&#xff1a; 它之前不是这样的&#xff0c;那时候它所在的公司还叫Rstudio&#xff0c;现在改名叫Posit了&#xff0c;就开始推送了&#xff0c;也许它认为是重大的更新&#xff0c;也许他能…

【vue面试题-vuex】

vuex1.vuex是什么&#xff1f;怎么使用&#xff1f;哪种功能场景使用它&#xff1f;2.vuex有哪几种属性&#xff1f;3.Vue.js中ajax请求代码应该写在组件的methods中还是vuex的actions中&#xff1f;4.Vuex解决了什么问题&#xff1f;5.Vuex中状态储存在哪里&#xff0c;怎么改…

【LeetCode】1739. 放置盒子

1739. 放置盒子 题目描述 有一个立方体房间&#xff0c;其长度、宽度和高度都等于 n 个单位。请你在房间里放置 n 个盒子&#xff0c;每个盒子都是一个单位边长的立方体。放置规则如下&#xff1a; 你可以把盒子放在地板上的任何地方。 如果盒子 x 需要放置在盒子 y 的顶部&…

【webpack】cjs运行时分析

准备工作&#xff08;接上篇文章的示例也可以&#xff09;&#xff1a; 1. 在index.js文件中引入任一js文件 import sum from ./sum;const result sum(1,2); console.log(result);2. sum文件 const sum (a, b) > {return ab; }export default sum3. build.js文件 const…

离子交换法深度剖析

离子交换法 是一种借助于离子交换剂上的离子和污水中的离子进行交换反应而除去污水中有害离子的方法。 离子交换法的特点 离子交换过程是一种特殊的吸附过程&#xff0c;在许多方面与吸附过程类似。 与吸附法比较&#xff0c;其特点是:它主要吸附污水中的离子化物质&#xff…

怎样做一个不会被淘汰的车载诊断工程师

步入中年&#xff0c;不可避免会接触到所谓的中年危机&#xff0c;时刻在提醒自己提高自己的护城河&#xff0c;增强核心竞争力。但是这种事情也不是靠空想&#xff0c;还是要功夫下在平时。 自己是在2016年开始接触车载诊断方面&#xff0c;从事过诊断范畴的开发、测试、偏系…

程序员的圣诞节是怎么样的?

2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ 一、前言 圣诞节&#xff0c;先在这里祝大家圣诞节快乐~~&#xff0c;用英语来表达就是 Merry Christmas ~~&#xff0c; 为了贴合这个氛围&#xff0c;今天分享种用 Python 绘制圣诞树的方法。 最近用代码绘画圣诞…

非常易用的网络路径中的网络延迟测试和监控以及自动发送报告工具

非常易用的网络路径中的网络延迟测试和监控以及自动发送报告工具。 作为网络管理员或网络工程师&#xff0c;时刻关注网络的交付速度至关重要。不仅需要确保自己有良好的响应时间&#xff0c;还需要确保网络的速度足以满足用户通信所需的每一条路径。而手动测试每个路径将占用…

SpringBoot+Vue项目医院体检中心管理系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

电脑文件数据恢复方法是什么?未备份电脑文件数据恢复的七种方法

在日常生活中&#xff0c;我们总会遇到这样或那样的事情&#xff0c;比如在使用电脑过程中出现文件数据丢失情况&#xff0c;那么在未备份文件下电脑文件数据丢失怎么恢复&#xff1f;电脑文件数据恢复方法有哪些&#xff1f;这里将根据不同情况分享不同的电脑文件数据恢复方法…

L05_课后练习_波士顿房价预测

波士顿房价预测 1.导入所需要的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch import random from sklearn.model_selection import train_test_split2.读入数据 feature pd.read_csv("../data/boston.csv") feature…

Postgresql源码(95)优化器关键数据结构实例

1 测试数据 drop table student; create table student(sno int primary key, sname varchar(10), ssex int); insert into student values(1, stu1, 0); insert into student values(2, stu2, 1); insert into student values(3, stu3, 1); insert into student values(4, st…

Linux的环境变量

目录 什么是环境变量&#xff1f; 那么如何添加自己的程序到命令行上&#xff0c;可以直接执行&#xff1f; 如何查看环境变量&#xff1f; 如何定义环境变量&#xff1f; C语言如何获取环境变量&#xff1f; 什么是环境变量&#xff1f; 在回答这个问题之前&#xff0c;可…

【Linux】之systemd与systemctl

文章目录一、systemd1. systemd 守护进程管理 Linux 的启动2. systemd 提供的功能:3. systemd 使用单元来管理不同类型的对象。4. 服务单元信息二、systemctl1. systemctl输出中的服务状态2. 列出servera上安装的所以服务单元3. 列出servera上所有活动和不活动的套接字单元4.1 …

存档鉴未来,新时代电子档案长期保存之道

&#xff08;一&#xff09;电子档案单套制是未来档案管理的趋势 在政府和企业端&#xff0c;办公体系的信息化&#xff0c;电子档案的单套制实施&#xff0c;极大地提高了事务办理的效率&#xff0c;同时节约了大量纸质文件的使用成本。 在政务领域&#xff0c;单套制的推行…