目录的八进制转储

目录的八进制转储

我从旧货拍卖中得到了一本 Kernighan 和 Pike 写的《Unix 编程环境》。我对有关 UNIX 文件系统的章节非常感兴趣。当然,我也觉得这段话很有趣:

现在是时候查看目录中的字节了:

$ od -cb .
0000000    4    ;    .   \0   \0   \0   \0   \0   \0   \0   \0   \0   \0   \0   \0   \0
          064  073  056  000  000  000  000  000  000  000  000  000  000  000  000  000
....

实在是太长了,我就不把全部内容都写出来了。其要点是,它以系统上存储的方式显示目录。我很快冲到我的笔记本电脑(Debian)上尝试一下。我按照书上的内容输入了命令。

$ od -cb .
od: .: read error: Is a directory
0000000

显然它不会让我查看目录的原始内容。这是我的问题。

Linux 内核存储目录的方式是否与原始 UNIX 内核不同?如果不是,为什么需要向用户隐藏目录的实际字节?

答案1

每个文件系统type 以不同的方式存储目录。有许多不同的文件系统类型,具有不同的特征——适合高吞吐量,适合高并发,适合有限内存环境,读写性能、复杂性和稳定性之间的不同折衷方案等。您的书描述了早期使用的文件系统Unix系统。现代系统支持许多不同的文件系统。

Unix 的早期版本在内核之外有很多文件系统操作。例如,通过直接编辑一些文件系统数据结构来工作mkdirrmdir这很快就被统一的目录访问接口所取代,opendir//readdirclosedir系列,它允许应用程序操作目录而无需知道它们是如何在幕后实现的。

Linux下无法读取目录内容的原因并不是因为它们必须被隐藏,而是因为功能只有实现了才存在,而这个功能是没有意义的,而且是有代价的。鉴于格式取决于文件系统,这是一个毫无意义的功能:程序无法知道它正在读取的内容的格式。支持这两者都不是一个完全微不足道的功能:某些文件系统以不仅仅是字节流的方式组织目录,例如它可以组织为B树。一些 Unix 变体仍然允许应用程序直接读取目录内容,以实现向后兼容性,但 Linux 没有此功能(据我记忆,从未有过 - 它在 20 世纪 90 年代初就已经是一个过时的功能)。

答案2

对,但是:

  • 现代系统以不同的方式存储文件名。在最初的 Unix 中,名称限制为 14 个字符,其中 2 个字节用于 inode。
  • 目录的接口是通过函数opendir,readdir,closedir而不是open, read,close来反映组织的变化。
  • 由于没有人实际需要读取 16 字节目录条目,因此设计者忽略了从旨在读取的程序中读取原始目录文件的功能。文件

进一步阅读:

答案3

是的,Linux 内核使用 VFS 来抽象不同的文件系统,并且不允许您使用read(2)目录。

但是,如果您确实对 Linux EXT2/3/4 文件系统中目录的原始内容感兴趣,则可以使用该debugfs(8)实用程序,该实用程序e2fsprogs允许您将目录读取或转储为常规文件。

相关内容