我已经使用 Bedup 对我的 Btrfs 文件系统进行了重复数据删除,所以现在所有重复文件(超过特定大小)都是“reflink”副本。
有什么办法可以看到,给定文件名,还有哪些其他文件是相同的引用链接?
想象一个文件在单个设备 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)
顺便说一句,将数据写入和附加到损坏文件的未损坏块也成功。至少当只有一个损坏的块并且它不是最后一个时。起初它让我感到惊讶,但后来我认为这可能是一个很好的功能,因此必须附加关键数据的应用程序不会停留在损坏的文件上。
问题是如何从损坏的块(或整个损坏的文件)中检索数据?