1. 项目场景
HOST OS:Kylin Server 10 SP1
DOCKER: docker-ce-18.09.7
2. 问题描述及原因分析
机器异常断电,磁盘分区损坏,经过磁盘修复后,docker服务本身启动不了。
systemctl restart docker及 systemctl status docker日志如下:
从上获取不到任何信息,手动dockerd启动服务输出如下:
从以上图片获取到kernel does not support cgroup blkio weight/weight_device的警告,通过查阅资源,发现该警告对此次问题无影响,主要问题为panic: invalid page: 13:10这一行,这一问题是关键,初步判断是docker overlay2的文件系统损坏。
通过df -hl及mount查看,如下:
/var/lib/docker是由单独的一块分区来存储,卸载,对磁盘进行e2fsck修复操作,然后再次dockerd执行,依然报panic: invalid page: 13:10。
尝试将/var/lib/docker/里面的文件移走到其他目录,docker服务可以正常启动。将其移回来,还是启动问题,确认docker本身没有问题,但docker overlay2文件系统遭到了损坏,需要做处理。
- 停止Docker and containerd:
systemctl stop docker containerd
- 清除containerd数据目录(如果需要,Docker会在启动时重新生成):
rm -rf /var/lib/containerd/
- 找到Docker的数据库文件,通常是local-kv.db:
find /var/lib/docker -type f -size -5M -name '*.db' | grep -v overlay2
- 将这些文件重命名为.bak:
mv /var/lib/docker/network/files/local-kv.db{,.bak}
- 启动docker服务
systemctl start docker
如下:
3. 解决方案
- 停止Docker and containerd:
systemctl stop docker containerd
- 清除containerd数据目录(如果需要,Docker会在启动时重新生成):
rm -rf /var/lib/containerd/
- 找到Docker的数据库文件,通常是local-kv.db:
find /var/lib/docker -type f -size -5M -name '*.db' | grep -v overlay2
- 将这些文件重命名为.bak:
mv /var/lib/docker/network/files/local-kv.db{,.bak}
- 启动docker服务
systemctl start docker
如下:
4. 参考方案
https://zhangguanzhang.github.io/2020/01/08/docker-panic-invalid-page-type/#
https://github.com/containerd/containerd/issues/3347
https://github.com/moby/moby/issues/37238
https://copyfuture.com/blogs-details/20210419151120930u