我在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 说:
那么,他们提到的那些案例是什么?
请注意,我研究了类似的问题:
但他们没有回答我的问题.
inotify界面使您能够监视对inode(文件或目录)的更改额外说明:
额外的文字:旧的Unix adagium"一切都是文件"实际上应该是:"一切都是inode".inode包含除名称之外的文件(或目录或特殊文件)的所有元信息.实际上,文件名只是一个恰好链接到特定inode的目录条目.移动文件意味着:创建指向同一inode的新链接,结束删除链接到它的旧目录条目.inode元数据可以通过和,以及系统调用获得.stat()fstat()lstat()
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
| 归档时间: |
|
| 查看次数: |
5455 次 |
| 最近记录: |