为什么说在 Docker 中,使用不支持 d_type 的 XFS 文件系统是错误的

为什么说在 Docker 中,使用不支持 d_type 的 XFS 文件系统是错误的

从docker文档中我们可以看到以下内容https://docs.docker.com/storage/storagedriver/overlayfs-driver/#prerequisites

警告:在不支持 d_type 的 XFS 上运行现在会导致 Docker 跳过使用 overlay 或 overlay2 驱动程序的尝试。现有安装将继续运行,但会产生错误。这是为了让用户迁移他们的数据。在未来版本中,这将是一个致命错误,这将阻止 Docker 启动。

不明白这句话- This is to allow users to migrate their data???

这里真正的问题是什么?(举几个例子会很有用)

答案1

问题是覆盖文件系统中已删除的文件不会显示为已删除

在挂载期间,请确保上层 fs 支持 d_type,否则会出错。

在某些情况下,xfs 已使用 ftype=0 创建,并且如果删除了较低 fs 上的文件,则覆盖会在上述 fs 中留下空白,但该空白不会被过滤掉,并且对覆盖 fs 用户可见。

并且它没有被过滤掉的原因是,上层文件系统在 iterate_dir() 期间没有将 whiteout 的文件类型报告为 DT_CHR。

因此,似乎需要上层文件系统支持 d_type,overlayfs 才能正常工作。在挂载期间进行此检查,如果不支持 d_type,则会失败。

RedHat 有记录要求

请注意,创建 XFS 文件系统时必须启用 -n ftype=1 选项才能用作覆盖。

这可能会产生不良后果,例如破坏删除目录的能力因为目录永远不能被清空。也有人认为破坏图像构建。如果出现任何其他问题,docker 将不会为该配置提供任何支持,因为它已知会导致问题。

来自手册页,该选项的效果如下:

               ftype=value
                      This feature allows the inode type to be stored in
                      the directory structure so that the readdir(3) and
                      getdents(2) do not need to look up the inode to
                      determine the inode type.

                      The value is either 0 or 1, with 1 signifying that
                      filetype information will be stored in the
                      directory structure.  The default value is 1.

相关内容