【Linux】理解文件系统

本文详细介绍了磁盘的硬件构成,如磁头、磁盘片和磁道扇区,以及文件系统的工作原理,重点讲解了BootBlock、inode、Datablocks的关系和作用,特别是文件操作中如何管理inode和块的映射。
摘要由CSDN通过智能技术生成

前言:本篇文章探讨的是未打开的文件

了解磁盘

磁盘的硬件设备

磁盘是由一个主轴串接起来的,不止一个盘片

磁盘片(platters):硬盘内部通常包含一个或多个磁盘片,它们是圆形的薄片,类似于唱片。

磁头(read):磁头是硬盘上的机械部件,它们位于磁盘片的两侧,负责读取和写入数据。磁头悬浮在磁盘片表面的薄气垫上,以确保磁头与磁盘片之间的微小间隙,使其能够精准地读取或写入数据。

磁臂(actuators arm):磁臂是一个臂状结构,连接着所有的磁头。磁臂的移动使得磁头能够在磁盘片的不同区域之间移动,实现对数据的读写操作。

磁盘的存储方式

一个磁盘有很多的盘片,每个盘片有两面。每一面有很多磁道(右图中灰色的圆环就是磁道(track)),磁道上绿色的圆弧就是扇区(sector)。

扇区是磁盘存储的基本单位(512字节)。扇区从“1”开始编号,每个扇区中的数据作为一个单元同时读出或写入。

磁盘的容量

容量 = 盘片数 * 磁道数 * 扇区数 * 512

磁盘的寻址方式(CSH)

CHS 即 Cylinder(柱面)、Heads(磁头)、Sector(扇区),使用这三个参数来定位一个扇区,柱面参数使磁头臂移动到某个半径,磁头参数确定是哪个盘面上的磁道,扇区参数则确定该磁道上某个扇区的具体位置。

逻辑结构(CSH和LBA对应)

想象把磁盘的空间转化成线性的空间,这就是磁盘的逻辑结构。

认识文件系统

刚刚已经讲了如何将磁盘的物理和逻辑对应起来。那么,在文件系统中,是如何存储的呢?

假设文件系统中有500GB的空间,管理500GB太难了,于是我们就将文件分区。分成上面图片这样。每个区的大小可能不一样,但是所有区加起来等于500GB。

但是,就算分好区,200GB的空间也不好管理,于是就对分区之后的200GB的空间进行分组。将每个组设定为10GB,有20组。

在分组中的第一个组内,存储的是引导块(Boot Block)。

Boot Block

Boot Block(引导块)存储的是操作系统启动的相关信息。

Boot Block的作用包括但不限于以下几点:

  1. 引导加载程序存储:Boot Block通常包含引导加载程序的代码和数据,用于引导操作系统的加载和启动。
  2. 文件系统元数据:Boot Block可能会包含文件系统的元数据信息,例如文件系统类型、文件系统版本等。
  3. 磁盘分区信息:Boot Block中通常包含磁盘分区表或分区信息,用于记录磁盘分区的起始位置、大小等信息。
  4. 文件系统的状态信息:Boot Block中可能包含文件系统的状态信息,例如文件系统是否已经被挂载、上次挂载的时间等。

Boot Block在计算机启动时被读取到内存中执行,引导加载程序会根据Boot Block中的信息找到操作系统的位置并加载操作系统,完成整个启动过程。确保操作系统能够正确启动并运行。

Block group

对于每一个组,都有下面这样的结构:

接下来对每一个内容进行解释。

Data blocks

在文件系统中,会以块的形式存储内容,一个块的大小是4KB,而一个扇区是512B的大小,所以

                                                                1块 = 8个扇区

可能有人觉得会造成浪费,但是对于一个1GB的文件来说,他会存储很多块,前面的块都是存满的,只有最后一个块可能会有剩余。所以浪费的空间是很少的。

inode Table

inode Table里面存储的是这个组中所有文件的inode,inode里面存储的又是文件的所有属性。

包括:

1. 文件类型

2. 文件大小

3. 文件的拥有者

4. 文件的所属组

5. 文件的权限

6. 文件的硬链接数

7.文件的时间戳

等等

Linux中的内核源码:

文件的属性存在inode里,文件的内容存在Data blocks里。

我们怎么知道哪个文件存在哪个block里呢?(怎么让inode 和 Data blocks联系起来呢?)

在inode结构体中有这些成员

其中,红框中的int blocks[NUM]数组,存储的就是Data blocks中的块号!

inode里面只有15个块的编号,怎么能索引到全部的编号呢?

int blocks[]中存储的不全部是一级索引!

怎么理解?

有可能就存在,前12个存的是一级索引。第13个和14个存的是两级索引。

什么是一级索引?

就是数组中存的这个块号的块,这个块是用来存储文件内容的

什么是两级索引?

就是数组中存的这个块号的块,这个块是用来存储块号的而不是文件内容。

假设块号所占的内存大小是4字节,一个块的空间大小是4KB,所以一个块就能存储4KB / 4 = 1024个块号,两个两级索引就存储2048个块号。

一个块号对应的块是4KB,所以实际对应的内存空间大小应该是4KB * 2048 = 8MB。此时还没有算上三级索引。

什么是三级索引?

就是在二级索引中,存储了1024个块号,其中,有些块号用来存文件内容,有些块号又拿来存块号了。例如图上的400,它就是两级索引中200存储的一个块号。

这个时候,可能就会有人想到,这像不像一个树的结构?你是两级索引,就像树的第二层,你是三级索引就像树的第三层。只有叶子节点是存储的是文件的内容

Block Bitmap

从上面的情况中,可以推断出:删除文件的时候不需要把文件清空,只需要把文件的块号对应在Block Bitmap中的比特位置为0即可

inode Bitmap

如果inode Bitmap占4KB的内存大小,那么会有 4 * 1024 * 8个比特位。所以inode Bitmap其实占的空间不会很大。

Super Block

Group Descriptor Table

这里有有个很重要的信息:inode中存储的文件的属性里没有文件的文件名。

那么,没有文件名,系统是如何找到文件的呢?

通过查找文件的inode.

但是,目录的数据块(Data block)中存储的就是它的文件名和inode的映射关系。这也是为什么同一目录下,文件名不能重复的原因。

对文件的操作

在Linux系统中,一个文件对应一个inode(每一个inode都有自己对应的inode编号,inode的设置是以分区为单位的,不能跨分区)

既然知道了文件系统的组成,那么我们就应该以操作系统的视角去看待对文件操作的时候,操作系统应该怎么做

1.新建一个文件,系统需要做什么?

  1. 新建一个文件,首先确定了这个文件的inode
  2. 然后去inode Bitmap中将这个文件的inode的比特位由0置1
  3. 去修改inode Table,填入文件的属性,将块号填入到blocks[NUM]
  4. 到Block Bitmap中将预备申请的块号由0置1
  5. 去Data blocks中找到申请到的块号,将内容填入到块中

2.删除一个文件,系统需要做什么?

所以删除一个文件,不是清空这个文件的内容。而是将这个文件的Block Bitmap由1置0,inode Bitmap由1置0。如果没有新的数据写入就不管,有新的数据写入就覆盖。

3.查找/修改一个文件,系统需要做什么?

总结

本篇文章首先谈及磁盘的存储结构。

盘面 - 磁道 - 扇区      每个扇区是512字节。

通过磁盘的存储结构延申到在操作系统中存储的逻辑结构。

操作系统为了方便管理,对空间进行分区分组。操作系统将500GB的空间分区,假设某个区分为200GB,再将200GB分为20个10GB的组。

每个组中,都会有Super Block、Group Descriptor Table等的内容。

然后对每个内容进行了详细的说明。

其中,最重要的就是文件的inode.以及inode如何和文件的块号映射起来 -- 通过block[NUM]

如何判断文件的块号是否有效 -- 通过Block Bitmap,对应的比特位为1即有效

如何判断文件的inode是否有效 -- 通过inode Bitmap,对应的比特位为1即有效

  • 50
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值