【Linux】文件系统
时间:2024-04-30 09:35:36 来源:网络cs 作者:峨乐 栏目:防关联工具 阅读:
送给大家一句话:
你的任务,就是珍惜你自己的人生,而且还要比之前任何时候更加珍惜。
– 东野圭吾
文件系统
1 前言2 物理磁盘3 磁盘的存储结构4 抽象理解磁盘储存5 引入文件系统 (如何管理磁盘文件)5.1 了解文件系统5.2 细节处理如何存储文件如何寻找指定文件 Thanks♪(・ω・)ノ谢谢阅读!!!下一篇文章见!!!
1 前言
之前我们学习了
操作系统中文件操作的系统调用接口了解了文件描述符重定向的使用与底层原理了解什么是缓冲区但是这些都是文件被进程打开后才有的操作,那么其余文件呢???在我们的系统中有非常多的文件(一切皆文件),被打开的文件只是一小部分。没有被打开的文件实际上是在磁盘上储存的,也就是磁盘文件。
在打开文件之前,我们需要找到文件 -> 就要从磁盘中找到对应文件 -> 通过文件路径与文件名。
今天我们来了解如何管理磁盘文件 — 文件系统。
2 物理磁盘
我们首先来了解物理磁盘是什么样子的:
通常由金属外壳、控制电路板和接口组成。硬盘内部有盘片、磁头和悬臂等部件,用于存储和读取数据。盘片表面涂有磁性介质,数据以磁道和扇区的形式存储。硬盘通过磁头在盘片上读写数据,而磁头则由悬臂支撑和定位。
简约来说,物理磁盘是计算机中用于存储数据的实体设备,具有特定的结构和外观。
因为计算机只认识二进制,我们就需要一个结构可以通过记录二进制信息来储存文件。物理磁盘就是这样一个结构。
磁盘的碟片两面都可以进行存储,一个磁盘中有多个碟片(碟片越多,容量越大),读取写入的结构是磁头(悬浮在碟片上),每面都会有一个磁头来读写数据。磁盘中央是一个马达,使其可以旋转来使磁头读取到信息。
3 磁盘的存储结构
磁盘是一个机械结构,读写速率较慢。所以我们尽量减少读取次数,让其定期刷新,并让其一次可以读写入较多数据(缓冲区的作用)
磁盘上可以理解为是无数个磁铁(可以通过位置方向表示二进制信息)。我们来认识几个概念
那么我们如何找到指定位置的文件呢 —— CHS定址法
第一步确定在那一面(确定磁头 Header)第二步确定在哪个磁道(柱面Cylinder)第三步盘片选择,确定在哪个扇区 Sector文件 = 内容+属性
,也就都是数据,而数据是二进制储存的,所以文件在磁盘中储存可以理解为文件在磁盘中占有多少个扇区
4 抽象理解磁盘储存
虽然CHS定址法很直接,但是操作系统并不使用该方法,因为该方法耦合度太高。为了方便实现内核进行磁盘管理,需要进行抽象管理。
磁盘可以整体抽象为一个线性结构:把所有的扇区连接在一起,形成一个线性结构。也就是我们可以通过数组(储存扇区)来管理磁盘。那么如何进行准确的定位磁盘位置呢(假设一个面有10个磁道,1000个扇区)???
这样通过一个线性结构就可以管理磁盘。
文件就等于很多个扇区的下标
一般操作系统与磁盘交互时不这样一个一个下标来确认。基本单位可能是 4KB ,也就是一次读取多个扇区。
4KB 假如是8 个连续的扇区,我们称之为数据块。
那么文件就是多个块来构成的。操作系统通过块来读取数据,通过每个块的起始位置就能确定块中的扇区的CHS(只要知道一个起始,和磁盘总大小,有多少块,每个块的编号,如何转换到CHS,就都知道了),称之为:LBA(逻辑区块地址)
5 引入文件系统 (如何管理磁盘文件)
5.1 了解文件系统
有了上面的线性大地址,我们就可以开始构建出文件系统了。
磁盘每个分区的容量是很大的(比如我们电脑的C盘 D盘 E盘),要直接管理好这个大空间是有点困难的,所以操作系统对磁盘分区进行一个分组,只要管理好这个分组就能管理好这个分区(分治思想!!!)。
首先:文件 = 文件内容 + 文件属性
。文件在磁盘中存储,本质是储存文件的内容与文件的属性数据。在每个分区内部分组,然后写入文件系统的管理数据,称之为格式化!!!
Linux 文件系统特定: 文件属性 与 文件内容 分开存储。接下来我们来研究文件系统:
每个组里有这些部分:
Linux中文件的属性是大小固定的集合体(一般固定128字节) 不包含文件名,但是都有inode_number,通过inode号来标识一个文件。
struct inode{int size;mode_t mode;int creater;int time;...int inode_number;... int datablocks[N]}
其中的datablocks[N]用来储存使用了哪些数据块(通过块号来储存)。但是N一般是15,想要储存一个大文件是怎样储存的呢?
GDT(Group Descriptor Table):块组描述符,描述块组属性信息:块多大,有多少个Datablock,使用了多少个… 其本质是管理字块的部分
超级块(Super Block):存放文件系统(分区)本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了,超级块不是每个分区都有的,但是超级块也会有多个,内容也保持一致,防止数据丢失,提高系统健壮性。
块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。通过010101的比特位来记录信息。
inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。通过010101这样的比特位表示是否可用。
数据区:存放文件内容
5.2 细节处理
如何存储文件
我们找寻文件时,必须先得到文件的inode号。在我们的GDT中会记录下该组的inode编号的范围(start 与 end ),通过文件inode就可以确定其所属分区。 datablock 也是如此!!! 也有对应块号。这样就能找到文件的内容。
inode 表中的datablock[N]通常只有15容量,那是怎样储存大文件的呢?其实这里就比较类似指针数组了,一般【0 , 11】直接映射数据块,【12 , 15】 指向的数据块,这个数据块里面也类似一个datablock[N],来指向其他数据块!(存在一级映射,二级映射,三极映射。并且可以跨组访问,但是强烈不推荐这样,因为硬件的限制会导致访问较慢)
上述的寻找过程是以inode为索引搜索 ,为什么要不使用文件名呢???
这是因为目录本质也是一个文件,是文件就会有内容与属性。那目录的内容是什么呢?目录内容就是文件名与其inoded 映射关系。
这也可以解释一下我们平时的应用:
如何寻找指定文件
要找到指定文件 -> 首先要找到所在目录 ->找到文件的inode编号 -> 打开文件
找到所在目录的过程与找指定文件过程一样,因为目录本质也是文件 !就这样进行逆向的路径解析。
而Linux系统会进行路径的缓存,来方便我们的寻找工作。
我们一般使用的云服务器会有一个虚拟磁盘vda
,系统中会有许多分区。我们访问一个分区会对我们使用的分区进行挂载,挂载实质是将一个磁盘分区与目录进行关联,这样就可以在该分区进行文件操作。
Thanks♪(・ω・)ノ谢谢阅读!!!
下一篇文章见!!!
本文链接:https://www.kjpai.cn/news/2024-04-30/163665.html,文章来源:网络cs,作者:峨乐,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!