VFS(虚拟文件系统)中的inode和dentry关系混淆,文件名和inode之间的映射在哪里

Posted

技术标签:

【中文标题】VFS(虚拟文件系统)中的inode和dentry关系混淆,文件名和inode之间的映射在哪里【英文标题】:inode and dentry relation confusion in VFS(virtual file system), where is the mapping between filename and inode 【发布时间】:2020-08-16 07:30:53 【问题描述】:

有许多关于 Linux 虚拟文件系统的解释和书籍部分,包括 SOF 中的此处。 但是对于 struct dentrystruct inode 之间的关系以及文件名和 Inode 之间的映射,我仍然有些困惑。

我认为dentry是文件系统定位inode的方式,但它在我读到的每个引用中都说dentry对象是在内存中的,所以一旦你重新启动机器,你怎么能找到一个新的创建文件?

所以当你创建一个路径为 /a/b/c 的文件,然后你想打开这个文件时,文件系统是如何定位它的呢?如果您可以在答案中同时引用 dentry 和 Inode 对象

【问题讨论】:

【参考方案1】:

一个文件系统由两个主要的行为块组成:

磁盘上的格式,存储数据在持久媒体上的表示方式。 访问存储数据时进程、内核代码和硬件之间的同步。

像 FAT32 这样的文件系统具有可在 Windows、Mac 和 Linux 中读取的磁盘格式 - 磁盘格式保持不变,但同步和访问部分因操作系统而异。

文件系统的磁盘格式,如 UFS 和 ext3,实际上大多数 Unix 文件系统都定义了“inode”和“dentry”的概念。 FAT32 和 SMB 没有。

不过,Linux 和其他内核发现跨不同磁盘格式的通用代码非常有用,因此创建了 VFS 抽象层。这个抽象层只存在于内存中;它不会向单个文件系统规定任何有关磁盘格式的内容。

但是,VFS 的抽象(单个文件系统需要实现的 API)定义了诸如 struct inodestruct dentry 之类的数据结构 - 但它们只存在于内存中。

例如,ext4 在内存中的 inode 和 dentry 到磁盘上的 inode 和 dentry 之间有一个相当直接的映射。它有对应的struct ext4_inode(存储在i_private)和struct ext4_dir_entry(存储在d_fsdata)。

所以在 ext4 上,查找 /a/b/c 由以下人员完成:

获取根struct inode,在挂载时已缓存在 VFS 中 要求 ext4 从该 inode 加载 a。 inode 的内容是ext4_dir_entrys 的列表(嗯,可能是更复杂的数据结构) - ext4 会找到正确的列表 ext4 将查看ext4_dir_entry 的inode 编号并将ext4_inode 加载到VFS 缓存中的struct inode。 使用缓存的struct inodeext4_dir_entry,ext4 将构建一个struct dentry 并将其返回给VFS。 VFS 将查看 dentry 的 inode,并要求 ext4 从中加载 b。 该过程重复。

请注意,VFS 的抽象并不是 100% 对应于 ext4:

struct dentry 不包含 inode 编号 - 必须加载 inode struct dentry 会缓存 inode 的类型,而 ext4_dir_entry 不会。 struct dentry 可以是否定的,这意味着它会缓存文件不存在的事实,因此如果您运行ls x; ls xx 不存在,您就不会去磁盘第二次。

【讨论】:

以上是关于VFS(虚拟文件系统)中的inode和dentry关系混淆,文件名和inode之间的映射在哪里的主要内容,如果未能解决你的问题,请参考以下文章

VFS,super_block,inode,dentry—结构体图解

Linux虚拟文件系统(VFS)

Linux VFS分析

VFS四大对象之一 struct super_block

其他文件系统

VFS四大对象之三 struct dentry