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

【存储基础】【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.xdnf.cn/news/10798.html

相关文章:

  • 【AUTOSAR SystemServices】深入解析StbM模块:功能定义、工作原理与代码实现
  • Eigen库介绍以及模块划分和相关示例代码
  • 论文略读:LIMO: Less is More for Reasoning
  • Spring Boot中保存前端上传的图片
  • TASK OA 案例hook
  • Node.js 项目调试指南
  • 【小沐杂货铺】基于Three.JS构建IFC模型浏览器(WebGL、CAD、Revit、IFC)
  • 10种alpha想法。
  • Uiverse.io:免费UI组件库
  • 界面分析 - 上
  • RabbitMQ深度解析:从基础实践到高阶架构设计
  • leetcode93.复原IP地址:回溯算法中段控制与前导零处理的深度解析
  • Figma 中构建 Master Control Panel (MCP) 的完整设计方案
  • Docker 安装 Redis 容器
  • SQL 执行顺序详解
  • Laplace 噪声
  • 扩展数据(Concatenate)组件研究
  • 《AI Agent项目开发实战》DeepSeek R1模型蒸馏入门实战
  • Python----目标检测(《YOLO9000: Better, Faster, Stronger》和YOLO-V2的原理与网络结构)
  • SystemVerilog—三种线程之间的区别
  • 掌握HttpClient技术:从基础到实战(Apache)
  • IBM 与嘉士伯(Carlsberg)携手推进 SAP S/4HANA 数字化转型,打造啤酒行业新范式
  • Altium Disigner(16.1)学习-元器件封装
  • 从0开始学vue:pnpm怎么安装
  • 【深度学习】实验四 卷积神经网络CNN
  • 【设计模式-3.5】结构型——装饰器模式
  • 网络攻防技术二:密码学分析
  • 从0开始学vue:vue3和vue2的关系
  • VitalInsight智能体检报告解读
  • YOLOv5 :训练自己的数据集