一个文件系统一般使用块设备上一个独立的逻辑分区。对于ExtX文件系统来说,硬盘分区首先被划分为一个个的Block,一个ExtX文件系统上的每个Block都是一样大小的。但是不同ExtX文件系统,Block大小可能不同,这是在创建Ext2系统决定的,一般为1k或者4k。由于Block数量很多,为了方便管理,ExtX将这些Block聚集在一起分为几个大的块组(Block Group),每个块组包含的等量的物理块,在块组的数据块中存储文件或目录。ExtX文件系统存储结构如下图所示:
Inode与block详解

data block(数据块)
  data block是用来放置文件内容的地方,在Ext2文件系统中所支持的 block 大小有1kB、2KB及4KB三种。在格式化时,block的大小就固定了,且每个block都有编号,以便inode记录。由于block大小的差异,会导致该文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同。

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

inodetable(inode表格)
  inode的内容主要记录文件的属性以及该文件实际数据的位置。

  • 该文件的访问模式(read/write/execute)
  • 该文件的所有者与组(owner/group)
  • 该文件的大小的各个时间(ctime/atime/mtime)
  • 定义文件特性的标志(flag),如SUID等
  • 该文件真正内容的指向(pointer)
  • 每个inode大小固定为128 bytes
  • 每个文件都仅会占用一个inode

Superblock(超级块)
  Superblock主要是记录整个文件系统相关的地方,记录的主要信息有:
*在特定的块组有,内容相同,多个互相备份

  • block 与 inode 的总量未使用和已使用的 inode/block 数量及总量
  • block 与 inode 的大小
  • 文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等
  • 一个 validbit 数值,若此文件系统已被挂载,则valid bit为0,否则为 1

File system Description(文件系统描述说明)
  这个区段可以描述每个 block group 的开始与结束的号码,以及说明每个区段(superblock、bitmap、inodemap、data block)分别介于哪一个 block 号码之间。也能够用dumpe2fs查看。

block bitmap(块对照表)
  我们可以通过block bitmap来知道哪些block是空的,此时系统就可以快速地找到可使用的空间来放置文件。

indoe bitmap(inode对照表)
  这个和block bitmap的功能是类似,只是inode bitmap记录的是使用与未使用的号码。
  在Ext2文件系统中所支持的Block大小有1K、2K、4K三种。在格式化时Block的大小就固定了,且每个Block都有编号,方便Inode的记录。每个Block内最多只能够放置一个文件的数据,如果文件大于Block的大小,则一个文件会占用多个Block;如果文件小于Block,则该Block的剩余容量就不能够再被使用了,即磁盘空间会浪费。下面看看Inode和Block的对应关系。
  Inode要记录的数据非常多,但大小仅为固定的128字节,同时记录一个Block号码就需要4字节,假设一个文件有400MB且每个Block为4K时,那么至少也要十万笔Block号码的记录。Inode不可能有这么多的记录信息,因此Ext2将Inode记录Block号码的区域定义为12个直接、一个间接、一个双间接与一个三间接记录区。Inode存储结构如下图所示:

Inode与block详解

  最左边为Inode本身(128 bytes),里面有12个直接指向Block号码的对照,这12笔记录能够直接取得Block号码。至于所谓的间接就是再拿一个Block来当作记录Block号码的记录区,如果文件太大时,就会使用间接的Block来记录编号。如上图当中间接只是拿一个Block来记录额外的号码而已。 同理,如果文件持续长大,那么就会利用所谓的双间接,第一个Block仅再指出下一个记录编号的Block在哪里,实际记录的在第二个Block当中。依此类推,三间接就是利用第三层Block来记录编号。
  以每个 block 的大小1KB为例来说,情况如下:
    12个直接指向:12 × 1K = 12K
    间接:256 × 1K = 256K
    双间接:256 × 256 × 1K = 256^2^K
    三间接:256 × 256 × 256 × 1K = 256^3^K
    总额:将上面的加在一起,可得到 12 + 256 + 256^2^ + 256^3^(K) = 16GB 。我们这下也就知道了前面表格的最大单个文件限制是怎么来的了。 按照我的理解 记录一个block需要占用四个字节,则一个1K的block,则可以记录1024/4=256个block。一个inode是128字节,而直接指向+间接指向等没有占完128个字节的原因主要是还考虑文件描述等信息,他们占用的字节数。
  
  上面描述是借鉴了别人的概念的理解,下面说下自己的理解,不一定对,但是提供一种想法: 一个硬盘首先被格式化extX,划分成一个个block,此时block大小(可以是1K,4K等)固定且分配了block编号。但是为了方便管理和维护,将block等量划分,分成一个个block group 。block组按需划分成super block;GDT;block bitmap;inode bitmap;inode table;data blocks, 实际上这些信息都是在物理block基础上划分的,可看做方便管理从而定义的名称而已。比如一个block group含有100个block,其中super block在block1 2 3上,GDT在block4 5上 等等。inode table里面也不止一个inode信息,而datablock占用了大多数blocks。

参考文章如下:
磁盘IO那些事
磁盘IO那些事