【LINUX】再聊文件系统

一、前言

大家好久不见,上次我们主要聊了一下加载到内存中的文件如何理解,包括系统调用以及OS如何去管理这些文件,接下来我们学习一下在磁盘中的文件系统,借此来构建一个对文件系统相对完整的理解。

我们知道,如果要打开文件,需要将文件加载到内存中来,这样操作系统才能建立起对应的数据结构来管理起来这个文件,但我们大部分文件在不使用的时候都在磁盘内存着,那么,如何定位一个文件呢?找到这个文件又如何读取和写入呢?

带着这样的问题,我们需要先来了解一下磁盘的基本知识。

二、磁盘

磁盘是我们计算机上唯一一个机械设备,同时它还是外部设备,因此相对于CPU来讲,磁盘的读写速度是非常慢的

磁盘的物理结构

磁盘盘片:一个磁盘有多个盘片,每个盘片都有两面。
磁头:盘片的每一个面都有一个磁头,磁头是共进退的,且磁头和盘面没有挨着,但距离非常近,对数据写入和读取即更改磁盘每个面上基本元素的南北极、读取南北极
主轴和马达:负责磁盘高速转动和读写,正因为这两个组件,磁盘是一个机械设备。

在这里插入图片描述

磁盘的具体物理存储结构

在这里插入图片描述

如图,我将磁头和磁盘抽象为左图,将每一个盘面抽象为右边,结合此图,我们在硬件角度上来尝试理解一次文件的读和写。

对于一个普通的文件来说,不管是属性还是数据,本质都是0、1而已,无非就是需要占用1个或者多个扇区,进行数据存储。

扇区:磁盘中的基本存储单元,一般是512字节或4kb,一般的磁盘,所有扇区都是512字节。
磁道:同半径的所有扇区组成了磁道。

既然扇区是磁盘中的基本存储单元,那我们如何定位一个扇区呢?
1.首先定位一个磁头,因为我们的磁头都是有编号的,借助这个编号便能找到是哪一个盘面
2.再定位一个磁道,根据半径,能够定位一个磁道。
3.最后在该磁道根据扇区的编号就能定位一个扇区。

像这样通过磁头、磁道、扇区来定位任意一个扇区的方法被称为CHS定位法(head、cylinder、sector)。

只要像这样定位了一个扇区,我们就可以通过同样的方法继续定位任意多个扇区,从而将文件从硬件角度进行读写操作。

抽象磁盘存储结构

通过以上对硬件的理解,我们知道,如果让操作系统拿到CHS地址,就可以访问任意一个扇区,但事实上OS并不直接使用CHS地址,为什么呢?
1.OS是软件,磁盘是硬件,OS如果使用了这个地址,如果硬件更换后,OS也要跟着变化,OS必须与硬件解耦!
2.???扇区512字节,单位IO的基本数据量也是很小的,而OS实际进行IOS的时候,基本单位是4KB(可以调整)磁盘是块设备,所以OS需要有一套新的地址来进行块级别的访问。

如图:
在这里插入图片描述
每一个盘面我们都以磁道为单位抽象成一个连续的空间(数组),初步完成从物理逻辑到线程逻辑的过程,OS是以4kb为单位进行IO的,因此,一个OS级别的文件块要包括8个扇区,在OS角度它管理的是文件块,所以OS并不关心扇区。

计算机常规访问方式:起始地址+偏移量 因此我们只要知道数据块的起始地址(第一个扇区的下标地址) + 4kb 类似于C语言的指针,这样我们有了数组下标N,就可以定位任何一个块了。

因此OS就拿着这个下标N也就是LBA(逻辑块地址)定位任意一个块,但磁盘只认识CHS,因此LBA还会通过简单的数学运算转化为CHS再去磁盘内读写。

三、文件系统

分区分组

有了上面的认识后,我们就能够理解:OS要管理磁盘,就是把磁盘当成一个大数组,对磁盘的管理,就转换成了对这个数组的管理,我们进而继续分区分组,只要管理好一个组,其他地方也是同样的道理。
在这里插入图片描述

SuperBlock:
文件系统的所有属性信息,1.文件系统的类型2.整个分组情况
因此SuperBlock是每个组都有一份的,且会保持同步更新,这样是为了保证某一个组的SuperBlock的信息丢失,不至于导致数据丢失。多重备份的机制。

GroupDescriptor
GDT,组描述符,该组内的详细统计等属性信息。

BlockBitmap: 每一个bit表示data block是否空闲可用

inodeBitmap: 每一个bit表示一个inode是否空闲可用

inodeTable:
一般而言,一个文件所有属性的集合,都存放在一个inode节点(128字节)里,即便是一个分区,内部也会存在大量的文件即会有大量的inode节点,一个group,需要有一个区域,专门保存该group的所有inode节点,这个地方就是inodeTable。

在inode Table内部,会存在很多个inode,需要将他们区分开,因此每一个inode都有自己的inode编号,inode编号,也属于对应文件的属性id,除此之外,inode结构体里还会有一个数组,来记录此文件内容写在了哪些data block上。

Data blocks:
OS以块来存储数据,其中的块就是指datablock,要保存内润,就意味着要用1~N个数据块,文件越大,用到的数据块就越多,在分组中,占用空间最多的就是Data blocks。

inode和文件名

linux系统只认识inode编号,文件的inode属性中,并不存在文件名,文件名,是给用户用的,那如何理解我们使用命令cat log.txt的时候并没有使用inode编号但依然能找到这个文件的相关信息,任何一个文件一定在一个目录内,目录也是一个文件,有对应的inode,目录的内容也需要保存在数据块里,那目录的数据块里保存的是什呢? 保存的是该目录下文件名与inode编号对应的映射关系,而且,在目录内,文件名和inode互为key值。

重新理解cat log.txt
1、当我们访问一个文件的时候路,我们是在特定的目录下进行访问的。
2、先在当前的目录下找到log.txt的inode编号
3、一个目录也是一个文件,也一定隶属于一个分区,结合inode编号,在该分区中找到对应分组,在该分组的inode Table中,找到文件的inode结构体。
4、通过inode和对应的datablock的映射关系,找到该文件的数据块,并加载到OS,并完成显示到显示器

理解文件的增删改

一、创建一个文件:
1.先在inode bitmap里找到一个空闲的inode节点,得到一个空闲的inode节点以及inode编号
2.把文件创建的默认属性填充到对应的inode Table中
3、找到目录文件,将文件名与inode number建立映射关系

二、写入文件内容或更改文件内容
1、通过文件名找到对应的inode number
2、拿这个inode number 找到对应的inode节点,申请需要使用的数据块
3、将block bitmap申请的数据块对应的位置为1
4、将申请块的编号填入inode节点对应的数组里
5、将想要写的数据刷新到data blocks里面

三、删除一个文件:
1.根据文件名的映射关系找到inode number
2.inode number-inode属性中的映射关系,设置block bitmap中对应比特位为0
3.inode number-inode属性中的映射关系,设置inode bitmap中对应比特位为0

理解了这个过程,我们就能明白为什么文件写入的过程非常满,但删除非常快的原因了

细节补充

一、如果误删了文件,能不能恢复?
通过上面学习,我们知道删除一个文件,实际上是将对应位图置为了0,data block的数据没有被真正清除,
只要我们知道被删除文件的inode编号,拿着这个inode number去寻找inode节点,利用其中的映射关系就可以恢复文件。
inode number如何确定分组?—inode number只在一个分区内有效,不能跨分区。
在这里插入图片描述
二、分区分组、填写系统属性是谁干的?什么时候干的?

OS在分区完成之后,要让分区能够被正常使用,需要对分区做格式化,格式化的过程,其实是操作系统向分区写入文件系统的管理属性信息。

三、 如果只用数组建立映射关系与Block data如果不够用怎么办?
可以使用二级索引的方式解决,即数组下标指向的数据库里存储的不是数据,而是其他数据块的编号,即一棵二层多叉树,同样的道理可以有三级索引。

软硬链接

软链接

软链接实际上是一个新的文件,它有点像windows下的快捷方式。
语法规则:

# 建立
ln -s [要建立软链接的文件] [软链接的名字]
# 消除 
unlink [要解除软链接的名字]

注意:千万不要使用 rm 来删除软链接!!!

在这里插入图片描述

硬链接

硬链接与c++中引用的作用非常相似,即相当于给一个非目录文件起来一个别名,语法如下

ln [要链接的文件] [硬链接的名字]

在这里插入图片描述
如图,两者的inode完全相同,硬链接的本质只是多建立一层文件名和inode number的映射关系而已。硬链接本质是在inode结构体中增加了一次引用计数,所以即便你把原文件删除,新的硬链接也不会消失

在这里插入图片描述
软连接有相当于快捷方式,那硬链接有什么用途呢?
运行ll -i,发现新建的目录first有两个硬链接,说明除了本身外还有一个硬链接
在这里插入图片描述
我们记住first的inode=1706547,进入目录,查看运行ll -ai命令:
在这里插入图片描述

原来,当前目录 < . > 是当前目录的一个硬链接,如果我们在first目录里再建立一个目录,就会有三个硬链接,这是因为 < … > 会变成上级目录的一个硬链接。

四、结语

那么今天的内容就分享到这里了,如果感到有所收获,请给我一个三连支持,谢谢大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝色学者i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值