Linux —— 文件系统

一、前提

前面我们整理了关于进程和内存文件之间的关系,简单的了解了文件在被加载到内存后,OS做了哪些事情,并且认识了很多文件读写的系统接口以及底层的封装逻辑,还有对缓冲区的了解,这些都是内存中的文件,接下来这篇将整理和学习关于文件在磁盘中是如何存储的,理解了这一部分,我们也就简单的认识到了文件系统的底层设计等等

二、磁盘的物理结构

要理解文件在磁盘上是如何存储的,得先对磁盘的物理结构有个简单的认识

磁盘的内部图如上,中间有一摞子盘片,每一片都有两面,实际数据就是记录在这些盘片上的,我们可以认为任何文件和数据到计算机底层都是0和1的组合,而在磁盘上可以用N极和S极,或者带磁和无磁等等去表示0和1,这也是磁盘这个名字的由来,盘片的中间和边边有两个马达,分别控制着盘片中心轴旋转和距中心轴里外的延伸,按在外边缘马达上的那个玩意叫磁头,就是由这个磁头去对盘片进行读写

例如图中的盘片由三片,也就是六面,每一面都有一个磁头,这些磁头的运动都是共进退的,这两个马达的运动保证了磁头可以到盘片的任意一个位置

注意,盘片和磁头之间是有极小的距离的,而非直接接触,直接接触在盘片高速旋转下,会摩擦生热,热可能会导致消磁,从而丢失数据

简单了解一下关于磁盘的物理结构后,我们知道数据就根据某种策略,利用磁性被存放在各个盘片上,接下来进一步具体的学习盘片上相关的细节

首先先看图3,一个圆形的盘面我们可以将其等分成多个扇形,这些扇形称为扇面,然后以不同半径等距往内划分同心圆,就可以交汇得到一个个扇区,这些扇区一般就作为磁盘中存储的基本单元,通常是512字节或者是4kb字节,而同半径的所有扇区集合起来,就被称为磁道,从宏观来看,例如图一,也可以称之为柱面

扇区虽然从里到外的面积大小不一样,但实际大部分的磁盘设计,扇区内的数据大小都是一样的,通常为512字节

数据的读取基本单元是一个扇区,而我们确定一个扇区位置的方法,首先我们需要在哪一个柱面(cylinder)上,然后是确定哪一个磁头(head),最后再确定哪一个扇区(sector),这种定位任意扇区的方法叫CHS定位法

一个文件本质就是数据0和1的各种组合,所以无非就是占用着一个或多个扇区,我们可以通过CHS定位法定位到一个扇区,就可以定位到文件,从硬件的角度对文件进行读写

三、磁盘物理结构的逻辑抽象

上面我们简单了解了磁盘的物理结构,以及数据是如何读取和写入的,当然,都是些简单的基本认识,有了上面那部分的简单认识后,我们需要将物理结构进一步的抽象到操作系统的层面来理解,实际在对磁盘上数据进行各种读取和写入的操作,都是由操作系统去执行的,因此操作系统是需要定位到文件位置(扇区位置),但操作系统的定位方法和硬件物理结构中CHS定位法是不一样的

操作系统和磁盘需要做好解耦合,操作系统需要有自己的一套方案去应对文件如何定位的问题,这样将来就算是硬件迭代更新,可能采取的定位策略或者其他结构发生了改变,也不影响操作系统的定位思路

接下来是对磁盘的逻辑抽象,可以将一个盘面想象成一个磁带

这种磁带卷起来就是个圆,我们将磁盘的磁面就想象成卷起来后的磁带,现在将其拉直成一条线性的磁带

这就是初步完成了一个从物理逻辑到线程逻辑的抽象,此时我们就将磁盘的物理结构,可以认为就是线性的一大块数据空间,而这个空间的单位大小为4kb一小块,通过LBA方法可以定义到任意块的位置,也就能够找到任意文件。

计算机常规的访问方式是起始地址+偏移量的方式,因此我们只需要知道数据块的起始地址(第一个扇区的地址)+4kb,就可以划分每一块单位空间大小的地址,块的地址本质可以看作为一个数组的下标,我们可以用线性下标的方式定位到任意一个块,这就是LBA方法

至于如何从CHS和LBA之间来回转换,逻辑上就是根据有多少柱面,多少磁头,多少扇区去可以通过数学运算转换的,实际会多很多细节上的各种运算,但原理就是这样

四、文件系统

通过前面的铺垫,操作系统要管理磁盘,就是将磁盘看作一个巨大的数组,对磁盘的管理,也就可以视为对这个大数组的管理,而通常由于一个磁盘的大小非常大,往往我们对其进行分区,例如将一个500G的磁盘划分为几个100G的区,这就是我们常见的C盘,D盘,E盘的划分,每个区都有各自相同且独立的管理系统,而每个区又会往下分组,我们只要认识好一个组是如何管理的,也就知道了其他组是如何管理的

1.Block Group(块组)

ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相 同的结构组成

1.1 SuperBlock

存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量, 未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了,因此每个组的最开端都记录着一样的该信息,相当于做了很多很多的备份,并且都是同步更新数据。

1.2 Group Descriptor Table(GDT)

块组描述符,描述块组属性信息。

1.3 Block Bitmap(块位图)

Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用

1.4 inode Bitmap(inode 位图)

每个文件在磁盘中管理时,都有一个inode编号,它存放在inode类对象中,每个bit表示一个inode编号是否空闲可用。

1.5 inode Table(inode表格)

inode是一个类,成员里面包括着一个文件的各种文件属性信息,如文件大小,所有者,最近修改时间等,也包括着这个文件的唯一编号(inode)。

1.6 Data Block(数据区)

用于存放文件内容的一块空间,下标与Block Bitmap存在着映射关系

2.文件增删查改

2.1 创建文件

创建一个文件时,CUP会通过inode的位图找到未被使用的inode,为该文件去分配一个inode,并且创建对应的inode对象,在inode对象中会记录该文件的各种属性数据,并且为该文件分配数据块空间,在对文件写入时会分配数据块对文件内容进行存储,对应位置记录在inode对象中,并且将文件名添加到文件当前目录下,文件inode和文件名存在映射关系,这种映射关系信息记录在当前目录中

2.2 删除文件

删除文件则是对各种资源的释放,但实际并不需要对磁盘内容部分进行清空,只需要对文件内容部分对应的数据块位图进行修改,将已使用修改为未被使用,实际内容部分不修改,即可认为内容被删除,然后对inode位图也进行修改即可

2.3 修改文件

修改文件就是根据当前目录所记录的文件名和文件inode的映射关系,找到文件inode,从而找到文件inode对象,再根据inode对象中记录的数据块映射关系,就可以找到数据区中关于该文件的内容,即可对该内容进行读写修改

3.补充细节

3.1 如果文件被误删了怎么办?

文件被误删,由于cup对文件删除的操作只是对相应的数据块位图和inode位图进行修改,而对实际内容并不会修改,所以当重要文件被删除时,先停止对磁盘进行写入,想办法找到文件之前的inode,通过inode去找到对应的空间,并且恢复数据,实际操作需要下载一些专门恢复文件的软件,原理上,只有磁盘对应位置不被其他内容写入覆盖,数据是可以恢复的

3.2 inode在区内独立有效

每个文件的inode的在各自的分区内有效,在不同的分组里,各自的inode是独立的,每一个分区都是自己独立的一套文件系统,每个分组也是独立的一套相同的文件系统

3.3 分区和分组是谁做的,在什么时候完成?

文件系统的分区和分组是CUP在开机时,就根据SuperBlock内记录的分组和分区信息对文件进行分组和分区,格式化就是对分区进行写入文件系统的管理信息

3.4 inode中关于数据块的映射关系细节

一个数据块只有4kb左右的大小,而一个文件内容可能会非常大,如果单纯用一个数组下标去对应,则会需要相当多的空间,因此实际在建立映射关系时,存在一级索引、二级索引、三级索引,一级索引就是直接的下标映射关系,二级索引则是该索引指向一个数据块,在该数据块中记录的内容是文件内容对应的一级索引,同理,三级索引内指向的是二级索引,具体的优化策略根据cup去决定

3.5 有没有可能inode用完了但数据块还有很多,或者数据块用完,inode还有很多?

可能,前者是创建了大量的空文件,占据大量的inode,而实际数据块不怎么使用,后者是开了一个非常大的文件,导致数据块空间消耗完,实际开发中,遇到以上情况说明配置不够,一般不会那么极限

五、软硬链接

1.理解

1.1 软链接

软链接的本质就是新建立一个文件去指向被链接的文件,该文件内记录着被链接文件的路径信息,可以通过对软连接文件间接的对源文件进行各种操作。

链接方式:ln -s 源文件 软链接文件

例:

应用场景

一些路径比较复杂或者比较深的文件,我们可以通过软链接对其建立使用的快捷方式,类似于Windows下的桌面快捷方式

1.2 硬链接

硬链接的本质是在目录下建立文件名字和inode的新的映射关系,硬链接文件和源文件的inode是一样的,可以认为就是给源文件起别名,在ls查看时,第二列的数字表示的就是当前文件硬链接数

链接方式:ln 源文件 硬链接文件

例:

应用场景

目录也是文件,实际在Linux中

. 表示当前目录

.. 表示上级目录

本质就是硬链接的应用,在当前目录下创建一个新目录时,操作系统会对当前目录自动建立一个硬链接,并且该硬链接文件存放在新建目录中,新建目录本身也会建立一个硬链接,分别就是**.** 和**..**

总结

本篇整理总结了关于文件系统和软硬链接的相关知识点

相关推荐
叶北辰CHINA29 分钟前
nginx反向代理,负载均衡,HTTP配置简述(说人话)
linux·运维·nginx·http·云原生·https·负载均衡
不惑_1 小时前
在 Ubuntu 安装 Python3.7(没有弯路)
linux·运维·ubuntu
theo.wu2 小时前
使用Buildpacks构建Docker镜像
运维·docker·容器
玉树临风江流儿2 小时前
Linux驱动开发(速记版)--设备模型
linux·驱动开发
杰哥在此2 小时前
Python知识点:如何使用Multiprocessing进行并行任务管理
linux·开发语言·python·面试·编程
枫叶丹44 小时前
【在Linux世界中追寻伟大的One Piece】进程信号
linux·运维·服务器
刻词梨木5 小时前
ubuntu中挂载点内存不足,分配不合理后使用软链接的注意事项
linux·运维·ubuntu
灯火不休ᝰ5 小时前
[win7] win7系统的下载及在虚拟机中详细安装过程(附有下载文件)
linux·运维·服务器
数云界8 小时前
如何在 DAX 中计算多个周期的移动平均线
java·服务器·前端
powerfulzyh9 小时前
Ubuntu24.04远程开机
linux·ubuntu·远程工作