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 dentry 和 struct 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 inode
和 struct 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_entry
s 的列表(嗯,可能是更复杂的数据结构) - ext4 会找到正确的列表
ext4 将查看ext4_dir_entry
的inode 编号并将ext4_inode
加载到VFS 缓存中的struct inode
。
使用缓存的struct inode
和ext4_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 x
和x
不存在,您就不会去磁盘第二次。
【讨论】:
以上是关于VFS(虚拟文件系统)中的inode和dentry关系混淆,文件名和inode之间的映射在哪里的主要内容,如果未能解决你的问题,请参考以下文章