当前位置: 首页 > 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 - 博客园

相关文章:

  • ER图递归关系画法,chen氏
  • 【JAVA】注解+元注解+自定义注解(万字详解)
  • 计算机组成原理——CPU的功能和基本结构
  • SQL进阶之旅 Day 12:分组聚合与HAVING高效应用
  • 【Pytorch学习笔记】模型模块06——hook函数
  • 蓝云APP:云端存储,便捷管理
  • 第2篇:数据库连接池原理与自定义连接池开发实践
  • 列表推导式(Python)
  • 题目 3230: 蓝桥杯2024年第十五届省赛真题-星际旅行
  • 通讯录Linux的实现
  • Linux中的mysql逻辑备份与恢复
  • 资源预加载+懒加载组合拳:从I/O拖慢到首帧渲染的全面优化方案
  • Higress项目解析(二):Proxy-Wasm Go SDK
  • 人工智能在智能制造业中的创新应用与未来趋势
  • 普中STM32F103ZET6开发攻略(二)
  • 《Effective Python》第六章 推导式和生成器——将迭代器作为参数传递给生成器,而不是调用 send 方法
  • 力扣刷题Day 68:搜索插入位置(35)
  • 【DSP数字信号处理】期末复习笔记(二)
  • 【笔记】Windows系统部署suna基于 MSYS2的Poetry 虚拟环境backedn后端包编译失败处理
  • 295. 数据流的中位数
  • 做网站开发需要的笔记本配置/百度接单平台
  • 软件园专业做网站/白山seo
  • 政府网站外语版建设/淘宝搜索关键词排名
  • 做网站怎样安全采集/电商网站对比
  • 成都六度网站建设/网站排名优化公司
  • wordpress 搬家 图片/谷歌seo关键词排名优化