Linux操作系统之文件(四):文件系统(上)
前言:
我们前几篇文章讲了缓冲区与重定向的有关概念,这些设计是linux系统的核心机制,对系统性能、资源管理和用户操作灵活性有重要意义。
不涉及一些硬件就不可能让大家清楚地去理解文件系统,所以这篇文章,我将会从计算机组成原理的角度,为大家讲解一下文件系统的构成。
文件被打开了,是存储到内存里的。那么文件没有被打开呢?存储到哪里?
自然是磁盘里。
我们访问一个文件的前提是不是要打开它?那我们访问文件的前提是要找到它,也就是说我们要有对应的路径。
但那么多文件,不只是你一个文件有路径,所有文件都要有路径。众多路径需要被管理起来,所以就出现了文件系统的概念:
磁盘级文件系统与内存级文件系统。
如同我们去取快递一样,快递就好比一个一个的文件,放在菜鸟驿站的快递柜上,我们需要根据快递的编号,找到对应的存放位置,最后取回到我们的宿舍(内存中)。
文件系统又是如何把未打开的文件,在磁盘上管理起来的呢?
我们又如何去理解路径呢?
别着急,我将为大家一一解答。
一、磁盘
像这些机械磁盘,是计算机中唯一一个机械设备。图左是一个机械硬盘,图右是机械硬盘拆开后的样子。
图示为一个服务器,里面嵌入了许多个磁盘,而服务器是计算资源的载体,安装在机柜内 :
图为一个一个的机柜,机房就是存储这些机柜的地方。
不同于我们的其他存储设备,机械磁盘的好处就是容量大,便宜。但它的读取速度就比较慢。
公司里有大量平时用不到的数据,你不可能用其他昂贵的设备来进行存储,自然需要用到机房。
而磁盘是怎么进行存储数据的呢?
我们知道,磁铁是有着南极与北极的,同样的,二进制划分为0,1.
所以,我们就规定南极与北极各自代表0或1。这样,就方便了我们进行二进制数据的存储。
所以我们如何销毁一个磁盘呢?
自然就是对该磁盘进行消磁处理。
一个磁盘的结构如下图所示:
我们的机械臂杆上有着多个读写磁头,分别近距离挨着每个盘片的上下两个面。比如上图我们就有着6个读写磁头,以及6个面,二者的数量是相同的。如果我们在读写一个磁头,实际上就是在读写一个磁面。注意,磁头与磁盘之间并没有实际接触,就像是一架飞机贴地1m处飞行一样。
每个面上,存在着包围着中心的,不同大小的环道,我们称之为磁道,而每个磁道上,我们划分了一定区域,每个区域叫做扇区。
有个疑问,我们这上面有不同的扇区,他们的长短是不一样,那么存储大小呢?
在早期的磁盘中,是一样的,但现在的技术已经能做到同质度的存储数据了,也就是说扇区越大,存储的数据越多。
扇区,是磁盘存储数据的基本单位,通常,一个扇区的大小为512字节。
如果我想修改一个扇区的一个比特位,也要把512字节全部读取到内存才行,所以我们称磁盘为快设备。
那我们如何定位一个扇区呢?
以上3步,被我们称为CHS地址定位法。(但现在大部分已经淘汰了,我们讲这个只是为了帮助大家理解)

我们可以通过以上的命令查看我们云服务器的磁盘分区
这是一个 50GB的虚拟磁盘(GPT分区表),包含:
-
1MB的BIOS引导分区(兼容传统启动)。
-
50GB的Linux主分区(实际可用空间)。
二、磁带
我们以前也有磁带这种存储设备。
磁带上⾯可以存储数据,我们可以把磁带“拉直”,形成线性的结构:
这样每⼀个扇区,就有了⼀个线性地址(其实就是数组下标),这种地址叫做LBA地址定位法。
由于我们前面说到,传动臂上的磁头是共进退的。
所以,我们可以把每个盘面上,相同半径大小的磁道,组成一个柱面
所以,磁盘物理上分了很多⾯,但是在我们看来,逻辑上,磁盘整体是由“柱⾯”卷起来的。
因此,把一个磁道展开,我们可以看做是一个一维数组,随后一个柱面上有多个磁道,我们可以看做柱面为二维的扇区数组。多个柱面盘旋起来形成磁盘,所以磁盘可以看作是扇区的三维数组

三、块
如果我们进行IO操作,是以扇区512字节为单位,未免就太少了。
所以我们可以把一定数量的扇区,划分为一个块。一个块的数据大小为4kb,也就是八个扇区。
而这些块,我们也可以进行编号,比如说,块1,块2,块3.
所以磁盘就划分为了以块为单位的一维数组。
假如我们磁盘中有500GB的存储空间,我们应该如何进行管理呢?
答案是,我们会把这500GB的空间换划分为一个一个的的分区。
就像是大家电脑上的C盘,E盘,D盘。
从linux系统看,我的这个就划分为了2个区域。一个分区挂掉了不会影响其他分区,这一切都是为了磁盘的 灵活性、安全性、性能优化和兼容性。
这也体现了分治的思想。我们只需要管理好一个分区,随后把这个分区的管理方法复制到其他分区进行管理就行了。
那我们该如何管理好一个分区呢?
这里就要开始引入我们的文件系统的概念了。
四、EXT2文件系统
1、分区

Data blocks表示的是数据块区域,保存的是文件的内容。它里面划分为一块一块的块(block):
块是文件系统管理数据的最小单位,一个块的大小是4kb。 (我们要分辨清楚的是扇区是硬件层的最小单位,而块是文件系统的)
这里独立于分区外的是Boot Block,通常记录的是启动的相关设置。
而一个分区内通常会存储以上信息: Data blocks,inode Table ,inode Bitmap等。
2、inode
我们知道,一个文件=属性+数据
那么一个文件的属性信息,其实也是一种数据,我们把这个属性信息以结构体的方式构建出来。
这个结构体我们就把它叫做inode。(所以inode,是文件属性的集合)
通常来说,一个文件就对应着这一个inode。
一个inode的大小通常为128字节,当然也有256字节的情况,我们在这里不讨论256字节的inode。
操作系统与磁盘进行IO交互时基本单位是4KB(因为一个块的大小就是4kb),所以一个块就能包含4kb/128字节,也就是32个inode。
每个inode都有自己的编号:
我们在ls指令后面跟上-i选项就可以查看每个文件的inode的队友编号:
前面的920502就是inode编号,而每个文件直接的inode编号互不重复。
值得注意的是,在linux中,文件名这个属性并不保存在inode中。
inode table对应这个组里的所有文件属性集。如果我们有一万个文件,inode table中会要占用多少块呢?
:10000*128/4/1024个
既然文件的属性已经被保存起来了,那么文件的内容呢?
答案是保存在Data Blocks中,所以我们可以知道,在linux下,文件的属性与内容是分开存储的
在inode结构中,还有一个数组:int blocks[NUM],用于存储文件数据块的地址。这个数组直接决定了如何找到文件的实际内容,它里面保存的是该文件在Data blocks区域内容所使用的块号。
blocks[NUM]存储的是文件内容所在的 磁盘块号,通过这些号码可以在磁盘上定位文件的具体数据。
由于时间的原因,本篇文章就暂时写到这里,后面的内容,我会在下一篇文章中为大家详细介绍inode等信息。
结语:
文件系统上怎么知道一个一共有多少inode,还有多少inode没使用这些信息的呢?
下一篇文章再来谈文件系统的块号如何理解,inode的值是怎么来?为什么找文件只需要通过inode就行了这些内容。
本篇文章介绍了大量概念,希望同学们能够进行一定程度的记忆。
如果有任何疑问与指正,欢迎评论区或者私信留言!!