当前位置: 首页 > news >正文

【存储基础】【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工作原理示例

  1. 比如用户调用read()
    • 系统调用进入内核,VFS根据文件描述符找到对应的file结构体;
    • VFS检查权限,并通过file_operations调用具体文件系统的read方法;
    • 具体文件系统从磁盘或缓存读取数据,返回结果。
  2. 路径解析
    • 比如用户请求打开/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中的hometest
dentry的主要功能有:

  • 缓存路径解析结果,加速文件访问;
  • 维护目录树结构(比如父子关系、兄弟关系);
  • 关联文件名和inode(通过dentry->d_inode指针)

关于dentry结构的关键点:

  • dentry是内核中的缓存对象,避免频繁访问磁盘解析路径;
  • 目录树结构由dentry的父子关系构建,例如/子dentryhome, home子dentrytest
  • 支持负缓存,即记录“不存在的文件”,避免重复查找。

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有两个硬链接hardlink1hardlink2,则两个dentry(hardlinkhardlink2)指向同一个inode。

dentry和其他dentry的树状关系

dentry之间通过父子关系(d_parentd_subdirs)组织成目录树,形成完整的路径结构。
比如,路径/home/test/file.txt由多个dentry/ -> home -> test -> file.txt链接而成。

三者协作示例

比如当用户访问/home/test/file.txt

  1. vfs从根目录的dentry/开始,逐级查找home,test的dentry;
  2. 每个dentry指向对应的inode,比如test目录的inode;
  3. 最终找到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/dir2dir1的父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 - 博客园
http://www.lqws.cn/news/78643.html

相关文章:

  • C++哈希表:冲突解决与高效查找
  • Cesium使用primitive添加点线面(贴地)
  • Linux中的mysql备份与恢复
  • 查找和最小的K对数字
  • 软件开发项目管理工具选型及禅道开源版安装
  • 使用 MCP 将代理连接到 Elasticsearch 并对索引进行查询
  • UE5 创建2D角色帧动画学习笔记
  • HealthBench医疗AI评估基准:技术路径与核心价值深度分析(下)
  • 湖北理元理律所:企业债务重组中的“法律缓冲带”设计
  • 设计模式——备忘录设计模式(行为型)
  • 可视化大屏通用模板Axure原型设计案例
  • 谷粒商城-分布式微服务项目-高级篇[三]
  • DeepSeek 赋能车路协同:智能交通的破局与重构
  • Figma 与 Cursor 深度集成的完整解决方案
  • Windows不关防火墙,安全开放端口方法
  • 鸿蒙进阶——Mindspore Lite AI框架源码解读之模型加载详解(二)
  • Java设计模式之观察者模式详解
  • SystemVerilog—new函数的使用和误区
  • 【环境搭建】Java、Python、Nodejs等开发环境搭建
  • Fisher准则例题——给定类内散度矩阵和类样本均值
  • 2506js,活扩控件
  • 企业如何零基础建设网站?
  • 通俗理解“高内聚,低耦合”
  • 解锁 AI 大语言模型的“知识宝藏”:知识库的奥秘与优化之道
  • 项目管理进阶:56页大型IT项目管理实践经验分享【附全文阅读】
  • 学习STC51单片机25(芯片为STC89C52RCRC)
  • ESP32之Linux编译环境搭建流程
  • C++中实现随机数(超详细!​​​​​)
  • web架构2------(nginx多站点配置,include配置文件,日志,basic认证,ssl认证)
  • Spring MVC