首先请读者思考一个问题:Linux系统下面这么多的文件是如何来管理的?新建一个文件都是经历了什么样的过程?

1.Ext文件系统的特点

1).文件系统的特点

权限与属性放置到inode中,至于实际数据则放置到data block块中。还有一个超级块super block会记录整个文件系统的整体信息,包括inode与block的总量、使用量、剩余量等;

  • super block:记录此文件系统的整体信息,包括inode/block的总量、使用量、剩余量以及文件系统的格式与相关信息等;
  • inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码;
  • block:实际记录文件的内容,若文件太大时,会占用多个block;

2).Ext2文件系统

inode与block的大小是在一开始就规划好的,除非重新格式,否则inode与block固定后就不再变动;
对于文件系统动则上百G,那么将所有的inode与block放置在一起不容易管理,因此Ext2文件系统在格式化的时候基本上是区分为多个块组(block group)的,每个块组都有独立的inode/block/super block系统;
浅谈Linux Ext文件系统_第1张图片

2.Ext的组成

1).data block(数据块)

data bloc是用来放置文件内容的地方,在Ext2文件系统中所支持的block大小有1KB、2KB及4KB三种。在格式化时block的大小就固定了,且每个block都有编号,以方便inode记录;
Ext2文件系统的block有以下限制:

  • 原则上,block的大小与数量在格式化完就不能够再改变了;
  • 每个block内最多只能够放置一个文件的数据;
  • 如果文件大于block的大小,则一个文件会占用多个block数量;
  • 若文件小于block,则该block的剩余空间就不能够再被使用了;

2).inode table(inode表格)

inode的内容主要记录文件的属性以及该文件实际数据是放置在哪几号block;

  • 每个inode大小均固定为128bytes;
  • 每个文件都仅会占用一个inode而已;
  • 系统读取文件时需要先找到inode,并分析inode所记录的权限与用户是否符合,若符合才能够开始实际读取block的内容;

inode要记录的数据非常多,但inode的大小仅仅只有128bytes,而inode记录一个block号码要花掉4bytes,假设一个文件有400M且每个block为4KB,那么至少也在10万条block号码的记录,inode哪能记录这么多信息呢,inode空间也不够啊;
inode记录block号码的区域定义为12个直接、一个间接、一个双间接与一个三间接记录;所谓间接就是拿一个block来当作记录block号码的记录区;

浅谈Linux Ext文件系统_第2张图片

假设每个block的大小为1KB;
12个直接:12 x 1=12K;
一个间接:256 x 1K=256K; 256=1KB(一个block) / 4byte(记录一个block索引需要花费的大小)
一个双间接:256 x 256 x 1KB=256^2K
一个三间接:256 x 256 x 256 x 1KB=256^3K
总共加起来为:16GB;所以当文件系统block格式化为1K大小时,能够容纳的最大文件为16GB;

3).superblock(超级块)

superblock是记录整个文件系统相关信息的地方,没有superblock,就没有这个文件系统了。它主要记录的信息有:

  • block与inode的总量;
  • 未使用与已使用的inode/block数量;
  • block与inode的大小(block为1K,2K,4K,inode为128bytes);
  • superblock的大小为1024bytes;

4).File system Description(文件系统描述说明)

这个区段可以描述每个block group的开始与结束的block号码,以及说明每个区段分别介于哪一个block号码之间。

5). block bitmap(块对照表)

添加文件时怎么知道哪个block是空的,需要通过block bitmap来辅助,从block bitmap当中可以知道哪个block是空的;

6).inode bitmap(inode对照表)

这个其它与block bitmap是类似的功能,只是block bitmap记录的是使用与未使用的block号码,至于inode bitmap则是记录使用与未使用的inode 号码;

3.Ext2/Ext2日志文件系统的功能

1).创建文件的流程

Ext2是如何处理创建文件的呢?
1.先确定用户对于添加文件的目录是否具有w与x的权限,若有的话才能添加;
2.根据inode bitmap找到没有使用的inode号码,并将新文件的权限/属性写入;
3.根据block bitmap找到没有使用中的block号码,并将实际的数据写入block中,且更新inode的block指向数据;
4.将刚才写入的inode与block数据同步更新inode bitmap与block bitmap,并更新superblock的内容;

2).数据的不一致状态

如果上述的创建文件在第4步时,因停电、内核错误等原因导致写入inode bitmap与block bitmap没有执行,就导致bitmap与实际数据存放区产生不一致的情况了;

3).日志文件系统

为解决上述问题,在文件系统当中规划出一个块,该块专门记录写入或修订文件时的步骤;

  • 预备:当系统要写入一个文件时,会先在日志记录块中记录某个文件准备要写入的信息;
  • 实际写入:开始写入文件的权限与数据;开始更新bitmap及super block数据;
  • 结束:完成数据与新bitmap及super bloc的更新后,在日志记录块当中完成该文件的记录;

参考资料:鸟哥的Linux私房菜