是否可以在 btrfs 文件系统上显式检索校验和错误的完整文件内容?

Ale*_*dOS 7 data-recovery btrfs checksum

想象一个文件在单个设备 Btrfs 上损坏的情况。在这种情况下,需要文件内容,包括损坏的位。

如安装手册页所述:

nodatasum
              Enable/disable data checksumming for newly created files.
Run Code Online (Sandbox Code Playgroud)

所以它不会在读取文件时禁用校验和检查。

而且我猜所有涉及文件系统读取的标准系统调用都会在这个文件中失败。由于可能存在碎片,因此无法选择原始磁盘读取。

当我尝试cat此类文件时,出现错误:

cat: file: Input/output error
Run Code Online (Sandbox Code Playgroud)

dmesg 报告这样的消息:

[631847.884641] BTRFS warning (device loop0): csum failed ino 257 off 0 csum 1280268577 expected csum 2391276770
Run Code Online (Sandbox Code Playgroud)

有在 发生损坏的信息off 0,所以这是文件的前 4096 字节,确实我能够很容易地检索未损坏的块:

dd if=file bs=4K skip=1
Run Code Online (Sandbox Code Playgroud)

顺便说一句,将数据写入和附加到损坏文件的未损坏块也成功。至少当只有一个损坏的块并且它不是最后一个时。起初它让我感到惊讶,但后来我认为这可能是一个很好的功能,因此必须附加关键数据的应用程序不会停留在损坏的文件上。

问题是如何从损坏的块(或整个损坏的文件)中检索数据?

小智 1

作为最后的手段,你可以尝试

btrfs 检查 --init-csum-tree /tmp/copy_of_the_device.bin

此命令将更改文件系统,结果可能比以前更糟糕,因此仅在文件系统的 dd 或 ddrescue 副本上运行此命令。