我在 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说:
那么,他们提到的那些案件是什么?
请注意,我研究过类似的问题:
但他们没有回答我的问题。
答案 0 :(得分:5)
inotify
接口使您能够监视对inode(文件或目录)的更改额外说明:
额外的文字:旧的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编号。