在启用了大小写折叠的 ext4 上使用 overlayfs 吗?

在启用了大小写折叠的 ext4 上使用 overlayfs 吗?

我的dockerd服务不再工作,并且失败了,因为它无法初始化overlay2存储驱动程序。我有一个使用 格式化的主分区,其中ext4启用了该选项。一开始我并不清楚 的casefold参与。casefold

为什么会发生这种情况?我怎样才能使我的 docker 设置再次工作?


我最初在尝试使用时注意到了这个问题dockerdockerd日志显示以下内容:

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 现在正在使用vfs而不是overlay2作为存储驱动程序。dmesg每次重新启动时也会记录类似上述的错误dockerd

我可以就此打住,但我既不想忍受vfs存储驱动程序的缺点,也不想丢失之前为使用而存储的 docker 数据overlay2。所以我深入挖掘了...


我发现有关 overlayfs 的内核文档并尝试了以下示例:

mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,workdir=/work /merged

正如预期的那样,它失败并显示 dmesg 消息:

overlayfs: filesystem on '/upper' not supported

回想我最近在系统设置上所做的更改,只有两件事浮现在我的脑海中:更新和启用casefold。启用casefold是更可能(且易于验证)的选项,因此我编写了这个简单的脚本:

# create sparse file to create test filesystem (4 GiB)
dd if=/dev/zero of=/tmp/image bs=1 count=1 seek=4294967295
# format with ext4, enabling casefold
mkfs.ext4 -O casefold /tmp/image
# mount image filesystem with loop device
mount -o loop /tmp/image /mnt
# create overlayfs directory structure in mounted test-filesystem
mkdir /mnt/lower /mnt/upper /mnt/work /mnt/merged
# mount overlay fs
mount -t overlay overlay -olowerdir=/mnt/lower,upperdir=/mnt/upper,workdir=/mnt/work /mnt/merged
# clean up
umount /mnt/merged /tmp/image
rm /tmp/image

正如我所料,当使用 运行时它会失败,而当省略-O casefold时它会正常工作。-O casefold

答案1

这是由 2022-09-10 提交的 Linux 内核错误引起的:Overlay:文件系统不支持 ext4 和 casefold

ext4因此,目前尚不支持在with上使用 overlayfs casefold。您可能希望移动所有需要的数据casefold,或者将数据移至/var/lib/docker/单独的分区。


我使用的解决方法如下:

  1. 为您的docker数据创建一个大型稀疏文件。
  2. 用它格式化ext4并确保它casefold已被禁用。
  3. 通过您的 将其作为循环设备装载/etc/fstab

我用来设置的命令如下:

# stop the dockerd if it is running
systemctl stop docker.service
# create 256 GiB sparse file for docker data
dd if=/dev/zero of=/var/lib/docker.fs bs=1 count=1 seek=274877906943
# make sure only root can read it
chmod 600 /var/lib/docker.fs
# format it with ext4
mkfs.ext4 /var/lib/docker.fs
# move your docker data out of the way
mv /var/lib/docker /var/lib/docker.backup
# create the new docker directory
mkdir /var/lib/docker
chmod 810 /var/lib/docker
# create the fstab entry
echo '/var/lib/docker.fs /var/lib/docker auto loop 0 0' >>/etc/fstab
# reaload systemd (if you are using systemd)
systemctl daemon-reload
# mount it if it didn't already get auto-mounted by systemd
mount /var/lib/docker
# move all docker data to the new filesystem
mv /var/lib/docker.backup/* /var/lib/docker/
rmdir /var/lib/docker.backup
# start the dockerd
systemctl start docker.service

确保选择的图像大小适合您的 docker 设置和硬盘大小。您可以检查du -hs /var/lib/docker/它当前使用了多少,以了解您需要多少。

相关内容