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

问题描述 投票:13回答:3

我在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可能会随着时间而改变。”

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

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

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

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

额外说明:

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

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


5
投票

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

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

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

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

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

分配inode有两个策略。如果新的inode是一个目录,则对具有可用空间和低目录到inode比率的块组进行前向搜索;如果失败,那么对于具有高于平均可用空间的组,则选择具有最少目录的组。对于其他inode,从父目录的块组向前搜索以查找空闲的inode。

为Ext3管理这个的源代码叫做ialloc,最终版本在这里:https://github.com/torvalds/linux/blob/master/fs/ext3/ialloc.c


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.