inode 有什么用?

maa*_*nus 6 filesystems hard-link inode files

我想知道将有关文件的信息存储在inode 中而不是直接存储在目录中是否值得额外的开销。可能我高估了开销或忽略了一些重要的事情,但这就是我问的原因。

我看到硬链接需要像“inode”这样的东西,但如果开销真的和我想象的一样大,我想知道是否有任何理由证明它合理的:

  • 使用硬链接进行备份很聪明,但与正常操作的效率相比,备份的效率还不够重要
  • 硬链接既没有速度也没有大小损失真的很重要,因为这种优势仅适用于使用硬链接的少数文件,而对所有文件的访问会受到开销
  • 为几个同名的二进制文件节省一些空间,例如bunzip2并且bcat可以忽略不计

我并不是说 inodes/hardlinks 不好或没用,但它能否证明额外间接的成本是合理的(缓存肯定有很大帮助,但它不是灵丹妙药)?

Gil*_*il' 11

硬链接不是重点。它们不是拥有 inode 的原因。它们是副产品:基本上,任何合理的类 Unix 文件系统设计(甚至 NTFS 在这一点上都足够接近)具有免费的硬链接。

inode 是存储文件所有元数据的地方:其修改时间、权限等。它也是磁盘上文件数据的存储位置。这些数据必须存储在某个地方。

将 inode 数据存储在目录中会带来自己的开销。它使目录更大,因此获取目录列表的速度较慢。您为每个文件访问节省了一次搜索,但是每个目录遍历(访问一个文件需要几个,文件路径上的每个目录一个)花费更多。最重要的是,它将文件从一个目录移动到另一个目录变得更加困难:您需要移动所有元数据,而不是仅移动指向 inode 的指针。

Unix 系统总是允许你重命名或删除一个文件,即使一个进程打开了它。(在某些 unix 变体上,几乎总是这样做。)这在实践中是一个非常重要的属性:这意味着应用程序不能“劫持”文件。重命名或删除文件不会影响应用程序,它可以继续读取和写入文件。如果文件被删除,数据会一直保留,直到没有进程再打开文件。这是通过将进程与 inode 相关联来实现的。该进程不能与文件名相关联,因为它可能随时更改甚至消失。

另请参阅什么是超级块、索引节点、Dentry 和文件?