inode和crtime可以用作唯一的文件标识符吗?

时间:2013-04-17 20:42:24

标签: linux inode

我在 Linux 上有一个文件索引数据库。目前我使用文件路径作为标识符。 但是,如果文件被移动/重命名,其路径将被更改,我无法将我的DB记录与新文件匹配,并且必须删除/重新创建记录。更糟糕的是,如果移动/重命名目录,那么我必须删除/重新创建所有文件和嵌套目录的记录。

我想使用 inode 编号作为唯一文件标识符,但如果删除了文件并创建了另一个文件,则可以重复使用inode编号。

所以,我想知道我是否可以使用一对{inode,crtime}作为唯一文件标识符。 我希望在NTFS上的ext4和creation_time上使用i_crtime。 在我的有限测试中(使用ext4)inode和crtime确实在重命名或移动同一文件系统中的文件或目录时保持不变。

因此,问题在于是否存在文件的inode或crtime可能发生变化的情况。 例如,fsck或碎片整理或分区大小调整改变inode或crtime或文件?

有趣的是 http://msdn.microsoft.com/en-us/library/aa363788%28VS.85%29.aspx说:

  • 在NTFS文件系统中,文件保留相同的文件ID,直到删除为止。
    还有:
  • 在某些情况下,文件的文件ID可能会随着时间而变化。

那么,他们提到的那些案件是什么?

请注意,我研究过类似的问题:

但他们没有回答我的问题。

3 个答案:

答案 0 :(得分:5)

  • {device_nr,inode_nr}是系统中inode 的唯一标识符
  • 将文件移动到其他目录更改其inode_nr
  • linux inotify接口使您能够监视对inode(文件或目录)的更改

额外说明:

  • 跨文件系统移动文件 的处理方式不同。 (它实际上是复制+删除)
  • 网络文件系统(或已安装的NTFS)无法始终保证inodenumbers的稳定性
  • Microsoft 是unix供应商,其文档不包括Unix或其文件系统,应该被忽略(NTFS的内部除外)

额外的文字:旧的Unix adagium“一切都是文件”实际应该是:“一切都是inode”。 inode包含关于文件(或目录或特殊文件)的所有元信息 除了名称。实际上,文件名只是一个恰好链接到特定inode的目录条目。移动文件意味着:创建指向同一inode的新链接,结束删除链接到它的旧目录条目。 可以通过stat()fstat()以及lstat()系统调用获取inode元数据。

答案 1 :(得分:4)

Unix中i节点的分配和管理取决于文件系统。因此,对于每个文件系统,答案可能会有所不同。

对于Ext3文件系统(最受欢迎的),i-nodes被重用,因此不能用作唯一的文件标识符,也不会根据任何可预测的模式进行重用。

在Ext3中,i位节点在位向量中被跟踪,每个位代表一个i节点号。当释放i节点时,它的位被设置为零。当需要新的i节点时,将搜索位向量以寻找第一个零位,并重新使用i节点号(可能先前已分配给另一个文件)。

这可能导致天真的结论,即编号最小的可用i节点将是重用的i节点。但是,Ext3文件系统非常复杂且高度优化,因此不应该假设关于何时以及如何重用i-node数字,即使它们显然也是如此。

从ialloc.c的源代码中,分配了i节点:

  

分配inode有两个策略。如果新的inode是   目录,然后对具有两者的块组进行前向搜索   自由空间和低目录间比率;如果失败了,那么   他拥有高于平均水平的自由空间,这个群体的自由空间最少   已经选择了目录。对于其他inode,请向前搜索   父目录的块组以查找空闲的inode。

为Ext3管理此代码的源代码称为ialloc,最终版本在此处:https://github.com/torvalds/linux/blob/master/fs/ext3/ialloc.c

答案 2 :(得分:-1)

我猜dB应用程序需要考虑从备份还原文件的情况,这将保留文件crtime,但不会保留inode编号。