你管这叫文件系统?

2022-09-27 12:26:03 IT之家阅读量:13652   
imgad2

你手里有个硬盘,1T大小。

你还有一堆文件。

这些文件在硬盘视图中只是一堆二进制数据。

你准备把这些文件存储在硬盘上,需要的时候把它们读出来。

应该设计什么样的软件来更方便地读写硬盘中的这些文件。

首先我不想处理复杂的扇区,设备驱动等细节,所以我先实现了一个简单的功能,逻辑上把硬盘分成块,可以分块读写。

每个块定义为两个物理扇区的大小,即1024字节,也就是1KB。

硬盘太大,无法分析,我们假设你的硬盘只有1MB,这个硬盘有1024块。

好了,我们开始保存文件吧!

准备一份文件。

选任何一块放进去,第三块!

成功!第一次胜利!

再存一个文件!

呃发现问题了万一这个文件也保存在Block 3中,不是会覆盖原来的文件吗不,必须有一个地方记录现在哪些区块是可用的,就像这样

0:未使用

1:未使用

2:未使用

第3部分:已使用

第4块:未使用

...

块1023:未使用

让我们用block 0来记录所有block的使用情况!怎么录。

位图!

那么我们给block 0起个名字,叫block bitmap,然后这个block 0会用来记录所有块的使用情况,而不是存储具体的文件。

当我们保存一个新文件时,我们只需要在块位图中找到第一位0,然后我们就可以找到第一个未使用的块并保存文件同时,不要忘记在块位图中设置相应的位置1

完美!

接下来,让我们尝试读取刚才的文件。

呃还有一个问题我怎么才能找到刚才的文件根据街区号太蠢了这就好比你去书店找一本书,店员要求你提供书号而不是书名,这显然是不合理的

因此,我们给每个文件一个名字,叫做文件名,并通过它寻找这个文件。

必须有一个地方记录文件名和块号的对应关系,像这样。

向日葵收藏. txt: Block 3

数学期末复习资料。MP4:第五街区

低并发编程的秘密. pdf: Block 10

...

别急,既然要选择一个地方记录文件名,我们不妨多记录一些我们关心的信息,比如文件大小,文件创建时间,文件权限等。

自然,这些东西也要存在硬盘里我们选择一个固定大小的空间来表示这些信息多大空间请给我28字节

为什么是128字节我很乐意

我们称这种128字节的结构为inode。

之后我们每保存一个新文件,不仅要占用一个块来存储文件本身,还要占用一个inode来存储文件的元信息,这个inode的block number字段指向这个文件的块号。

如果一个索引节点是128字节,那么一个块可以容纳8个索引节点,我们可以对这些索引节点进行编号。

如果你觉得inode的数量不够,你也可以使用两个或者更多的块来存储inode信息,但是这样存储数据的块就少了就看你自己的平衡了

类似地,像块位图的使用一样,我们也需要一个inode位图来管理inode的使用。让我们把索引节点位图放在块1中!

同时,我们将inode信息放在块2中,其中有8个inode共存,因此我们的块2称为inode表。

现在,我们的文件系统结构变成了下面这样。

注意:块位图用于管理可用的块,每一位代表一个块的使用索引节点位图逐个管理索引节点,而不是索引节点所占用的块例如,如果上图中有8个inode,那么inode位图中有8位来管理它们的使用与否

现在,我们的文件很小,一个街区就能装下。

但是如果需要两块,三块,四块呢。

很简单,我们只需要采用连续存储的方式,而inode只记录文件的第一块,以及后面需要多少块。

这种方法的缺点是容易留下大小孔洞新文档到达后,很难找到合适的空白块,空间会被浪费

这种方式好像行不通,怎么办。

既然inode中记录了文件的块号,为什么不扩展一下,记录更多的块呢。

最初,inode中只记录了一个块号现在,展开它,记录8个块号!并且这些块不必是连续的

嗯,这是一个可行的办法!

但这只能代表8块,能记录的最大文件是8K现在文件很容易超过这个限制我该怎么办

很简单,我们可以将其中一个块作为间接索引。

这样一瞬间就有了263块这种指标称为一级间接指标

如果还不够,再弄一个一级间接索引或者二级间接索引的块。

我们的文件系统,暂时只有一级间接索引硬盘只有1024块,一个文件263块就够大了再大也是这么任性爱不爱

好了,现在可以保存大文件了,可以通过文件名和文件大小准确的读出来了!

但是我们必须不断进步让我们想想这个文件系统有什么问题

例如,我们如何知道inode的数量何时不够需要在inode位图中查找吗找不到就知道不够用

同样,当块数不足时,也是如此。

如果有个全球的地方把这一切都记录下来就好了,方便随时调整,比如这个。

信息节点数量

空闲信息节点数量

块数

空闲块数

那我们再占用一个块来存储这些数据吧!因为他们似乎是从上帝的角度来描述这个文件系统,所以我们把它放在初始块上,称之为超级块现在布局如下

我们继续追求卓越。

现在,块位图,索引节点位图和索引节点表都占据了块1,块2和块3这三个位置。

如果inode数量太大,以至于inode表或inode位图需要占用多个块怎么办。

或者,伴随着块数的增加,块位图需要占用多个块我该怎么办

程序已经死了如果你不告诉它哪个方块代表什么,它就不会自己去猜

很简单就像超级块记录信息一样,你可以选择一块来记录这些信息,这样你就不会害怕了那么我们就选择紧接超级块之后的第一个块来记录这些信息,称之为块描述符

当然,这些块号只记录起始块号,块位图,inode位图,inode表可以分别占用多个块。

好了,你完成了!

现在,让我们尝试保存另一批文件。

葵花宝典. txt

materials.mp4数学期末复习

低并发Programming.pdf的秘密

呃这看起来不舒服所有的文件都放平了可以有等级关系吗

葵花宝典. txt

materials.mp4数学期末复习

住在妻子父母家的女婿

低并发Programming.pdf的秘密

我们称之为向日葵收藏txt一个普通文件,我女婿一个目录文件

女婿/女婿1.mp4。

如何做到这一点那么我们又要说inode结构了

此时需要一个属性来区分这个文件是普通文件还是目录文件。

弥补缺失的东西我们已经很熟悉了我们添加一个4字节来表示文件类型

如果是正常文件,这个inode指向的数据块还是和以前一样,也就是文件本身的完整内容。

但如果是目录文件,这个inode指向的数据块就需要重新规划了。

这个数据块应该是什么样子它可以是指向彼此相邻的不同inode的结构,比如这样

这样我们就可以先找到这个目录文件中的数据块然后,根据该数据块中包含inode信息的结构,找到该目录中的所有文件

完美!

但是,仔细想想如果你想检查这个目录下的所有文件,并显示文件名和文件类型呢

需要从inode表中取出每个结构所指向的inode,然后再取出文件名和文件类型,很浪费时间。

让用户看到一个目录下的所有文件是一个很常见的操作。

因此,最好将结构中的文件名和文件类型等常用信息放在数据块中。

同时,inode结构中的文件名似乎也没什么用这种变长的东西在这种定长结构里很烦,早就想摆脱了它还可以为其他信息节省空间,比如文件所在的块数组,这样就可以多一些

太好了,摆脱它!

好了,你完成了。现在我们可以将文件分类到不同的目录中,也可以在目录中创建目录,无限娃娃!

现在的文件系统已经比较完善了,但是还是有一点点不适。

当我们访问一个目录时,我们可以很舒服地看到目录中的文件,然后根据它们的名称访问这个目录中的文件或目录整个过程都是套路

但是,顶层目录中的所有文件仍然需要通过遍历所有inode来获取可以和上面的套路统一吗

答案很简单。我们规定inode表中的数字0 inode表示根目录,所有访问都从这个根目录开始!

好了,没有了!

最后,让我们来欣赏一下我们的文件系统架构。

你觉得没什么大不了的。

但是这个愚蠢的东西,叫做文件系统。

附言

这个文件系统和linux上的经典文件系统ext2基本相同。

下面是我画的ext2文件系统的结构。

我猜你看不清楚。我来说说主要的异同点:

1.超级块前面是引导块,是PC联盟为硬盘指定的1KB独占空间,任何文件系统都不能使用。

2.EXT2文件系统首先将整个硬盘划分为许多块组,但如果只有一个块组,那么它将与我们文件系统的整体结构完全相同,即超级块,块描述符,块位图,inode位图,inode表和数据块。

3.在EXT2文件系统的inode表中,有15个块用于定位文件,其中第13个块是一级间接索引,14个是二级间接索引,15个是三级间接索引。

4.ext2文件系统有更多的文件类型,如块设备文件,字符设备文件,管道文件,套接字文件等。

5.EXT2文件系统的超级块,块描述符和inode表记录的信息更多,但核心和我们的文件系统是一样的,在后续的ext3和ext4中不断增加这些字段,保持向前兼容。

6.6.ext2文件系统的2号inode是根目录,而我们的系统是0号inode的根目录这是非常武断的你设计一个文件系统,设置一个187号inode作为根目录,没人拦你

如果你想知道ext2文件系统的所有细节,有三种方法。

1.看源代码linux1.0以后的源码有ext2文件系统的实现,源码最准确

2.看官方文件这里有一个pdf链接

3.阅读高质量的博客这里我推荐一个

如果看源代码和官方文档比较容易,当然我是提倡这两个的,因为毕竟是第一手资料。

但是大部分人可能做不到,有时候也没必要,所以也可以看一些有质量的博客。

入门,我觉得我这个是质量非常高的一个它将带你理解你为什么从设计者的角度来设计文件系统

如果介绍细节的话,别看那些连文件系统的格式和字段都写不正确的,所以我在这里良心推荐一个,也就是上面的第三种方式,你可以放心的逐字逐句的吃下去。