我正在使用 btrfs,它允许cp --reflink
写入时复制。其他程序(例如lxc-clone
)也可以使用此功能。我的问题是,如何判断一个文件是否是另一个文件的 CoW?就像硬链接一样,我可以从索引节点号中看出。
答案1
好问题。看起来目前没有任何简单的高级方法可以判断。
一个问题是文件可能仅通过写入时复制共享部分数据。这称为物理范围,并且一些 或者 全部物理范围的一部分可以在 CoW 文件之间共享。
当在文件之间进行比较时,没有任何类似的东西(编辑:参见我的另一个答案)。inode
可以告诉您文件共享相同的物理范围。
低级答案是,您可以使用以下命令询问内核文件使用了哪些物理范围FS_IOC_FIEMAP
ioctl
,即记录在Documentation/filesystems/fiemap.txt
。原则上,如果所有物理范围都相同,则文件必须共享相同的底层存储。
很少有东西能够实现从更高层次查看这些信息的方法。我找到了一些在这里输入代码。显然是filefrag
实用程序应该用 -v 显示范围。此外,btrfs-debug-tree
显示此信息。
不过,我会谨慎行事,因为这些东西在野外可能没有什么用处,因此您可能会发现错误给您错误的答案,因此要小心依赖这些数据来决定可能导致数据损坏的操作。
一些相关问题:
答案2
答案3
最简单的解决方案是使用btrfs filesystem du .
Exclusive,如果是 CoW,则为 0.00B。
答案4
这并没有给接受的答案增加太多,但有人在这里总结了问题和几种方法 -https://www.ctrl.blog/entry/distinguish-file-link-clone.html
问题:
- 区分符号链接和硬链接与引用链接
- 识别部分克隆(共享部分但非全部数据的文件)
解决方案:
- 使用文件碎片
- 用于
stat
识别设备,因为克隆必须驻留在同一文件系统上。
引用:
硬链接与其目的地共享相同的索引节点号,而克隆则有自己的索引节点。这种区别(加上写时复制文件系统)使克隆能够独立于其原始版本运行,即使是在被非克隆感知程序修改时也是如此。”
- 运行命令 filefrag -v file1 file2 (e2fsprogs 的一部分)。比较设置了共享标志的盘区行内的文件的physical_offset 范围。
如果这两个文件共享任何相同或重叠的范围,则它们会共享存储驱动器上的重复数据删除/克隆数据。
至于确定哪个是原作,哪个是克隆……。如果没有时间机器,这几乎是不可能确定的。