You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

开启casefold的ext4分区下Docker overlay2存储驱动失效的原因及恢复方案求助

开启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

火山引擎 最新活动