关于linux:可以将inode和crtime用作唯一的文件标识符吗?

Can inode and crtime be used as a unique file identifier?

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

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

因此,问题是是否存在文件的inode或crtime的情况。可能会更改。例如,fsck或碎片整理或分区大小是否可以更改inode或crtime或文件?

对http://msdn.microsoft.com/zh-cn/library/aa363788(VS.85 ).aspx表示:

  • "在NTFS文件系统中,文件会保持相同的文件ID,直到被删除为止。"但是在某些情况下还会:
  • " ,一个文件的ID "

那么,它们提到的那些情况是什么?

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

  • 如何确定linux中文件的唯一性?
  • 执行'mv A B':'inode'会改变吗?
  • 在Linux中检测移动或重命名文件的最佳方法?

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


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

对于Ext3文件系统(最受欢迎),i节点被重用,因此不能用作唯一的文件标识符,也不会根据

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

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

来自ialloc.c的源代码,其中分配了i节点的位置:

There are two policies for allocating an inode. If the new inode is a
directory, then a forward search is made for a block group with both
free space and a low directory-to-inode ratio; if that fails, then of
he groups with above-average free space, that group with the fewest
directories already is chosen. For other inodes, search forward from
the parent directory's block group to find a free inode.

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


  • {device_nr,inode_nr}是系统中inode的唯一标识符
  • 将文件移动到其他目录不会更改其inode_nr
  • linux inotify界面使您可以监视对索引节点(文件或目录)的更改。

附加说明:

  • 在文件系统中移动文件的处理方式不同。 (实际上是删除副本)
  • 联网的文件系统(或已安装的NTFS)不能总是保证inodenumbers
  • 的稳定性Microsoft不是unix供应商,其文档也不涵盖Unix或其版本。文件系统,并且应该被忽略(NTFS \\的内部除外)

附加文本:旧的Unix adagium \\\\"一切都是文件\\\\"实际上应该是:\\\\ "一切都是索引节点"。索引节点携带除名称之外的有关文件(或目录或特殊文件)的所有元信息。文件名实际上只是一个碰巧链接到特定inode的目录条目。移动文件意味着:创建到相同inode的新链接,结束删除链接到该inode的旧目录条目.inode元数据可以通过stat()fstat()以及lstat()系统调用获得。 >


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