Linux文件系统-从“物理盘片”到“逻辑结构”:文件系统如何为硬盘注入灵魂?

🔥海棠蚀omo:个人主页
❄️个人专栏:《初识数据结构》,《C++:从入门到实践》,《Linux:从零基础到实践》
✨追光的人,终会光芒万丈
博主简介:
目录
一.理解硬盘
1.1硬盘的物理结构
1.2磁盘的存储结构
1.2.1如何在一块磁盘中定位一个扇区?
1.3磁盘的逻辑结构
1.3.1理解过程
1.3.2真实过程
1.4CHS && LBA地址
二.引入文件系统
2.1引入" 块概念 "
2.2引入" 分区 "的概念
从最初讲解文件到现在,我们谈论的都是已经打开的文件,而我们今天就要谈论文件的另一种状态:未打开的文件!!!
我们在最初提到文件时,说到文件分为打开的文件和未打开的文件,而未打开的文件我们当时说它们在硬盘中,那么既然我们要讲解未打开的文件,就有必要先了解一下硬盘的相关知识,这样我们才能更好的去理解何为文件系统。
一.理解硬盘
1.1硬盘的物理结构
我们通过上图来观察硬盘的基本结构,硬盘中大概就分为上图的五部分:主轴,磁盘,磁头,磁头臂,永磁铁,我们后面的重点主要聚焦于磁盘和磁头,剩下的我们了解一下即可,主要是它们也没什么可讲的。
对于主轴而言,我们可以看到后面跟了马达二字,所以它是会旋转的,并且会带动磁盘一块旋转,不同的磁盘旋转速度也是不一样的,一般的可能就7200转,好一点能达到10000转,甚至12000转。
而磁盘后面写的是相当于纸,什么意思呢?
也就是我们未打开文件的属性和数据都保存在盘面上,并且磁盘不是只有一面,它是有两面的,两面都是有数据的。
而磁头,它后面写的是相当于笔,笔和纸的关系我们想必都清楚,所以操作系统要访问磁盘中的数据就要借助磁头,这个磁头是能够左右摆动的,就是为了能够找到相应的数据。
但磁头并不会与盘面直接接触,而是停留在它上方一段距离。
而磁头就被固定在磁头臂上,而磁头臂又在永磁铁上,这两个就没什么介绍的了,就是硬盘中的两种硬件。
1.2磁盘的存储结构
我们的重点还是磁盘和磁头,那么下面我们来具体看一下磁盘的平面结构:

上图就是将磁盘的平面结构中含有的内容给画了出来。
我们先看第一幅图:在整个盘面上,有着很多的同心圆,这些同心圆叫做磁道,我们感觉整个盘面是光滑的,但其实上面有很多的磁道,我们文件的数据就保存在这些磁道上,而我们也可以看到磁道与磁道之间有空白的部分,这些空白的部分是不存储数据的。
再看第二幅图:这是把每个磁道给具体画了出来,我们也可以看到磁道也并不是一个完整的圆,它中间也是有间隙的,这些间隙间的就空白部分和上面一样是不存储数据的,而剩下的一个个小片段我们称为扇区,也就是与其说数据保存在磁道上,不如说数据都保存在这一个个的扇区中。
扇区是磁盘存储数据的基本单位,大小一般为512个字节!!!
但磁道和扇区其实都是有宽度的,不是像我们上图所展示的那么细,我们来看下面的图:

将磁道和扇区都画粗我们看的就更直观了,扇区之所以叫做扇区,就是因为它的形状很像一把展开的扇子。
那么我问大家一个问题:一个盘面中的每个磁道的扇区数一样吗?
想必大家可能都会认为数量是不一样的,其实这个答案是不严谨的,对于大部分的磁盘来说,每个磁道的扇区数是一样的,也就是每个磁道中扇区间的疏密程度不同,当然现在随着科技的进步,也确实出现了每个磁道的扇区数不同,更外围磁道的扇区数会更多的磁盘。
但其实一个磁盘中并不只有一个盘面,而是有多个盘面的:


上面就显示了磁盘中的立体结构,在磁盘中一般是由多个盘面的,同时也就会有多个磁头,磁头和盘面是一对一的关系,一个面一个磁头。
并且这些磁头是共进退的,什么意思呢?
意思就是一个磁头停留在了盘面的某个位置上面,那么剩下的所有磁头都会停留在同样的位置。
至于为什么要这样设计,我用一句话来概括:为了在成本、复杂度和可靠性之间取得最佳平衡。我们不必深究这句话什么意思,这都是前人经过实践才设计成这样的。
注意:共进退并不意味着同时工作!!!
虽然所有磁头都在同一位置,但并不意味着它们要同时工作,该谁工作谁工作,不要弄混了。
而从上面我们也看到了,盘片和盘面都是从0开始计数的,但是扇区却是从1开始计数的,这点在后面是有用的。
而有了这样的立体结构就要引出柱面这个知识点,那什么叫做柱面呢?
我们看上图,所有盘面的相同位置的磁道,或者说相同半径的磁道,是不是可以构成一个虚拟的圆柱体?
而这个圆柱体的侧面不正是所有相同半径的磁道组成的吗?柱面其实就是磁道,我们要把所有相同半径的磁道看作一个整体。
至于柱面有什么用呢?我们下面讲到的时候就知道了。
1.2.1如何在一块磁盘中定位一个扇区?
下面我们就来思考一下如何定位一个扇区的问题,我们在上面介绍磁头时说了磁头可以左右摆动来找到我们要访问的数据,也就是找到一个扇区:

也就是如上图所示,而磁头左右摆动的本质就是定位哪一个磁道,但是通过左右摆动我们只能找到一个磁道,那要如何定位一个扇区呢?
这就是盘片旋转的本质了,盘片旋转的本质就是在确定了哪一个磁道的前提下,定位该磁道的某一个扇区。
磁头刚移到某个磁道上的时候不一定就能找到我们想要找的扇区,但是很快盘面就会将我们要找的扇区给转过来 。
而通过上面的操作我们就能精准找到每一个扇区,我们把上面的操作给总结下来:
1.3磁盘的逻辑结构
1.3.1理解过程
我们上面讲了扇区和磁道在盘面上,那我们来思考一个问题:在硬件方面,扇区和磁道在盘面上,那在逻辑方面,磁盘是具体是如何规划扇区和磁道的呢?
要解决这个问题我们先来看点别的:

我们小时候应该都见过上面的东西,这东西加什么呢?
没错,就是磁带,磁带在盒子中是一圈一圈缠在里面的两个齿轮上的,用的时候两个齿轮会转动,那么这个磁带我们上面要讲的内容有什么关系呢?
我们想象一下:一圈一圈缠在齿轮上的磁带是否很像我们上面的各个磁道?
一圈就是一个磁道嘛,那想必我们小时候应该都干过将里面的磁带给拽出来的事吧,我就这样干过,拽出来的磁带就是一个长条,那我们如果把一个盘面上的磁道给" 拽 "出来,是不是一个盘面上的磁道就可以看成是线性结构了呢?

而这个盘面上的扇区和磁道我们是不是就可以看成这样呢?

那进一步一个盘面我们不就可以将其看成一个一维数组吗?那我们定位扇区的过程不就是遍历一个数组吗?
这样每个扇区不就有了一个线性地址,也就是数组下标嘛,我们通过数组下标就可以很快的定位一个扇区了,那这个线性地址或者说数组下标叫什么呢?
叫做LBA(Logic Block Address),通过LBA地址我们就可以定位任意一个扇区,但是磁盘并不能看懂LBA,它只能看懂CHS,所以我们要做的就是完成LBA和CHS的转化,那要怎么做呢?
很简单,举个例子:现在一个盘面有10个磁道,而一个磁道中有10个扇区,也就是一个盘面就是100个扇区,现在给你一个LBA地址为123,让你得出CHS的数据。我们来看:

既然是数组下标,那我们就可以通过简单的数学计算来得到相应的CHS,对上面的例子而言我们要找的扇区不就是在1号盘面,2号磁带,3号扇区的位置吗?
既然LBA可以转化为CHS,那么CHS当然也可以转化为LBA,将上面的计算反过来就可以了。
也就是对于LBA和CHS而言,它们之间是可以相互转化的!!!

而有了LBA后,我们再次看上面的小黑盒比喻,就可以将CHS换成LBA地址了。
1.3.2真实过程
但是上面的过程并不是真实的磁盘中规划扇区和磁道的过程,上面我们是以一面为单位进行展开的,但实际上磁盘真实的展开并不是以物理盘面展开的,上面的介绍是为了让我们可以将磁盘的结构看成一个数组,事实上磁盘的展开是以柱面为单位展开的!!!

以柱面为单位展开是什么意思呢?
有了上面的理解过程的认识,我们可以把一个磁道也堪称一个小的一维数组,也就是:

而柱面是由磁道构成的,那么我们把一个柱面展开来看:


那么一个柱面展开后不就是一个二维数组吗?
但是根据半径的不同一个磁盘有多个柱面,我们不就可以这样看待一个磁盘一个磁盘的展开:

此时的磁盘,我们不就可以看成是一个三维数组了嘛,数组的第一个下标代表的就是柱面(磁道),第二个下标就表示磁头(选择哪一个磁道),第三个下标就表示扇区。
并且对应的CHS的顺序也是一样的,这就是为什么我们在上面写CHS地址定位的时候第一步的定位磁道要写成柱面,并且我们为什么要介绍柱面的原因。
虽然上面的理解过程只是让我们能够把磁盘看作成数组,但是我们来思考一个问题:我们可以把三维数组看成一个" 一维数组 "吗?
当然可以,而将三维数组看成一维数组的方式就是这样:

我们把不同的柱面拼接在一起不就行了吗?
按照上面的方式我们就可以将一个三维数组看作是一维数组,三维数组我们可能不太熟悉,但是一维数组我们可太熟悉了,所以我们今天就可以认为磁盘就是一个以扇区为单位的一维数组!!!
既然是一维数组,那么操作系统就不需要传CHS地址给磁盘,只需要传LBA地址即可,那么将LBA地址转化成CHS地址的工作由谁来做呢?
答案由磁盘自己来做,具体来说是由磁盘中的硬件电路,伺服系统等来完成这个工作。
1.4CHS && LBA地址
最后我们来总结一下CHS和LBA两种地址之间的转化方式,这里注意和上面的认识过程的转化区分开来,上面的认识过程并不是真实过程,这里我们是按照真实过程来进行转化的!!!
二.引入文件系统
2.1引入" 块概念 "

2.2引入" 分区 "的概念
但是只是分成" 块 "的话,还是太多了,就比如:你的硬盘有800GB,这对于现在我们的电脑来说并不算很多,一般都是1T甚至更多,我们来计算一下这800GB有多少个块:

上面计算的是800GB总共是多少字节,下面我们来计算一下有多少个块:

上面就是800GB的硬盘含有的块的数目,只是800GB都有2亿多个块,这么多块还是不太好管理,所以磁盘又引入了分区的概念,什么意思呢?我们下面来看:

我们可以将这800GB分为不同的区,就和我们windows电脑上的C盘,D盘,E盘等是一样的道理,我们将磁盘划分成不同的区后,就可以由管理好每一个块转为管理好每一个区,区的个数相比块的数目就少了很多,我们能管理好一个区就能管理好其他的区。

结构就如上图所示,每个区中都有不同数量的块,而我们就可以通过起始块的地址和终止块的地址来确定一个区的范围:

以上就是从“物理盘片”到“逻辑结构”:文件系统如何为硬盘注入灵魂?的全部内容。
