我的理解是,目录 inode 与常规文件的 inode 没有本质上的不同Ext4 磁盘布局就是它:
目录条目:因此,更准确的说法是目录是一系列数据块,每个块包含目录项的线性数组。
目录项存储文件名以及指向其索引节点的指针。因此,如果文档说每个块包含目录条目,为什么debugfs
会报告与目录 inode 中存储的文件名不同的内容?这是 ext4 格式闪存驱动器上的调试会话:
debugfs: cat /sub
�
.
..�
spam�spam2�spam3��spam4
我认为无法inode_i_block
存储这些文件名,我创建了文件名非常长的文件,大小超过 60 个字节。cat
在 inode 上运行debugfs
也显示了文件名,因此长文件名再次出现在 inode 中!
根据 inode 描述的文件类型,
inode.i_block
可以以不同的方式使用 60 字节的存储空间。一般来说,常规文件和目录会将其用于文件块索引信息,特殊文件会将其用于特殊目的。
此外,没有引用存储文件名的 inode 哈希树目录 这是较新的实现部分。我觉得我错过了该文件中的某些内容。
主要问题是,如果目录的 inode 包含文件名,那么它的数据块存储什么?
答案1
目录条目存储在inode.i_block
数据块中。请参阅您链接到的文档中的“内联数据”和“内联目录”。
答案2
cat
输出文件内容,即数据块。如同/bin/cat
。
cat
如果该命令将 inode 结构的字节写入终端,则该命令将没有用处。比较inode_dump
和stat
。
一些文档会告诉您历史上的 UNIX 允许/bin/cat
读取此数据,这是从用户空间列出目录条目的原始方法。即ls
会打开目录、read()
条目,并为您解释它们。与使用 相反readdir()
,内核以标准格式提供条目,而不管底层文件系统格式如何。
答案3
答案4
我不认为 debugfs cat 命令显示 inode 本身的内容,尽管我认为手册页中的语言令人困惑。在很多地方,手册页都提到了“inode filespec”,我认为这是提醒读者文件规范可以是路径名或 inode 号的多余方式。比较手册页中的以下摘录:
猫 文件规范- 转储inode的内容文件规范到标准输出。
统计数据 文件规范- 显示inode结构的内容文件规范。
我认为 cat 显示的是“inode filespec”的内容,而不是显示 inode filespec 的内容。文件名肯定列在数据块中,而不是索引节点中。