开启casefold的ext4分区下Docker overlay2存储驱动失效的原因及恢复方案求助
最近我的dockerd服务突然罢工了,启动失败的核心原因是没法初始化overlay2存储驱动。我的主分区是ext4格式,而且之前开启了casefold选项,一开始我完全没把这个选项和当前的问题联系起来。
想请教大家:为什么会出现这种情况?我该怎么操作才能让Docker恢复正常,同时保留之前用overlay2存储的所有数据?
问题现象
最开始是用Docker的时候发现异常,查看dockerd日志,看到以下报错:
level=error msg="failed to mount overlay: invalid argument" storage-driver=overlay2
level=error msg="[graphdriver] prior storage driver overlay2 failed: driver not supported"
failed to start daemon: error initializing graphdriver: driver not supported
同时dmesg里也有对应的日志:
overlayfs: filesystem on '/var/lib/docker/overlay2/check-overlayfs-support560506528/upper' not supported
初步尝试的结果
一开始我试着删除/移动/var/lib/docker文件夹,看起来问题暂时解决了,但代价是丢失了所有Docker数据。而且后续我发现dockerd日志里还有其他异常:
level=error msg="failed to mount overlay: invalid argument" storage-driver=overlay2
level=error msg="exec: "fuse-overlayfs": executable file not found in $PATH" storage-driver=fuse-overlayfs
level=info msg="Loading containers: start."
level=info msg="Loading containers: done."
level=info msg="Docker daemon" commit=a61e2b4c9c graphdriver=vfs version=24.0.5
显然Docker自动 fallback 到了vfs存储驱动,但vfs的性能和空间利用率都很差,我不想一直用它,更不想丢失之前的Docker数据,所以我继续深入排查。
排查过程
我查阅了内核关于overlayfs的文档,尝试了文档里的示例挂载命令:
mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,workdir=/work /merged
不出所料,这个命令也失败了,dmesg里的报错和之前一致。
回想最近系统的改动,只有系统更新和开启casefold这两项,显然casefold是更可能的原因,于是我写了一个简单的测试脚本验证:
# 创建4GiB的稀疏文件作为测试文件系统 dd if=/dev/zero of=/tmp/image bs=1 count=1 seek=4294967295 # 格式化ext4并开启casefold mkfs.ext4 -O casefold /tmp/image # 用loop设备挂载测试文件系统 mount -o loop /tmp/image /mnt # 在挂载的文件系统里创建overlayfs所需的目录结构 mkdir /mnt/lower /mnt/upper /mnt/work /mnt/merged # 尝试挂载overlayfs mount -t overlay overlay -olowerdir=/mnt/lower,upperdir=/mnt/upper,workdir=/mnt/work /mnt/merged # 清理资源 umount /mnt/merged /tmp/image rm /tmp/image
结果正如我所料:当格式化时加上-O casefold选项,挂载overlayfs就会失败;去掉这个选项后,挂载就能正常完成。这确认了问题确实是ext4的casefold选项导致的。
现在我想知道,为什么开启casefold的ext4分区无法支持overlay2?有没有办法在不关闭casefold、不丢失数据的前提下让Docker重新使用overlay2?
备注:内容来源于stack exchange,提问作者seyfahni




