学习篇 | LINUX 内核的文件系统 -- ext2

引言:

本篇博客中主要讲述的是 LINUX 内核所用的文件系统 —— 第二代扩展文件系统 Ext2,Ext2是数个Linux发行版本的默认文件系统。

 

学习篇 | LINUX 内核的文件系统 -- ext2_第1张图片

 

百度百科 -- ext2

目录

引言:

Ext2 文件系统

磁盘的物理组成

ext2 文件系统的格式

ext2 文件系统目录与文件

常见问题汇总

 


Ext2 文件系统

Ext2 文件系统是 Linux 系统中的标准文件系统,是通过对 Minix 的文件系统进行拓展而得到的,其存储文件的性能极好。Ext2文件系统使用以inode为基础的文件系统。文件系统一开始将inode与block规划好了,除非重新格式化,否则inode与block固定后就不再变动,但是当inode与block数量过多时,就不易于管理。因此Ext2在格式化的时候基本上是区分为多个块组(block group),每个块组都有独立的/inode/block/superblock系统。

ls -l 的指令,相信大家不会陌生,我们通过这条指令,除了可以看到文件名,还可以看到文件的元数据。每行包含 7 列,依次是:『模式』/『硬链接数』/『文件所有者』/『组』/『大小』/『最后修改时间』/『文件名』

学习篇 | LINUX 内核的文件系统 -- ext2_第2张图片

stat 指令可以看到更多信息:

学习篇 | LINUX 内核的文件系统 -- ext2_第3张图片

 

磁盘的物理组成

磁盘:扇区为最小的物理存储单位,每个扇区为512字节。将扇区组成一个圆,那就是柱面,柱面是分区的最小单位。第一个扇区很重要,里面有硬盘主引导记录(Masterbootrecord,MBR)及分区表,其中MBR占有446字节,分区表占有64字节。
各种接口的磁盘在Linux中的文件名

  • /dev/sd[a-p][1-15]:为SCSI,SATA,USB,Flash等接口的磁盘文件名;
  • /dev/hd[a-d][1-63]:为IDE接口的磁盘文件名。

磁盘是典型的块设备,磁盘分区被划分为一个个的 block,一个block的大小是由格式化的时候确定的,并且不可以更改。例如 mke2fs 的 -b 选项可以设定block大小为1024、2048或4096字节。

学习篇 | LINUX 内核的文件系统 -- ext2_第4张图片

上图为磁盘文件系统图(内核内存映像肯定有所不同),上图中启动块(Boot Block)的大小是确定的。

  • 启动扇区(Block Group):ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。

  • 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了

  • 块组描述符(GDT,Group Descriptor Table):描述块组属性信息,有兴趣的同学可以再了解一下:GDT

  • 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用

  • inode 位图(inode Bitmap):每个bit表示一个inode是否空闲可用。

  • inode 节点表(inode Table):存放文件属性 如 文件大小,所有者,最近修改时间等

  • 数据区(Data blocks):存放文件内容

 

操作系统的文件数据除了文件实际内容外, 通常含有非常多的属性,例如 Linux 操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。 文件系统通常会将这两部份的数据分别存放在不同的区块,举个例子:

ls -i 显示文件的inode号,回车后显示:263466 abc,表示我们这里新建文件 abc 的 inode 号为 263466

学习篇 | LINUX 内核的文件系统 -- ext2_第5张图片

创建一个新文件,主要有以下 4 个操作

  • 存储属性:内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。

  • 存储数据:该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。

  • 记录分配情况:文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。

  • 添加文件名到目录:新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。

block 限制

  • 原则上,block大小与数量在格式化完就不能再改变

  • 每个block内最多只能够放置一个文件的数据

  • 如果放置的文件大于block的大小,则一个文件会占用多个block数量

  • 如果文件小于block,则该block的剩余空间就不能再被使用(磁盘空间会浪费)

inode 限制

  • 每个inode大小均固定在128bytes

  • 每个文件都仅会占用一个inode而已

  • 承上,因此文件系统能够创建的文件数量与inode的数量有关

  • 系统读取文件时需要先找到inode,并分析inode所记录的权限与用户是否符合,若符合才能开始实际读取block的内容

inode 存储的信息

  • 该文件的访问模式

  • 该文件的所有者与组

  • 该文件的大小

  • 该文件创建或状态改变的时间

  • 最近一次的读取时间

  • 最近修改的时间

  • 定义文件特性的标志

  • 该文件真正内容的指向

 

inode/block与文件大小的关系

inode要记录的数据非常多,但只有128bytes,而inode记录一个block号码要花掉4bytes,假设一个文件有400MB且每个block为4KB,那么至少要10万条block号码的记录,哪有这么多的inode可记录这些信息?为此我们系统很聪明将inode记录block号码的区域定义为12个直接,一个间接,一个双间接与一个三间接记录区。

学习篇 | LINUX 内核的文件系统 -- ext2_第6张图片

图中最左边为inode本身(128bytes),里面有12个直接指向block号码的对照,这12个记录可以直接取到block号码,也就是直接寻址。至于所谓的间接就是再拿一个block来当作记录block号码的记录区,如果文件过大时,就会使用间接的block来记录编号,也就是间接寻址。同理,如果文件持续长大,就会利用双间接。

这样inode能够指定多少个block呢?以较小的1KB的block来说明。可以指定的情形如下:

  1. 12个直接指向:12*1K=12K,由于是直接指向,所以总共可以记录12条记录
  2. 间接:256*1K,每条block号码的记录会花去4bytes,因此1K的大小能记录256条记录
  3. 双间接:256*256*1K=256^2K
  4. 三间接:256*256*256*1K=256^3K

总额:将直接、间接、双间接、三间接加总,得到12+256+256^2+ 256^3=16GB,此时我们知道当文件系统将block格式化为为1K大小时,能够容纳的最大文件为16GB,比较一下文件系统线指标的结果可发现是一致的。但这个方法不能用在2K及4K的block大小的计算中。因为大于2K的block将会收到文件系统本身的限制

 

ext2 文件系统的格式

在ext2文件系统中,文件由inode(包含有文件的所有信息)进行唯一标识。一个文件可能对应多个文件名,只有在所有文件名都被删除后,该文件才会被删除。此外,同一文件在磁盘中存放和被打开时所对应的inode是不同的,并由内核负责同步。

ext2文件系统采用三级间接块来存储数据块指针,并以块(block,默认为1KB)为单位分配空间。其磁盘分配策略是尽可能将逻辑相邻的文件分配到磁盘上物理相邻的块中,并尽可能将碎片分配给尽量少的文件,以从全局上提高性能。ext2文件系统将同一目录下的文件(包括目录)尽可能的放在同一个块组中,但目录则分布在各个块组中以实现负载均衡。在扩展文件时,会尽量一次性扩展8个连续块给文件(以预留空间的形式实现)。

 

ext2 文件系统目录与文件

目录文件:在ext2文件系统中,目录是作为文件存储的。根目录总是在inode表的第二项,而其子目录则在根目录文件的内容中定义。目录项在include/linux/ext2_fs.h文件中定义,

文件拓展属性:文件的属性大多数是位于该文件的inode结构中的标准属性,也还包含其他一些扩展属性(于系统中所有的inode相关,通常用于增加额外的功能),在fs/ext2/xattr.h文件中定义。

 

常见问题汇总

  • 磁盘分区完毕后还需要进行格式化,之后操作系统才能够使用这个分区。 为什么需要进行『格式化』呢?

答:因为每种操作系统所配置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此就需要将分区进行格式化,以成为操作系统能够利用的『文件系统格式』。

  • 如何知道数据往 Data blocks 当中存储的时候,哪块是空闲,哪块已被使用

答:BlockBitmap 当中去查找空闲的块

  • 当单单是存储数据的时候,当获取数据的时候,就无法得知数据去存储在哪个块中

答:存储数据的时候,同时需要获取一个 inode 节点,所以就会在 inodeBitmap 当中去查找空闲的 inode,在 inode 节点中去填充文件信息,然后将 inode 放回 inodetable 区域,文件名称+inode节点名称当做目录的目录项来存储起来

  • 其他问题

答:可以直接在评论区留言~~~

 


◆ 回到开头 @ 目录

引言:

Ext2 文件系统

磁盘的物理组成

ext2 文件系统的格式

ext2 文件系统目录与文件

常见问题汇总


◆ 其他博客 @ https://blog.csdn.net/weixin_42194161

◆ 相关博客

学习篇 | C语言常用语法提要

学习篇 | C/C++ 文件结构

 

感谢阅读本篇博客,如果有不错的建议或意见,欢迎在评论区留言,喜欢的话,麻烦点个赞和关注哦~~~


 

你可能感兴趣的:(11.学习篇,04.linux)