如何区分文件、链接和克隆文件

除了Apple文件系统(APFS)之外,文件系统不跟踪一个文件是克隆的还是已经克隆的。这些信息与现代文件系统的工作方式无关。然而,好奇的人可能想知道路径是常规文件、符号、硬链接还是克隆。这篇文章是给你的。

我假设您对支持克隆的文件系统比较熟悉。请阅读我的入门哪些文件系统支持克隆如果你是新手的话。

很难确定一个文件是否是另一个文件的一个副本。在Linux中,有可用的要求做这几个程序。我测试过五个这样的计划,并已得出结论,他们是红鲱鱼,并不能确切地回答这个问题。我不会命名程序或羞辱他们的开发人员,而是让你知道要寻找什么出来我就勾勒出了问题。

  • 其中4个使用了符号链接和硬链接,错误地认为这些链接是克隆的而不是链接。他们应该检查链接,而不是他们的目的地。
  • 他们三个克隆只考虑相同的文件,和不占部分克隆(文件分享一些但不是全部数据)。
  • 其中两个只检查了第一个数据块,并简单地假设文件的其余部分是相同的克隆。
  • 他们中的一个校验和文件内容,并宣布他们,如果他们匹配了,被克隆而不管这些文件是如何存储在文件系统中。

在Linux上,您可以比较两个文件路径来确定一个是否是另一个的克隆。本文的其余部分将指导您完成这个过程。

首先,让我们清除存储在不同设备上的文件,符号链接和硬链接:

  1. 运行以下命令统计文件1文件2(部分gnu-coreutils)。
  2. 比较设备标识符并确认它们匹配。

设备标识符唯一地标识文件系统的挂载点。只能在同一挂载点内克隆文件。例如,Btrfs子卷被挂载在不同的挂载点上,即使它们是相同的“文件系统”。"不能将文件从一个子卷复制到另一个子卷。

  1. 检查文件是否被报告为"常规文件"而不是"符号链接”。
  2. 比较它们的索引节点数的相似性。

硬链接共享相同的inode号作为它们的目的地,而克隆有自己的inode。这种区别(加上写时复制的文件系统)使克隆能够独立于原始克隆,即使在被不支持克隆的程序修改时也是如此。

到目前为止,我们已经确认您的路径[可能]是真实的文件。接下来,让我们检查它们之间是否共享任何克隆数据。

  1. 运行以下命令filefrag - v文件1文件2(部分e2fsprogs)。
  2. 比较文件logical_offset属性的范围内的共享标记集。

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

至于决定哪个是原版,哪个是克隆…没有时间机器,这几乎是不可能确定的。幸运的是,许多“写即拷”文件系统可以充当时间机器。假设您正在频繁地拍摄文件系统快照,您可以将旧的快照与当前状态进行比较,以确定首先创建哪个文件。

您也可以查看文件的生成时间(创建文件时)统计命令。这并不能保证给出明确的答案,但它是一个强有力的指标。您可以在Fedora 33和Ubuntu 20.10(这两个版本的预期版本)所支持的文件系统(包括Btrfs、Ext4、OCFS2和XFS)中找到这个字段)。在旧的Linux发行版中,出生时间字段是空的。

我还没有找到在macOS或Windows上识别克隆文件的类似过程。用于它的工具还不存在。APFS计算一个文件被克隆的次数。这个计数不能帮助你识别它的克隆,或者它是否正在与任何克隆共享数据。

严格地说,只有在对具有文件克隆能力的应用程序进行故障排除时,才能确定一个文件是否是克隆的。但是,调试这个文件系统特性不应该这么复杂!