Linux操作系统之文件(四):文件系统(上)

发布于:2025-07-06 ⋅ 阅读:(16) ⋅ 点赞:(0)

前言:

我们前几篇文章讲了缓冲区与重定向的有关概念,这些设计是linux系统的核心机制,对系统性能、资源管理和用户操作灵活性有重要意义。

不涉及一些硬件就不可能让大家清楚地去理解文件系统,所以这篇文章,我将会从计算机组成原理的角度,为大家讲解一下文件系统的构成。

文件被打开了,是存储到内存里的。那么文件没有被打开呢?存储到哪里?

自然是磁盘里。

我们访问一个文件的前提是不是要打开它?那我们访问文件的前提是要找到它,也就是说我们要有对应的路径。

但那么多文件,不只是你一个文件有路径,所有文件都要有路径。众多路径需要被管理起来,所以就出现了文件系统的概念:

磁盘级文件系统与内存级文件系统。

如同我们去取快递一样,快递就好比一个一个的文件,放在菜鸟驿站的快递柜上,我们需要根据快递的编号,找到对应的存放位置,最后取回到我们的宿舍(内存中)。

文件系统又是如何把未打开的文件,在磁盘上管理起来的呢?

我们又如何去理解路径呢?

别着急,我将为大家一一解答。

一、磁盘

像这些机械磁盘,是计算机中唯一一个机械设备。图左是一个机械硬盘,图右是机械硬盘拆开后的样子。

图示为一个服务器,里面嵌入了许多个磁盘,而服务器是计算资源的载体,安装在机柜内 :

图为一个一个的机柜,机房就是存储这些机柜的地方。

不同于我们的其他存储设备,机械磁盘的好处就是容量大,便宜。但它的读取速度就比较慢。

公司里有大量平时用不到的数据,你不可能用其他昂贵的设备来进行存储,自然需要用到机房。


而磁盘是怎么进行存储数据的呢?

我们知道,磁铁是有着南极与北极的,同样的,二进制划分为0,1.

所以,我们就规定南极与北极各自代表0或1。这样,就方便了我们进行二进制数据的存储。

所以我们如何销毁一个磁盘呢?

自然就是对该磁盘进行消磁处理。

一个磁盘的结构如下图所示:

 

 

 我们的机械臂杆上有着多个读写磁头,分别近距离挨着每个盘片的上下两个面。比如上图我们就有着6个读写磁头,以及6个面,二者的数量是相同的。如果我们在读写一个磁头,实际上就是在读写一个磁面。注意,磁头与磁盘之间并没有实际接触,就像是一架飞机贴地1m处飞行一样。

每个面上,存在着包围着中心的,不同大小的环道,我们称之为磁道,而每个磁道上,我们划分了一定区域,每个区域叫做扇区。

有个疑问,我们这上面有不同的扇区,他们的长短是不一样,那么存储大小呢?

在早期的磁盘中,是一样的,但现在的技术已经能做到同质度的存储数据了,也就是说扇区越大,存储的数据越多。

 扇区,是磁盘存储数据的基本单位,通常,一个扇区的大小为512字节。

如果我想修改一个扇区的一个比特位,也要把512字节全部读取到内存才行,所以我们称磁盘为快设备。

磁盘容量=磁头数 × 磁道(柱⾯)数 × 每道扇区数 × 每扇区字节数
这里有个细节:传动臂上的磁头是共进退的(这点⽐较重要,后⾯会说明)

那我们如何定位一个扇区呢?

1、可以先定位磁头(header)
2、确定磁头要访问哪⼀个柱⾯(磁道)(cylinder)
3、定位⼀个扇区(sector)

 

以上3步,被我们称为CHS地址定位法。(但现在大部分已经淘汰了,我们讲这个只是为了帮助大家理解)

⽂件 = 内容+属性 都是数据,⽆⾮就是占据那⼏个扇区的问题!能定位⼀个扇区了,能不能定位多个扇区呢?

 我们可以通过以上的命令查看我们云服务器的磁盘分区

这是一个 50GB的虚拟磁盘(GPT分区表),包含:

  1. 1MB的BIOS引导分区(兼容传统启动)。

  2. 50GB的Linux主分区(实际可用空间)。

 


二、磁带

我们以前也有磁带这种存储设备。

 磁带上⾯可以存储数据,我们可以把磁带“拉直”,形成线性的结构:

那么磁盘本质上虽然是硬质的,但是逻辑上我们可以把磁盘想象成为卷在⼀起的磁带,那么磁盘的逻辑存储结构,我们也可以类似于:

 

这样每⼀个扇区,就有了⼀个线性地址(其实就是数组下标),这种地址叫做LBA地址定位法。 

 

由于我们前面说到,传动臂上的磁头是共进退的。

所以,我们可以把每个盘面上,相同半径大小的磁道,组成一个柱面 

所以,磁盘物理上分了很多⾯,但是在我们看来,逻辑上,磁盘整体是由“柱⾯”卷起来的。 

因此,把一个磁道展开,我们可以看做是一个一维数组,随后一个柱面上有多个磁道,我们可以看做柱面为二维的扇区数组。多个柱面盘旋起来形成磁盘,所以磁盘可以看作是扇区的三维数组 

所有,寻址⼀个扇区:先找到哪⼀个柱⾯(Cylinder) ,在确定柱⾯内哪⼀个磁道(其实就是磁头位置,Head),在确定扇区(Sector),所以就有了CHS。
如果我们只给你一个LBA地址1000,那你还需要CHS地址吗?
答案是不必需要了,因为LBA与CHS地址可以进行相互转化,所以操作系统 只需要使⽤LBA就可以了!!
这个转化是谁来做啊??
磁盘自己 来做!固件(硬件电路,伺服系统)!
所以:从此往后,在磁盘使⽤者看来,根本就不关⼼CHS地址,而是直接使用LBA地址,磁盘内部⾃⼰可以进行转换。所以:
从现在开始,磁盘就是⼀个元素为扇区的⼀维数组,数组的下标就是每⼀个扇区的LBA地址。OS使⽤如果要磁盘,就可以⽤⼀个数字访问磁盘扇区了。

 三、块

如果我们进行IO操作,是以扇区512字节为单位,未免就太少了。

所以我们可以把一定数量的扇区,划分为一个块。一个块的数据大小为4kb,也就是八个扇区。

而这些块,我们也可以进行编号,比如说,块1,块2,块3.

所以磁盘就划分为了以块为单位的一维数组。

假如我们磁盘中有500GB的存储空间,我们应该如何进行管理呢?

答案是,我们会把这500GB的空间换划分为一个一个的的分区。

就像是大家电脑上的C盘,E盘,D盘。

 

从linux系统看,我的这个就划分为了2个区域。一个分区挂掉了不会影响其他分区,这一切都是为了磁盘的 灵活性、安全性、性能优化和兼容性。

这也体现了分治的思想。我们只需要管理好一个分区,随后把这个分区的管理方法复制到其他分区进行管理就行了。 

那我们该如何管理好一个分区呢?

这里就要开始引入我们的文件系统的概念了。

 四、EXT2文件系统 

1、分区

我们想要在硬盘上储⽂件,必须先把硬盘格式化为某种格式的⽂件系统,才能存储⽂件。⽂件系统的⽬的就是组织和管理硬盘中的⽂件。在Linux 系统中,最常⻅的是 ext2 系列的⽂件系统。其早期版本为 ext2,后来⼜发展出 ext3 和 ext4。ext3 和 ext4 虽然对 ext2 进⾏了增强,但是其核⼼设计并没有发⽣变化,我们仍是以较老的ext2 作为演示对象。
ext2⽂件系统将整个分区划分成若⼲个同样⼤⼩的块组 (Block Group),如下图所示。只要能管理⼀个分区就能管理所有分区,也就能管理所有磁盘⽂件。
ext2⽂件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组
成。

这里独立于分区外的是Boot Block,通常记录的是启动的相关设置。

启动块的大小是确定的,为1KB,由PC标准规定,⽤来存储磁盘分区信息和启动信息,任何⽂件系统都不能修改启动块。启动块之后才是ext2⽂件系统的开始。

而一个分区内通常会存储以上信息: Data blocks,inode Table ,inode Bitmap等。

2、inode 

我们知道,一个文件=属性+数据

那么一个文件的属性信息,其实也是一种数据,我们把这个属性信息以结构体的方式构建出来。

这个结构体我们就把它叫做inode。(所以inode,是文件属性的集合)

通常来说,一个文件就对应着这一个inode。

一个inode的大小通常为128字节,当然也有256字节的情况,我们在这里不讨论256字节的inode。

操作系统与磁盘进行IO交互时基本单位是4KB,所以一个块就有4kb/128字节个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],用于存储文件数据块的地址。这个数组直接决定了如何找到文件的实际内容。

blocks[NUM]存储的是文件内容所在的 磁盘块号,通过这些号码可以在磁盘上定位文件的具体数据。


由于时间的原因,本篇文章就暂时写到这里,后面的内容,我会在下一篇文章中为大家详细介绍inode等信息。

结语:

文件系统上怎么知道一个一共有多少inode,还有多少inode没使用这些信息的呢?

下一篇文章再来谈文件系统的块号如何理解,inode的值是怎么来?为什么找文件只需要通过inode就行了这些内容。

本篇文章介绍了大量概念,希望同学们能够进行一定程度的记忆。

如果有任何疑问与指正,欢迎评论区或者私信留言!!


网站公告

今日签到

点亮在社区的每一天
去签到