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

jhn*_*lmn 14 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可能会随着时间而改变. "

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

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

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

wil*_*ser 5

  • {device_nr,inode_nr}是系统中 inode的唯一标识符
  • 文件移动到不同的目录并没有改变其inode_nr
  • linux inotify界面使您能够监视对inode(文件或目录)的更改

额外说明:

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

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

  • wildplasser写道:"{device_nr,inode_nr}是系统上文件("inode")的唯一ID.这些保证是稳定的"................. .."保证"由谁?你有参考一些文件吗?因为快速谷歌搜索"保证稳定"inode带来"Inode数字不保证稳定"....................另外,inode不是足够,因为它们可以重复使用.所以,我决定也使用crtime.我需要了解它的稳定性. (2认同)
  • wildplasser 写道:“如果重用索引节点号,它首先必须未被使用。” jhnlmn:当然,我写了“但是如果删除文件并创建另一个文件,则索引节点号可以重用。” 在我的问题中 (2认同)

Gar*_*ski 5

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

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

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

这可能会得出天真的结论,即编号最少的可用i节点将被重用。但是,Ext3文件系统非常复杂且经过高度优化,因此即使可以明确使用i-node编号,也不应做任何假设。

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

分配索引节点有两种策略。如果新的inode是目录,则对具有可用空间和低目录索引比的块组进行正向搜索;如果失败,则在具有高于平均可用空间的组中,已经选择目录最少的组。对于其他inode,从父目录的块组中向前搜索以找到可用的inode。

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

  • 答案取决于您是否愿意冒文件系统算法发生变化的风险。目前,i 节点编号在文件被删除之前不会更改。此外,当使用 truncate(2) 截断文件时,内核不会更改 i 节点号。然而,许多程序在修改文件时会重新创建文件,从而更改 i 节点号。如果您已经编写了所有涉及的软件,并且明确知道 i 节点本身不会被删除,那么您可以冒险,至少在 ext3 文件系统上。考虑到诸多因素,我会持谨慎态度。 (2认同)