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

问题描述 投票:0回答:1

关于Linux的虚拟文件系统,有很多解释和书籍章节,包括在SOF中。结构dentry结构inode 以及文件名和Inode之间的映射。

我以为dentry是文件系统定位inode的方式,但是在我读到的每一个参考资料中也都说dentry对象是在内存中的,那么一旦重启机器,如何定位一个新创建的文件呢?

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

linux filesystems directory-structure inode vfs
1个回答
0
投票

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

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

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

像UFS和ext3这样的文件系统的盘上格式,实际上大多数Unix孕育的文件系统都定义了 "inode "和 "dentry "的概念。FAT32和SMB则没有。

不过,Linux和其他内核还是发现,在不同的磁盘格式中拥有共同的代码是非常有用的,于是就有了VFS抽象层。这个抽象层只存在于内存中,它不会对各个文件系统规定任何有关磁盘格式的东西。

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

例如,ext4在内存中的inodes & dentries与磁盘上的inodes & dentries之间有一个相当直接的映射。它有相应的 struct ext4_inode (存于 i_private)和 struct ext4_dir_entry (存于 d_fsdata).

所以在ext4上,查找 /a/b/c 是通过。

  • 获取根源 struct inode在挂载时已经缓存在VFS中了
  • 要求ext4加载 a 的inode。
  • inode的内容是一个列表(嗯,可能是一个更复杂的数据结构),其中包括 ext4_dir_entrys - ext4将找到正确的
  • ext4将查看 ext4_dir_entry的inode号,并加载 ext4_inode 变成 struct inode 的VFS缓存中。
  • 使用缓存的 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 不存在,你就不会去盘第二次。
© www.soinside.com 2019 - 2024. All rights reserved.