如何验证文件副本是 reflink/CoW?

Wu *_*eng 10 file-copy btrfs

我在玩 btrfs,它允许cp --reflink写时复制。其他程序,例如lxc-clone,也可能使用此功能。我的问题是,如何判断一个文件是否是另一个文件的 CoW?就像硬链接一样,我可以从 inode 编号看出。

小智 8

好问题。看起来目前没有任何简单的高级方法可以分辨。

一个问题是文件可能仅通过写时复制共享部分数据。这称为物理盘区,部分 全部物理盘区可以在 CoW 文件之间共享。

inode在文件之间进行比较时,没有任何类似的东西会告诉您文件共享相同的物理范围。(编辑:请参阅我的其他答案)。

低级答案是,您可以使用 来询问内核哪些物理盘区用于文件,该文件记录在. 原则上,如果所有物理盘区都相同,则文件必须共享相同的底层存储。FS_IOC_FIEMAP ioctlDocumentation/filesystems/fiemap.txt

很少有东西实现了一种在更高层次上查看这些信息的方法。我在这里找到了一些代码。显然,该filefrag实用程序应该使用 -v 显示范围。此外,btrfs-debug-tree显示此信息。

然而,我会谨慎行事,因为这些东西在野外可能没有什么用处,你可能会发现错误给你错误的答案,所以当心依赖这些数据来决定可能导致数据损坏的操作。

一些相关问题:


小智 5

继我之前的回答之后,我刚刚发布了fienode它计算文件物理范围的 SHA1 哈希值,可用于查找一些(相同的)reflink 副本。不过要注意,有一些注意事项(请参阅文档)。BTRFS 决定更改我在没有挑衅或警告的情况下制作的重新链接副本的部分(但不是全部)物理范围,从而导致值发生变化。


小智 5

最简单的解决方案是使用btrfs filesystem du . Exclusive,如果是 CoW,则为 0.00B。

在这里找到:https ://unix.stackexchange.com/a/655813/525352

  • 感谢您链接到您的信息来源。请将足够的信息“复制”到您的答案中,以便可以自行理解和使用,而无需参考其他答案。 (3认同)