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

解析磁盘文件系统

目录

磁盘

数组--磁盘文件--文件系统

重点来了!!!

(1)inode Table:

那inode是什么?

Inode Bitmap

Dateblocks:

Block Bitmap:

四大模块串联:

那么我们如何存储一个文件?(在组的视角)

inode与block间的映射

如何找到文件--文件名与inode


磁盘

引:对于我们的文件我们分为已打开的和未打开的:

今天我们就磁盘文件和文件系统展开描述!

1.首先我们先来了解硬件设备磁盘:

这是我们日常生活中常用的磁盘内部结构,其中的光滑面上就是我们储存文件的地方,那它是如何工作的?

(1)磁盘储存结构:

a.光面上存在多个同心磁道,每个磁道上的扇区是磁盘存储的基本单位,一般为512字节(规定)!

b.磁盘高速旋转,利用主臂上的磁头进行左右移动进行信息读取,注意磁盘外壳内处于真空状态。

上面三图从平面到立体整个展示了主要的存储结构。

其中文件信息就在扇区上,那么如何定位扇区?

理解:同半径磁道卷起来就是一个柱面,不同半径的柱面卷起来就形成了上面的蓝色圆柱(像果丹皮)

磁盘常用CHS定位法:

C:确定磁头访问哪一个柱面(cylinder)

H:定位哪一个磁头(header)

S:定位扇区(sector)

c.多个磁头随传动臂共进退

(语言层)d.每个柱面展开相当于一个矩形(大的数组),每个矩形中的扇区就相当于小数组都有一个下标,则我们查询扇区时就可以利用数组的查询方式LBA,则LBA与CHS可以相互转换。

LBA  =  柱面号C单个柱面总的扇区数 + 磁头号H每个磁道扇区数+ 扇区号S -1

总结:对于OS来说我们访问磁盘文件就是用LBA查。

数组--磁盘文件--文件系统

我们可以将磁盘抽象成下图:

OS对于这么大的数组采用分治的思想进行管理。Linux规定OS单次以4kb的大小进行IO,即八个扇区。相当于地区管理中的省,那么我们还可以分出市,所以我们将八个扇区化为一个区,一个区又可以分多个组:

那么我们只要管理好一个组,将这种模式应用到其他组就可以很容易管理整个磁盘文件。

(软件层面)OS对于一个组提出了下面的结构:

一个就一个这样的管理结构,对于一个组又提出了上图最下面的6块,接下来我们以这六块介绍OS管理文件的方法。

Block Group:相当于每个省里的市,将磁盘分区又划分为不同的组。

Super Block:记录inode和data blocks的数量,即一个分区里有多少个文件属性和与之对应的数据块,也是文件进行创建删除修改的信息读取处,其与文件系统共存亡。

GDT:

引:一个分区一个文件系统,不同分区可以用不同的文件系统,如:

而GDT里存的是不同文件系统下块组的属性信息。

重点来了!!!

我们已知文件 = 属性 + 数据

接下来的四个模块就是,描述属性和数据的,也是整个文件系统的核心。

(1)inode Table:

这是一张存储文件属性的集合,上面也是以4KB为一块的数组,每个元素存的是inode。

那inode是什么?

inode是属性数据的集合,相当于一个文件的索引节点,本质上也是一个结构体:

inode结构体主要的信息就是上图。在此声明文件名不在inode中,具体在哪?后面会讲。

a.我们可以用下面的指令查看一个文件的inode

ls -l -i

b.对于这个结构体Linux默认一般为128字节

/////////////////////////////////////////////////////////////////////////////////

前面我们说过一个分区一个文件系统,而且我们还知道了文件的属性存在于inode中,inode存在于Inode Table里,那么我们如何知道Inode Table里哪些块是否已经存在inode?

Inode Bitmap

我们了解到Linux中分组是以4KB大小的,那我们如何以小的字节数标记数万个文件属性的储存?我么就引入了Inode Bitmap以位来存储:

假设我们有10000个文件属性,10000/8 = 1250字节 /1024 约为2KB这就实现了以少存多。

我们规定0为空1为已经存储!

Dateblocks:

其也形似数组,Linux规定它也是以4KB为一个数据块,来存储文件的内容

Block Bitmap:

与inode相似也是一种按位记录哪些数据块有数据哪些没有。

四大模块串联:

总结和补充:

(1)有了这样一套管理结构,我们也是将磁盘文件从硬件转变为软件,并将其抽象为一个超大的数组,并在OS层面实现了管理文件的办法--文件系统应运而生。

(2)

我们要了解在一个分区里每个组都有自己的始末inode

(3)我们对于文件的增删查改就可以在map上进行0/1交换,而且对于OS来说,在内存上有专门的结构体struct_sb/gdt将一个分区中的super_block(sb)与GDT读取,进而将每个组的文件信息像链表一样链接起来,这样就变成了链表的增删查改。

(4)格式化:将bitmap上的1全变成0,使inode和block失效。

那么我们如何存储一个文件?(在组的视角)

(1)首先我们会去其inodebitmap上找一个位用来记录刚文件已存在,然后在GDT上查找每个组的起始inode,然后将自己的位数和初始inode相加后得到的值在去Inode Table上的对应位置储存文件属性。

所以有了始末inode我们就可以跨组进行储存!!!

(2)与inode储存方式相同,数据也是按照这种方式进行数据储存,但由于其大小可能很大,所以它也可能存储的是其他的储存该文件数据的块号。将起始块号(下标)给Inode。

inode与block间的映射

这些索引块便会指向不同的数据块,然而数据块有可能存储其他的块号,这样便可以存储大量数据。

如何找到文件--文件名与inode

我们访问文件是用文件名进行访问的,而OS则用inode这两者间的联系是什么?

我们开始就讲过我们通过文件路径进行访问文件,所以OS给用户提供了目录,然而目录也是文件!

目录 = 属性 +数据

其中目录的数据块就存储的是文件名与文件inode的映射关系,然后起始目录也就是我们找到不同文件在哪个区的依据。(磁盘层面)

当我们进行文件路径逆序解析找到根目录后(用户理解层面),OS便会正序按照这个路径找到文件,为了减少对磁盘文件系统的解析访问,OS会进行路径缓存,将访问到的路径以树的形式储存。(dentry tree)

http://www.lryc.cn/news/586904.html

相关文章:

  • 面试150 从中序与后序遍历构造二叉树
  • 手写std::optional:告别空指针的痛苦
  • HTTP与HTTPS详解
  • 20250713 保存 PGM / PPM 图片 C++
  • COZE token刷新
  • 一文读懂现代卷积神经网络—使用块的网络(VGG)
  • 2025江苏省信息安全管理与评估赛项二三阶段任务书
  • 改进后的 OpenCV 5.x + GStreamer + Python 3.12 编译流程(适用于 Orange Pi / ARM64)
  • 3.7 ASPICE的问题解决与改进过程
  • Linux-网络管理
  • iTestin 自动化录制工具
  • Kimi K2深度解析:开源万亿参数大模型,复杂场景能力强悍,为AI Agent而生!
  • Vision Kit之文档扫描
  • 【PyMuPDF】PDF图片处理过程内存优化分析
  • 论文Review 3DGSSLAM GauS-SLAM: Dense RGB-D SLAM with Gaussian Surfels
  • kettle从入门到精通 第102课 ETL之kettle xxl-job调度kettle的两种方式
  • 归并排序递归法和非递归法的简单简单介绍
  • 三种网络类型
  • X00211-基于残差edge-graph注意力机制的深度强化学习优化车辆路径问题
  • RedisJSON 技术揭秘(五)`JSON.ARRPOP` 原子弹出 修改数组的终极手段
  • 基于Java Web的销售管理系统设计系统
  • 操作系统--用户态和内核态
  • MongoDB对接SpringBoot【大数据存储】
  • ref 和 reactive
  • https交互原理
  • [Subtitle Edit] 字幕格式处理 | .Net依赖管理(NuGet)
  • Python----OpenCV(图像分割——彩色图像分割,GrabCut算法分割图像)
  • LeetCode--44.通配符匹配
  • Mybatis 两级缓存可能导致的问题
  • Java4种设计模式详解(单例模式、工厂模式、适配器模式、代理模式)