如何在出现 EXT4-fs 错误后删除文件:发现目录漏洞

如何在出现 EXT4-fs 错误后删除文件:发现目录漏洞

我有一个特定目录,无法删除其中的文件或目录。该目录位于 ext4 文件系统上,在 QNAP NAS 上使用 3 个磁盘上的 RAID5。

使用rm -f给我:

rm: unable to stat `file.jpg': Input/output error

并且还在 dmesg 上显示以下内容:

EXT4-fs error (device dm-0): dx_probe:933: inode #55050534: block 3591: comm rm: Directory hole found

由于“输入/输出错误”通常意味着硬件,我已经运行了几个测试,例如我认为是 QNAP 版本的fsck、,badblocks以及对各个磁盘的 SMART 快速和长时间测试,再加上定期运行的 raid 清理 - 并且所有测试都返回说没有错误。

该文件夹包含大量文件,因为它是每天/每小时添加的数千个文件的黑洞(无法将它们计算在内,因为ls | wc受到“输入/输出错误”和“发现目录漏洞”错误的影响) - 因此基于类似黑洞帖子)我假设我破坏了目录而不是硬件。

不幸的是,QNAP 上的 find 版本不支持该-exec参数,所以我无法尝试该帖子中的建议。

问题是:

  1. 什么是“目录洞”?
  2. 如何删除目录洞内的目录和文件。

答案1

目录洞实际上是自 2013 年以来 ext4 的一项功能,但直到 2019 年底 Linux 内核才修复以支持它。然而,目录洞只能在运行 fsck 后形成,因此它可能是间接由迫使您运行 fsck 的数据错误引起的。

以下 fsck 选项应删除所有目录漏洞:

fsck.ext4 -Df dm-0

确保在未挂载的文件系统上运行(也可以在只读的挂载文件系统上运行,但在 fsck 运行时读取文件的任何人都会得到垃圾,这存在一定风险)。

请注意,这将至少花费与完整 fsck (例如fsck.ext4 -f dm-0) 一样长的时间,并且在此期间文件系统将不可用。

答案2

在此目录中运行以下命令。它基本上是 -exec rm {} 的替代品。它将在目录中构建文件列表并构造多个 rm 命令,一次运行的参数限制设置为 10

find ./ -type f|xargs -n 10 rm

如果您希望删除此目录下的所有文件,上述操作将删除它们。我可能会先尝试将文件复制到其他目录以挽救它们。

相关内容