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


8

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

Answers:


5

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

一个问题是文件只能通过“写时复制”共享部分数据。这称为物理范围,并且某些 所有物理范围可以在CoW文件之间共享。

inode当在文件之间进行比较时,没有什么比这可以告诉您文件共享相同的物理范围。(编辑:请参阅我的其他答案)。

低层次的答案是,你可以问哪个物理盘使用用于该文件的内核,这是中记录。原则上,如果所有物理盘区都相同,则文件必须共享相同的基础存储。FS_IOC_FIEMAP ioctlDocumentation/filesystems/fiemap.txt

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

但是,我要谨慎行事,因为这些事情在野外用途很少,您可能会找到错误的错误答案,因此请提防依靠此数据来决定可能导致数据损坏的操作。

一些相关的问题:


好答案!您将如何使用btrfs-debug-tree它列出给定文件名上的扩展区?
汤姆·黑尔

4

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.