14

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

我想使用inode编号作为唯一的文件标识符,但是如果删除文件并创建另一个文件,则可以重用 inode 编号。

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

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

有趣的是 http://msdn.microsoft.com/en-us/library/aa363788%28VS.85%29.aspx 说:

  • 在 NTFS 文件系统中,一个文件在被删除之前保持相同的文件 ID。
    但也:
  • "在某些情况下,文件的文件 ID 会随着时间而改变。 "

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

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

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

4

3 回答 3

5

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

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

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

这可能会导致一个幼稚的结论,即编号最小的可用 i 节点将被重用。然而,Ext3 文件系统是复杂且高度优化的,因此不应假设何时以及如何重用 i 节点编号,即使它们显然会。

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

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

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

于 2014-08-28T23:42:27.003 回答
5
  • {device_nr,inode_nr} 是系统内inode 的唯一标识符
  • 将文件移动到不同的目录不会改变它的 inode_nr
  • linuxinotify界面使您能够监视对 inode(文件或目录)的更改

额外说明:

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

额外文本:旧的 Unix 格言“一切都是文件”实际上应该是:“一切都是 inode”。inode 携带有关文件(或目录,或特殊文件)的所有元信息,但名称除外。文件名实际上只是碰巧链接到特定 inode 的目录条目。移动文件意味着:创建一个指向同一个 inode 的新链接,结束删除链接到它的旧目录条目。inode 元数据可以通过stat()and fstat(), andlstat()系统调用获得。

于 2013-04-17T21:05:56.910 回答
-1

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

于 2019-04-07T07:47:36.170 回答