inode 表保存在内存中吗?

inode 表保存在内存中吗?

据我了解,Linux 使用 inode 表在磁盘上定位文件。 Linux文件系统是否在内存中保存inode表?无论 ext2、ext3 还是 ext4,这都是一样的吗?

有谁知道描述这一点的好参考资料吗?

答案1

这已经在这里介绍过:文件表是在文件系统中还是在内存中?

看来说得还蛮彻底的。但这仍然是一个好问题。正如您所看到的,这个问题实际上比您的问题所暗示的更具体。

http://140.120.7.21/LinuxKernel/LinuxKernel/node17.html这是一个更技术性的解释,似乎涵盖了相同的问题,具有相同的答案,如果我没读错的话,内存和磁盘上都有不同类型的索引节点表。这是从 2008 年开始的,但我怀疑至少对于 ext 文件系统来说,没有太大变化,尽管我不确定这一点。

旧的内核解释实际上相当不错:

普通文件只是存储在某些物理设备中的数据字节序列,没有附加任何名称。该文件的管理信息,如所有者、权限、大小、时间等,存储在文件的 inode 结构中。文件系统的所有索引节点都收集在一起形成索引节点表。每个文件系统占用一个逻辑磁盘。从逻辑磁盘的$2^{nd}$块开始,内核将文件系统的inode表存储在连续的磁盘块中。每个索引节点(索引节点表中的一个条目)是系统用来存储有关文件的以下信息的数据结构:

....

最后,Linux 源代码树 (include/linux/fs.h) 中还定义了一种 inode 结构。这是In-Core inode,即加载到内存中的inode结构。当加载这个In-Core inode时,相关的磁盘inode信息会被填充到其相关字段中。

答案2

Linux(实际上是任何其他 Unix)不需要索引节点定位磁盘上的文件,查找操作只需要目录条目( dentry),即对于路径为/foo/bar,查找例程将需要访问位于目录“foo”中的目录项“bar”。

Linux 内核中有一个跨文件系统层,用于缓存目录项,称为目录项缓存或数据缓存简而言之。但是,它inode也保留指向对象的指针。它在内核文档中有描述文件系统/vfs.txt

VFS 实现open(2)stat(2)chmod(2)和类似的系统调用。 VFS 使用传递给它们的路径名参数来搜索目录项缓存(也称为 dentry 缓存或 dcache)。这提供了一种非常快速的查找机制来翻译路径名(文件名) 转化为具体的目录项。目录项存在于 RAM 中,永远不会保存到磁盘上:它们的存在只是为了性能。

dentry 缓存旨在成为整个文件空间的视图。由于大多数计算机无法同时将所有目录项放入 RAM,因此缓存的某些位会丢失。为了将路径名解析为 dentry,VFS 可能必须一路创建 dentry,然后加载 inode。这是通过查找索引节点来完成的。

答案3

一般来说,Linux 仅在文件打开时将 inode 加载到内存中。文件关闭后,数据可能会以更新的形式在内存中保留一段时间,然后再将其刷新到磁盘(通过缓存逻辑)或标记为不使用。

某些文件被重复打开和关闭是文件系统的频繁使用模式。通过在后续重新打开时不重新读取索引节点可以提高效率。

权威参考是Linux内核源代码。源代码树中的源代码/文档目录通常包含您正在寻找的详细信息,但可能未完全更新以匹配源代码。

相关内容