系统崩溃后,当我尝试读取特定文件时收到 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 字节,因此默认值应该可以满足使用此方法获取尽可能多的文件的需求。