1.现象
容器停掉过一段时间之后再启动报了mountpoint for devices not found错误
2.思路
根据报错可以看出跟cgroup有一定的关系,所以从cgroup下手,docker一般用的是/sys/fs/cgroup,查看一下cgroup是否正不正常
cgroup子系统的介绍:
CPU:使用调度程序为cgroup任务提供 CPU 的访问。
cpuacct:产生cgroup任务的 CPU 资源报告。
cpuset:如果是多核心的CPU,这个子系统会为cgroup任务分配单的CPU和内存。
devices:允许或拒绝cgroup任务对设备的访问。
freezer:暂停和恢复cgroup任务。
memory:设置每个cgroup 的内存限制以及产生内存资源报告。
net_cls:标记每个网络包以供 cgroup方便使用。
ns:命名空间子系统。
perf event:增加了对每个group的监测跟踪的能力,可以监测属于某个特定的group 的所有线程以及运行在特定CPU上的线程。
参考:https://blog.csdn.net/qyf158236/article/details/110475457
根据对cgroup的了解然后对比以下正常/sys/fs/cgroup和不正常的/sys/fs/cgroup发现有些子系统缺失
然后用mount -t cgroup查看了子系统的挂在状态,看到了只有三个子系统挂载了,所以问题就明确了cgroup子系统没有挂载的原因,至于为什么没有挂载没找到原因
3.解决
明确问题后,手动挂载子系统
挂载脚本:https://github.com/tianon/cgroupfs-mount/blob/master/cgroupfs-mount
cd /sys/fs/cgroup
for sys in $(awk ‘!/^#/ { if ($4 == 1) print $1 }’ /proc/cgroups); do
mkdir -p $sys
if ! mountpoint -q $sys; then
if ! mount -n -t cgroup -o $sys cgroup $sys; then
rmdir $sys || true
fi
fi
done
子系统挂载好了之后再启动容器就OK了