我有一个关于 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
和--grep
flags 进行搜索就足够了,并且回溯得足够远以找到我遇到的所有错误。我)
使用下面的命令仅打印出偏移量和文件名(并忽略尾随的 );就我而言,这个文件中有多个错误。
$ sudo journalctl --dmesg --grep 'checksum error' | awk '{ print $25, $31 }' | sort -u
从那里,我运行sha256sum
了坏文件,确认它导致了错误,并确认我有该文件的备份。