目录

一、引入文件系统

1. 引入块概念

2.分区与分组

3. 如何理解 创建删除修改查找文件??

创建

删除

修改

重谈inode 编号和块号

路径解析


一、引入文件系统

1. 引入块概念

其实硬盘是典型的“块”设备,操作系统读取硬盘数据的时候,其实是不会⼀个个扇区地读取,这样
效率太低,⽽是⼀次性连续读取多个扇区,即⼀次性读取⼀个”块”(block)。
硬盘的每个分区是被划分为⼀个个的”块”。⼀个”块”的⼤⼩是由格式化的时候确定的,并且不可
以更改,最常⻅的是4KB,即连续⼋个扇区组成⼀个 ”块”。”块”是⽂件存取的最⼩单位。

为什么OS不直接用扇区来访问磁盘呢? 512 而是4KB呢

1. 提高效率

2. 软硬件解耦

2.分区与分组

800GB太大了就和中国太大了,一个中央管理不过来!!所以需要分区

只要管好一个分区,其他分区就能管好!!!

同时中国有一个省,感觉省也有点大就分成了很多市

这里就有分组

一个文件=内容+属性  Linux系统中 文件内容和文件属性是分开存储的

文件的属性是数据吗???是数据 也要存!!

一个组里面,应该包含啥内容呢???

写入管理信息的过程就叫做写入文件系统 ----> 格式化

给每个组都这样写上管理信息 就叫做格式化的过程 这一批管理信息统称为文件系统!!!

会定义一个inode结构体去管理文件的属性!!!

注意:文件名不属于文件inode属性!!!!

理论上,一个文件一个inode!! 里面还有一个inode_number 编号

同样啊inodeTable中也是4KB一个块 也都是这种一个个块,一个块4KB/128B 能存这么多文件

inode 是固定的128B 固定的数字吗?? 是的 是固定的

那我们拿到inode属性怎么找到内容呢????

inode里面有个映射表可以找到数据!!

结论:在一个分组里面,找到文件的inode number -> inode 然后就能找到映射表就能找到datablock

左面圈出的就是inode编号!!!

inode Bitmap也是这样去管理inode Table

GDT呢就是,描述块组属性信息,整个分区分成多个块组就对应有多少个块组描述符。每个块组描
述符存储⼀个块组的描述信息,如在这个块组中从哪⾥开始是inode Table,从哪⾥开始是Data
Blocks,空闲的inode和数据块还有多少个等等。块组描述符在每个块组的开头都有⼀份拷⻉。

Super Block存放⽂件系统本⾝的结构信息,描述整个分区的⽂件系统信息。记录的信息主要有:bolck 和 inode的总量,未使⽤的block和inode的数量,⼀个block和inode的⼤⼩,最近⼀次挂载的时间,最近⼀次写⼊数据的时间,最近⼀次检验磁盘的时间等其他⽂件系统的相关信息。Super Block的信息被破坏,可以说整个⽂件系统结构就被破坏了

3. 如何理解 创建删除修改查找文件??

创建

把inode bitmap载入内存 在内存中查找!!

从inode bitmap去查看位图 去索引 inode table 这样inode就有了 就是属性就有了!!!

去block bitmap去查看位图 然后去查找数据块 得到块号,去data blocks中写入 然后更新inode table !!!这样就创建了一个文件

删除

知道了inode 然后去查找inode table中的属性 然后知道他所在的数据块的块号

这样去修改 block bitmap和inode bitmap将1修改为0 这样就删掉了

修改

还是去inode table找到属性 去拿到数据块号 将数据块载入这个文件的文件缓冲区中,通过文件描述符 我们在语言层 改完之后 然后刷新到磁盘中。

那我们一直用的是文件名,文件名不在inode内部保存!!

那如何理解目录呢???linux一切接文件 目录是文件 文件就有inode

目录里存的是,文件名和这个文件inode的映射表!!

重谈inode 编号和块号

inode编号和块号是整个分区有效!!分区唯一!!

在一个 分区内部,一个文件系统内部,有多少inode,有多少数据块都是固定的!!

如果我要访问当前文件内容或者属性,首先要做的就是打开当前目录,访问当前目录的数据块!!那就需要拿到当前目录的inode!

路径解析

我找到了lesson14的inode 那我是不是要找到code这个目录才能拿到lesson14的inode  因为lesson14是在code里面的!!!在code数据块中找到lesson14和他的inode!!!就这样递归需要找到根目录!!就必须把沿路所有的目录都要打开 递归需要一个出口所以根目录是固定的!!

当我们要访问任何文件的时候,Linux内核都要为我们做路径解析!!所以访问文件必须要有路径

对于用户访问过的路径,linux会做路径缓存的!!

linux中,在内核维护树状路径结构的内核结构体 struct dentry

上述构建起来的树就是路径缓存 

我们访问的时候都是只看文件名!!!

哪还有一个问题,我们访问的时候路径谁给????

1. 进程有CWD --> 父进程bash --> 系统和环境变量 进程提供路径!!

2. 我们open文件,我们提供的路径!!

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐