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

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

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

答案1

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

一个问题是文件可能仅通过写入时复制共享部分数据。这称为物理范围,并且一些 或者 全部物理范围的一部分可以在 CoW 文件之间共享。

当在文件之间进行比较时,没有任何类似的东西inode可以告诉您文件共享相同的物理范围。(编辑:参见我的另一个答案)。

低级答案是,您可以使用以下命令询问内核文件使用了哪些物理范围FS_IOC_FIEMAP ioctl,即记录在Documentation/filesystems/fiemap.txt。原则上,如果所有物理范围都相同,则文件必须共享相同的底层存储。

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

不过,我会谨慎行事,因为这些东西在野外可能没有什么用处,因此您可能会发现错误给您错误的答案,因此要小心依赖这些数据来决定可能导致数据损坏的操作。

一些相关问题:

答案2

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

答案3

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

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

答案4

这并没有给接受的答案增加太多,但有人在这里总结了问题和几种方法 -https://www.ctrl.blog/entry/distinguish-file-link-clone.html

问题:

  • 区分符号链接和硬链接与引用链接
  • 识别部分克隆(共享部分但非全部数据的文件)

解决方案:

  • 使用文件碎片
  • 用于stat识别设备,因为克隆必须驻留在同一文件系统上。

引用:

硬链接与其目的地共享相同的索引节点号,而克隆则有自己的索引节点。这种区别(加上写时复制文件系统)使克隆能够独立于其原始版本运行,即使是在被非克隆感知程序修改时也是如此。”

  • 运行命令 filefrag -v file1 file2 (e2fsprogs 的一部分)。比较设置了共享标志的盘区行内的文件的physical_offset 范围。

如果这两个文件共享任何相同或重叠的范围,则它们会共享存储驱动器上的重复数据删除/克隆数据。

至于确定哪个是原作,哪个是克隆……。如果没有时间机器,这几乎是不可能确定的。

相关内容