为什么目录的 inode 会在 ext4 文件系统中存储文件名?

为什么目录的 inode 会在 ext4 文件系统中存储文件名?

我的理解是,目录 inode 与常规文件的 inode 没有本质上的不同Ext4 磁盘布局就是它:

目录条目:因此,更准确的说法是目录是一系列数据块,每个块包含目录项的线性数组。

目录项存储文件名以及指向其索引节点的指针。因此,如果文档说每个块包含目录条目,为什么debugfs会报告与目录 inode 中存储的文件名不同的内容?这是 ext4 格式闪存驱动器上的调试会话:

debugfs:  cat /sub
 .
  ..�
     spam�spam2�spam3��spam4

我认为无法inode_i_block存储这些文件名,我创建了文件名非常长的文件,大小超过 60 个字节。cat在 inode 上运行debugfs也显示了文件名,因此长文件名再次出现在 inode 中!

的内容inode.i_block

根据 inode 描述的文件类型,inode.i_block可以以不同的方式使用 60 字节的存储空间。一般来说,常规文件和目录会将其用于文件块索引信息,特殊文件会将其用于特殊目的。

此外,没有引用存储文件名的 inode 哈希树目录 这是较新的实现部分。我觉得我错过了该文件中的某些内容。

主要问题是,如果目录的 inode 包含文件名,那么它的数据块存储什么?

答案1

目录条目存储在inode.i_block数据块中。请参阅您链接到的文档中的“内联数据”和“内联目录”。

答案2

cat输出文件内容,即数据块。如同/bin/cat

cat如果该命令将 inode 结构的字节写入终端,则该命令将没有用处。比较inode_dumpstat

一些文档会告诉您历史上的 UNIX 允许/bin/cat读取此数据,这是从用户空间列出目录条目的原始方法。即ls会打开目录、read()条目,并为您解释它们。与使用 相反readdir(),内核以标准格式提供条目,而不管底层文件系统格式如何。

答案3

目录的数据包含dirent条目。每个目录条目包含一个文件名和一个指针到一个索引节点。为了提高效率,ext4 inode 可以包含小文件的数据内容,这样就不必执行另一个块读取。

“小”的价值对于文件属性,可以是 60 字节;如果不使用扩展文件属性,则最多可以是 160 字节。

答案4

我不认为 debugfs cat 命令显示 inode 本身的内容,尽管我认为手册页中的语言令人困惑。在很多地方,手册页都提到了“inode filespec”,我认为这是提醒读者文件规范可以是路径名或 inode 号的多余方式。比较手册页中的以下摘录:

文件规范- 转储inode的内容文件规范到标准输出。

统计数据 文件规范- 显示inode结构的内容文件规范

我认为 cat 显示的是“inode filespec”的内容,而不是显示 inode filespec 的内容。文件名肯定列在数据块中,而不是索引节点中。

相关内容