关于Linux的虚拟文件系统,有很多解释和书籍章节,包括在SOF中。结构dentry 和 结构inode 以及文件名和Inode之间的映射。
我以为dentry是文件系统定位inode的方式,但是在我读到的每一个参考资料中也都说dentry对象是在内存中的,那么一旦重启机器,如何定位一个新创建的文件呢?
所以当你创建一个文件,路径为 abc 然后你想打开这个文件,文件系统是如何定位它的? 如果你能在你的答案中同时引用dentry和Inode对象的话
一个文件系统由两个主要的行为块组成。
像FAT32这样的文件系统,其盘上格式可以在Windows、Mac和Linux中读取--盘上格式保持不变,但同步和访问部分在不同操作系统中有所不同。
像UFS和ext3这样的文件系统的盘上格式,实际上大多数Unix孕育的文件系统都定义了 "inode "和 "dentry "的概念。FAT32和SMB则没有。
不过,Linux和其他内核还是发现,在不同的磁盘格式中拥有共同的代码是非常有用的,于是就有了VFS抽象层。这个抽象层只存在于内存中,它不会对各个文件系统规定任何有关磁盘格式的东西。
但是,VFS的抽象层(各个文件系统需要实现的API)定义了数据结构,如 struct inode
和 struct dentry
- 但它们只存在于内存中。
例如,ext4在内存中的inodes & dentries与磁盘上的inodes & dentries之间有一个相当直接的映射。它有相应的 struct ext4_inode
(存于 i_private
)和 struct ext4_dir_entry
(存于 d_fsdata
).
所以在ext4上,查找 /a/b/c
是通过。
struct inode
在挂载时已经缓存在VFS中了a
的inode。ext4_dir_entry
s - ext4将找到正确的ext4_dir_entry
的inode号,并加载 ext4_inode
变成 struct inode
的VFS缓存中。struct inode
和 ext4_dir_entry
,ext4将建立一个 struct dentry
并将其返回给VFS。b
从它。请注意,VFS的抽象并不是100%对应于ext4。
struct dentry
它不包含一个inode号 -- inode必须被加载。struct dentry
缓存inode的类型,而 ext4_dir_entry
不。struct dentry
可以 负面这意味着它将缓存该文件不存在的事实,所以如果你运行 ls x; ls x
和 x
不存在,你就不会去盘第二次。