我正在学习 *nix 文件系统。特别是,我一直在关注这个教程https://www.grymoire.com/Unix/Inodes.html穿插着一些谷歌搜索之类的东西。 Unix 目录的真实形式本质上只是一个由(第 1 列)inode 编号和(第 2 列)指示与该 inode 编号对应的文件/目录名称的字符串组成的文件吗?然后,我们看到的“此目录中包含的文件/其他目录”实际上只是操作系统打印出表中的项目列表的事实,当您这样做$ ls
(或以其他方式浏览特定目录)时?
例如,这是目录文件的真实格式吗?
如果这是用 C 语言完成的,则文件具有一int inode
列和一char * filename
列。
答案1
Unix 目录的真实形式本质上只是一个由(第 1 列)inode 编号和(第 2 列)指示与该 inode 编号对应的文件/目录名称的字符串组成的文件吗?
至少从概念上来说,是的。然而,实际的磁盘格式可能有所不同。
尽管许多文件系统(如 ext4)都将目录视为文件,并以相同的方式保留其存储区域。 (除了ext4目录不能减小大小。)目录还需要有自己的inode来存储修改日期和权限等。但是目录的数据区域内的内容有所不同。 “经典”格式只是 {name, inode} 条目的列表(带有一些小的簿记,例如为名称保留的空间长度),但也使用更高级的数据结构(树)。对于 ext4,请参阅:https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Directory_Entries
另请注意,根据文件系统,目录条目能还包含类型指向的 inode。这对于优化很有用,如果您只需要类型,则无需对stat()
条目进行单独的系统调用。此外,inode 类型在 inode 的生命周期内不会改变,因此不存在必须保持多个目录条目同步的问题,就像将可变 inode 数据分流到目录中时会出现的问题一样。