Nik*_* R. 20 filesystems directory architecture files
我的问题是目录是如何实现的?我可以相信像变量这样的数据结构,例如表、数组或类似的。由于 UNIX 是开源的,我可以在源代码中查看程序在创建新目录时所做的事情。你能告诉我在哪里看或详细说明这个话题吗?一个目录“是”一个我能理解的文件,一个目录真的是一个文件吗?我不确定文件是否确实存储在“文件”中,而您仍然可以说出几乎所有内容的单词 file,而且我不确定绝对不是文件的内容,因为您甚至可以将变量称为 a文件。例如,链接当然不是文件,链接就像目录,但这是否违反了目录是文件?
Sté*_*nez 23
目录的内部结构取决于使用的文件系统。如果您想确切地知道发生了什么,请查看文件系统实现。
基本上,在大多数文件系统中,目录是文件名(键)和 inode 编号(值)之间的关联数组。像这样¹:
1167010 .
1158721 ..
1167626 subdir
132651 barfile
132650 bazfile
Run Code Online (Sandbox Code Playgroud)
该列表以某种(或多或少)有效的方式编码在(通常)4KB 块链中。请注意,常规文件的内容以类似方式存储。在目录的情况下,了解这些块内实际使用的大小是没有意义的。这就是为什么报告的目录大小du
是 4KB 的倍数。
inode 用于将块连接在一起,形成一个单一的实体,即一般意义上的“文件”。它们由一个数字标识,该数字是某种地址,每个地址通常存储为一个单独的特殊块。
所有这些的管理都发生在内核模式中。软件只要求创建一个目录,其中包含一个名为int mkdir(const char *pathname, mode_t mode);
导致系统调用的函数,其余的都在幕后执行。
关于链接结构:
硬链接不是文件,它只是一个新的目录条目(即名称-inode编号关联),引用预先存在的 inode 实体²。这意味着可以从不同的路径名访问相同的 inode。特别是,由于元数据(权限、所有权、时间戳……)存储在 inode 中,因此这些元数据是唯一的,并且与选择访问文件的路径名无关。
符号链接是一个文件,它不同于它的目标。这意味着它有自己的 inode。它曾经像处理普通文件一样处理:目标路径存储在数据块中。但是现在,出于最近ext文件系统的效率原因,长度小于 60 字节的路径存储在 inode 本身中(使用通常用于存储指向数据块的指针的字段)。
—
1. 这是使用 获得的ls -ai1 testdir
。
2. 其类型必须与现在的“目录”不同。
Arc*_*ege 12
为了扩展 Stéphane Gimenez 的帖子,创建新目录是使用 S_IFDIR 的 st_mode 值(使用权限模式)创建新 inode 的过程,在新 inode 的第一个数据块中创建两个条目,链接为( 2) 系统调用:'.' 它指向这个新的 inode 和 '..' 指向父目录,然后在父目录中创建一个包含 inode 和新目录名称的条目 - 第一部分和最后一部分由系统调用 mknod( 2)。此外,现在只有 root 可以使用 mknod(2) 来执行我们正在谈论的此类任务。
例如,mkdir("/home/larry.user/xyzzy", 0666)
本质上如下(这是来自 SysV days[1] 的 C 代码):
int mode = 0666;
char newdir[] = "/home/larry.user/xyzzy";
char path1[NAMESZ+4, path2[NAMESZ+4], *p;
mknod(newdir, S_IFDIR|mode);
strcpy(path1, newdir);
strcat(path1, "/."); /* "." link */
link(newdir, path1);
strcat(path1, "."); /* ".." link */
strcpy(path2, newdir);
if ((p = strrchr(path2, '/') == (char *)0) /* root directory */
link(".", path1);
else {
*p = '\0';
link(path2, path1);
}
Run Code Online (Sandbox Code Playgroud)
这太容易出错(也是 fsck 的主要原因之一),因此创建了 mkdir(2) 系统调用来为您执行此操作。
请注意,可以使用 mknod(2) 创建 amy 文件系统对象:常规文件、目录、设备文件、符号链接等。所以要回答 OP 的一个问题,是的,目录就是一个文件,这意味着“它是一个对象,由 inode 表示,驻留在文件系统中,该文件系统与 i/o 接口一起运行”。