假设你是一个 Linux 使用者,你应该知道要想使用一个 U 盘里面的文件,需要系统支持你 U 盘里的操作系统,并且你还需要把 U 盘这个设备 mount 到现有的一个目录下面,其实这里面就牵涉到几个概念,首先,要有文件系统,那么就有一块数据需要来表明这些信息,这就是 super block, 其实有目录结构,在内核就它就是 dentry,还要有文件 inode,以及挂载到 dentry 上的一个挂载信息来表明,该目录下被挂载了一个文件系统。这几个重要的数据结构便是组成了 VFS 整体动作的基础。
下图1,展示了 file, dentry, inode, super block 之间的关系。
图解:
Process1 打开文件硬链接 /home/Henzox/file1, 该硬链接表示的文件为 /home/Henzox/file;
Process2 打开文件硬链接 /home/Henzox/file1,同上;
Process3 打开文件 /home/Henzox/file。
每次调用 open 打开文件,就会得到一个文件对象,它们记录了本次打开各自的信息,最重要的信息莫过于文件指针位置,即使是相同的文件,每次打开操作,都会有自己的操作位置,所以会有三个 File object, 而由于 /home/Henzox/file1 是 /home/Henzox/file 的硬链接,所以它们在磁盘上相当于同一个文件,所以三个进程其实是在操作同一个文件,帮只有一个 inode object,而 Process1 和 Process2 是使用相同的路径打开的,所以它们共享的是一个
dentry object,因为 dentry 代表一个目录项结构,目录项,故名思义,即可以是目录,也可以是文件,因为目录也被当作文件来处理。而一个文件系统就会有一个超级块来表示该文件系统下各结构体的信息,所以 inode 会指向它所在的文件系统的超级块对象。
那么现在这几个结构体之间的关系就大致明白了。