Btrfs 读取校验和损坏的文件

Btrfs 读取校验和损坏的文件

系统崩溃后,当我尝试读取特定文件时收到 I/O 错误。我运行btrfs scrub后发现校验和不匹配影响了此文件。

现在我想测试一下,这个文件至少有一部分是否完好无损。我该如何强制 btrfs 读取该文件?

编辑:我btrfs check --fix-crc按照另一个帖子中的建议尝试了,但它似乎既不理解该fix-crc标志,我也无法在手册页中找到它。也许它已被弃用?

我知道有btrfs check --init-csum-tree,但据我所知,它会完全重新计算所有校验和,这意味着完全重新读取所有硬盘内容。

编辑 2:我能够使用 ddrescue 获取未受影响的文件内容。但是,我还想访问坏扇区的内容(因为 I/O 错误仅由 btrfs 校验和失败生成,据我所知磁盘没有问题)。

dmesg 日志仅显示csum failed root 5 ino 130384 off 260317184 csum 0x8068db14 expected csum 0x240ab6d1 mirror 1。给定的偏移量仅是文件本地的,无法读取。如果我能以某种方式获取受影响的分区块,我可以轻松使用 读取内容dd

答案1

不特定于 Btrfs 的解决方案。

该文件是可查找的,您可以逐个读取它,但在您的情况下,一个或多个部分将变得无法读取。

GNUddrescue可以为您完成所有这些工作。我通常使用它逐扇区读取块设备,但也可以将其用于常规文件。

ddrescue /path/to/affected/file /where/to/save/copy mapfile

在我的 Kubuntu 中,ddrescue默认扇区大小为 512 字节 ( -b 512)。由于任何硬件都使用 512 或 4096 字节,而 Btrfs 通常(?) 至少使用 4096 字节,因此默认值应该可以满足使用此方法获取尽可能多的文件的需求。

相关内容