【存储基础】【VFS】inodedentrysuper_block以及它们之间的关系
文章目录
- 1. 基础概念之VFS
- 1.1 VFS的核心功能
- 1.2 VFS工作原理示例
- 2. VFS核心数据结构之super_block
- 3. VFS核心数据结构之inode
- 4. VFS核心数据结构之dentry
- super_block、inode、dentry的关系
- super_block和inode的管理关系
- inode和dentry的关联关系
- dentry和其他dentry的树状关系
- 三者协作示例
- 总结
- 补充:目录树
- 目录树特点
- 目录树的实现原理
- 图示
- 例子
- 参考内容
内容待补充…
1. 基础概念之VFS
虚拟文件系统vfs是内核中的一个抽象层,它为上层应用程序和内核组件提供了统一的文件访问接口,同时支持多种不同的底层文件系统,其核心目标是屏蔽不同文件系统的差异,使得用户和程序能够以一致的方式操作文件,而无需关心底层存储的具体实现。
1.1 VFS的核心功能
- 统一接口:为应用程序提供一致的系统调用,如
open()
、read()
等; - 多文件系统共存:
- 允许同时挂载和管理多种文件系统,比如可以将ext4的根目录和NTFS的U盘挂载到同一目录树;
- 支持动态挂载和卸载:mount/umount
- 路径解析和目录查找
- 将用户提供的路径解析为具体的文件或目录;
- 通过目录项缓存 dentry cache加速路径查找,减少磁盘访问;
- 抽象数据结构:关键的数据结构如
inode, dentry, file, super_block
- 性能优化
- 维护inode缓存和dentry缓存,减少重复元数据访问;
- 支持页缓存(page cache),加速文件读写;
- 跨文件系统操作
- 协调不同文件系统间的操作,例如从ext4文件系统复制文件到NTFS;
- 处理挂载点覆盖,如在已有目录上挂载新文件系统
1.2 VFS工作原理示例
- 比如用户调用
read()
- 系统调用进入内核,VFS根据文件描述符找到对应的file结构体;
- VFS检查权限,并通过
file_operations
调用具体文件系统的read
方法; - 具体文件系统从磁盘或缓存读取数据,返回结果。
- 路径解析
- 比如用户请求打开
/mnt/nfs/file.txt
- VFS逐层解析路径:
根目录/ -> mnt -> nfs(挂载点) -> 调用对应的文件系统的lookup方法查找file.txt
- 比如用户请求打开
2. VFS核心数据结构之super_block
超级块super_block是文件系统级别的元数据,每个已挂载的文件系统都有一个super_block,存储该文件系统的全局信息,如:
- 文件系统类型
- 块大小、总块数、空闲块数
- 挂载选项
- 文件系统操作函数表,例如如何销毁inode等
在挂载文件系统时,内核会读取磁盘上的超级块信息,并初始化内存中的super_block结构;支持多种文件系统共存,每个文件系统的super_block通过链表组织。
3. VFS核心数据结构之inode
索引结点inode是文件级别的元数据,每个文件或目录对应一个inode,存储文件的静态信息,如:
- 权限、所有者、大小、atime、ctime、mtime等;
- 数据块在磁盘上的位置;
- 文件类型;
- 操作函数表,如创建文件、删除文件、修改权限等
inode是文件在文件系统中的唯一标识,与文件名无关(文件名由dentry管理);
硬链接的本质是多个dentry指向同一个inode(通过引用计数管理)。
4. VFS核心数据结构之dentry
dentry是路径名到inode的映射,是表示路径中的一个组成部分,如/home/test
中的home
和test
。
dentry的主要功能有:
- 缓存路径解析结果,加速文件访问;
- 维护目录树结构(比如父子关系、兄弟关系);
- 关联文件名和inode(通过dentry->d_inode指针)
关于dentry结构的关键点:
- dentry是内核中的缓存对象,避免频繁访问磁盘解析路径;
- 目录树结构由dentry的父子关系构建,例如
/
的子dentry是home
,home
的子dentry是test
; - 支持负缓存,即记录“不存在的文件”,避免重复查找。
super_block、inode、dentry的关系
super_block和inode的管理关系
super_block负责管理该文件系统中的所有inode,例如:
- 挂载文件系统时,从磁盘读取根目录的inode(super_block->s_root)
- 通过super_operations中的
alloc_inode/destory_inode
方法创建或销毁inode
inode和dentry的关联关系
dentry通过d_inode字段指向对应的inode,而inode通过i_dentry链表记录所有指向它的dentry。
例如,若文件file
有两个硬链接hardlink1
和hardlink2
,则两个dentry(hardlink
和hardlink2
)指向同一个inode。
dentry和其他dentry的树状关系
dentry之间通过父子关系(d_parent
和d_subdirs
)组织成目录树,形成完整的路径结构。
比如,路径/home/test/file.txt
由多个dentry/ -> home -> test -> file.txt
链接而成。
三者协作示例
比如当用户访问/home/test/file.txt
:
- vfs从根目录的dentry
/
开始,逐级查找home,test
的dentry; - 每个dentry指向对应的inode,比如
test
目录的inode; - 最终找到
file.txt
的dentry,通过其d_inode获取文件的元数据和数据块位置
总结
- super_block:是文件系统的基石,提供全局管理能力,管理整个文件系统的元数据和操作;
- inode:是文件的核心,存储所有静态信息,管理单个文件的元数据和操作;
- dentry:是路径解析的桥梁,通过缓存加速访问,管理路径名到inode的映射,构建目录树结构
打个比方,super_block就是图书馆管理员,inode是书的详情描述卡,dentry是目录索引,告诉读者如何找到书的位置。
补充:目录树
linux系统中,目录树(directory tree, dtree)是文件和目录的层次化组织结构,它以根目录为起点,通过父子关系的目录层级将所有文件和存储设备统一组织成一个树状逻辑结构。
目录树是linux文件系统的核心抽象,为用户和程序提供了一种统一的访问文件方式。
目录树特点
- 单根结构
- 所有的文件和目录的路径均以根目录
/
为起点; - 单根结构使得不同存储设备可以挂载到目录树的某个子目录;
- 所有的文件和目录的路径均以根目录
- 层级化组织
- 目录包含子目录和文件,形成树状分支结构
- 逻辑与物理分离
- 逻辑结构上:目录树是用户看到的统一视图,与实际的物理存储无关;
- 物理存储上:文件可能分布在不同磁盘分区、网络存储、或者内存中,通过挂载点绑定到目录树。
目录树的实现原理
目录树通过VFS的dentry、inode和super_block组件实现:
- dentry目录项:
- dentry表示目录树中的一个节点,缓存路径名到inode的映射;
- dentry维护目录树的父子关系,比如
/dir1/dir2
,dir1
的父dentry是/
子dentry是dir2
;
- inode索引节点:
- inode中存放文件/目录的元数据
- super_block超级块:
- 超级块管理挂载到目录树上的文件系统
图示
例子
参考内容
- dentry和inode的关系_土豆西瓜大芝麻-Linux
- Linux 文件系统基础之 inode 和 dentry | Koenli’s Blog
- 图解Linux虚拟文件系统(VFS)之关系篇-51CTO.COM
- 【文件】VFS四大struct:file、dentry、inode、super_block 是什么?区别?关系?–编辑中 - bdy - 博客园