我的dockerd
服务不再工作,并且失败了,因为它无法初始化overlay2
存储驱动程序。我有一个使用 格式化的主分区,其中ext4
启用了该选项。一开始我并不清楚 的casefold
参与。casefold
为什么会发生这种情况?我怎样才能使我的 docker 设置再次工作?
我最初在尝试使用时注意到了这个问题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 现在正在使用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/
单独的分区。
我使用的解决方法如下:
- 为您的docker数据创建一个大型稀疏文件。
- 用它格式化
ext4
并确保它casefold
已被禁用。 - 通过您的 将其作为循环设备装载
/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/
它当前使用了多少,以了解您需要多少。