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


17

我有一个关于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”帖子)。

但是,我想知道如何确定与不可纠正错误相关的文件?我想找到它们,删除它们,并用其备份副本替换它们。

如果有人知道如何执行此操作,我希望收到您的来信。

先感谢您。

Answers:


8

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

btrfs scrub 音量。

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

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

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

我尝试了许多建议的inode搜索方法,但都取得了有限的成功。


据我了解,您正在使用tail来限制显示的行数并忽略重复项。我建议使用sort | uniq来消除类似的重复项:dmesg | grep "checksum error at" | cut -d\ -f24- | sed 's/.$//' | sort | uniq
niklasfi '18

3

是的,从INODE或块号映射回文件名可能很困难。如果您真的有兴趣,可以尝试类似的操作,然后查看要复制的文件...毕竟,如果文件损坏,则在复制过程中会引发错误。我以前使用过这种技术。

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

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

现在运行它,希望它将有所帮助。谢谢您的建议,我将向您报告结果。
RedHack 2014年

1
抱歉地说,它似乎不起作用= /它找到了导致不可纠正错误的第一个文件,但随后向终端发送了以下消息:“过时的文件句柄”,除非我终止了它。授予它找到文件的权限,但现在我不知道该如何删除它。必须联系BTRFS邮件列表。
RedHack 2014年

您可以将其移至特殊目录,然后从进一步的搜索中将其排除。
mdpc

1
它不会移动或复制,只是一直告诉我文件句柄是陈旧的。我什至不能。
RedHack 2014年

如果您使用cp -v,还可以监视进度:find / -type f -exec cp -v {} /dev/null \; 2> corrupted-files.txt。但是,/proc/kcore文件可能很大(我的容量为128TB),因此复制操作可能会挂起。由于/proc目录包含特殊的魔法文件,因此我们不需要检查它们。排除/proc目录:sudo find / -type f -and -not -path /proc -exec cp -v {} /dev/null \; 2> corrupted-files.txt
ceremcem

2

dmesg将为您提供有关不可纠正的校验和错误所涉及文件的详细信息。消息通常看起来像这样:“ BTRFS:开发逻辑上的校验和错误,扇区[...],根[...],inode [...],偏移[ ...],长度[...],链接[...](路径:[...])“;最后一条信息是已损坏文件的绝对路径。


1

我也是来这里从BTRFS寻找“无法纠正的错误”的。上面的grep对我不起作用;我不得不使用代替:

$ dmesg | sed -n -r 's#.*BTRFS.*i/o error.*path: (.*)\)#\1#p' | sort -u
somepath/somefile.txt

请注意,路径是相对于子体积开始的-并不表示它在哪个子体积中。幸运的是,这对我来说不是问题。


什么somepath/somefile.txt啊 看起来您是将其作为单独的命令键入-还是输入的命令的输出?如果都应该是一个命令行,请不要为了显示目的而将命令行分开-只需将它作为一条长行放入答案中即可。但是,那是什么?您是否要提供两个输入sort(管道和文件)?还是somepath/somefile.txt要作为输出文件?(指定输出文件不是很有帮助,除非它们是您再次使用的中间文件。人们知道如何处理结果;例如,通过管道传输。)
Scott

这是否回答了原始问题?我不知道
我说恢复莫妮卡

@TwistyImpersonator好吧,这(IMO)显然是Mark答案的替代选择,得到了八票(是对arrrr答案的扩展)。
斯科特,

1
@Scott第二行是命令的示例输出。
crusaderky
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.