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

dir*_*obs 5 filesystems directory ext4 inode debugfs

目录 inode 与常规文件的 inode 没有本质区别,我从Ext4 磁盘布局中理解的是:

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

目录条目将文件名与指向其 inode 的指针一起存储。因此,如果文档说每个块都包含目录条目,为什么debugfs报告存储在目录 inode 中的文件名不同呢?这是 ext4 格式的闪存驱动器上的调试会话:

debugfs:  cat /sub
?
 .
  ..?
     spam?spam2?spam3??spam4
Run Code Online (Sandbox Code Playgroud)

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

内容inode.i_block

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

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

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

Joh*_*éen 13

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


sou*_*edi 9

cat输出文件内容,即数据块。类似于/bin/cat

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

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


roa*_*ima 6

目录的数据包含dirent条目。每个目录条目都包含一个文件名和一个指向inode的指针。ext4 inode 可以包含小文件的数据内容以提高效率,因此它不必再执行一次块读取。

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