查找具有 BTRFS 无法纠正错误的文件

查找具有 BTRFS 无法纠正错误的文件

我有一个关于 BTRFS 文件系统上不可恢复错误的问题。具体来说,我最近在遇到一个 RAM 棒问题后运行了 BTRFS Scrub,它似乎发现了 4 个不可纠正的错误。这是输出:

scrub status for <UUID>
    scrub started at Thu Dec 25 15:19:22 2014 and was aborted after 89882 seconds
    total bytes scrubbed: 1.87TiB with 4 errors
    error details: csum=4
    corrected errors: 0, uncorrectable errors: 4, unverified errors: 0

幸运的是,我已将所有内容备份在第三级备份中,因此我并不特别担心丢失文件(我很清楚与 BTRFS 的实验状态相关的问题,我有多个备份来保证我的数据安全,并决心继续使用它,所以请不要:“解决方案;不要使用 BTRFS”的帖子)。

但我想知道如何确定哪些文件与无法纠正的错误有关?我想找到它们,删除它们,并用它们的备份副本替换它们。

如果有人有关于如何做到这一点的信息,我很乐意听听您的意见。

先感谢您。

答案1

我发现以下方法很有用...

btrfs scrub音量。

您将看到如上所示的任意数量的 csum 错误。
使用您的示例错误详细信息:csum=4. 使用该号码尾巴指令如下:

dmesg | grep "checksum error at" | tail -4 | cut -d\  -f24- | sed 's/.$//'

将其通过管道传输到文件非常方便(例如> csums.txt

我尝试了许多建议的 inode 搜索方法,但它们的成功率都很有限。

答案2

是的,从 INODE 或块号映射回文件名可能很困难。如果您真的感兴趣,您可以尝试类似这样的方法,看看要复制哪些文件...毕竟,如果文件不好,复制过程中应该会抛出错误。我以前用过这种技术。

 find /mount-point -type f -exec cp {} /dev/null \;

 where mount-point is the ROOT node/mount-point of the affected filesystem

答案3

dmesg将向您提供有关无法纠正的校验和错误所涉及的文件的详细信息。消息通常如下所示:“BTRFS:设备 [...]、扇区 [...]、根 [...]、inode [...]、偏移 [...]、长度 [...]、链接 [...] 上的逻辑 [...] 发生校验和错误(路径: [...])”;最后一条信息是损坏文件的绝对路径。

答案4

我还发现这个线程试图找出在发现 BTRFS 校验和错误后下一步该做什么。

列出的答案dmesg对我来说不起作用;我scrub花了很长时间,而且到那时可见的最旧消息sudo dmesg已经太新了。

一个解决方案可能是利用该-W, --follow-new标志来dmesg执行如下命令磨砂膏:

$ sudo dmesg --follow-new | grep --line-buffered "checksum error at" >> checksum_errors.txt

然后对其输出进行一些后期处理。

但是,我发现使用journalctl's -k, --dmesg--grepflags 进行搜索就足够了,并且回溯得足够远以找到我遇到的所有错误。我)使用下面的命令仅打印出偏移量和文件名(并忽略尾随的 );就我而言,这个文件中有多个错误。

$ sudo journalctl --dmesg --grep 'checksum error' | awk '{ print $25, $31 }' | sort -u

从那里,我运行sha256sum了坏文件,确认它导致了错误,并确认我有该文件的备份。

相关内容