我有一个特定目录,无法删除其中的文件或目录。该目录位于 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
目录洞实际上是自 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
如果您希望删除此目录下的所有文件,上述操作将删除它们。我可能会先尝试将文件复制到其他目录以挽救它们。