查找带有 BTRFS 不可纠正错误的文件

Red*_*ack 24 backup filesystems btrfs

我有一个关于 BTRFS 文件系统上不可恢复的错误的问题。具体来说,我最近在我的一个内存条出现问题后运行了 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
Run Code Online (Sandbox Code Playgroud)

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

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

如果有人知道如何执行此操作,我很乐意听取您的意见。

先感谢您。

Mar*_*ark 17

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

btrfs scrub 音量。

如上所示,您将看到任意数量的 csum 错误。
使用您的示例错误详细信息: csum=4。在以下语句的尾部指令中使用该数字:

dmesg | grep "checksum error at" | tail -4 | cut -d\  -f24- | sed 's/.$//'
Run Code Online (Sandbox Code Playgroud)

将其通过管道输出到文件很方便(例如> csums.txt

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

  • 据我了解,您正在使用 tail 来限制显示的行数并忽略重复项。我建议使用`sort | uniq` 来删除重复项,如下所示:`dmesg | grep“校验和错误位于”| 切-d\-f24- | sed 's/.$//' | sed 's/.$//' | 排序| 独特` (4认同)

mdp*_*dpc 5

是的,从 INODE 或块号映射回文件名可能很困难。如果您真的感兴趣,您可以尝试类似的操作并查看要复制哪些文件...毕竟,如果文件损坏,它应该在复制过程中抛出错误。我以前曾使用过这种技术。

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

 where mount-point is the ROOT node/mount-point of the affected filesystem
Run Code Online (Sandbox Code Playgroud)