我们简单分析一下EXT2 的inode / block 与文件大小的关系。inode 要记录的资料非常多,但偏偏又只有128bytes , 而inode 记录一个block 号码要花掉4byte ,假设我一个文件有400MB 且每个block 为4K 时, 那么至少也要十万条block 号码的记录!inode 哪有这么多空间来存储?为此我们的系统很聪明的将inode 记录block 号码的区域定义为12个直接,一个间接, 一个双间接与一个三间接记录区。这是啥?我们将inode 的结构画一下好了。
上图最左边为inode本身(128 bytes),里面有12个直接指向block号码的对照,这12条记录就能够直接取得block号码啦!至于所谓的间接就是再拿一个block来当作记录block号码的记录区,如果文件太大时,就会使用间接的block来记录号码。如上图中间接只是拿一个block来记录额外的号码而已。同理,如果文件持续长大,那么就会利用所谓的双间接,第一个block仅再指出下一个记录号码的block在哪里,实际记录的在第二个block当中。依此类推,三间接就是利用第三层block来记录号码啦!
这样子inode 能够指定多少个block 呢?我们以较小的1K block 来说明好了,可以指定的情况如下:
12个直接指向: 12*1K=12K 由于是直接指向,所以总共可记录12笔记录,因此总额大小为如上所示 间接: 256*1K=256K 每笔block号码的记录会花去4bytes,因此1K的大小能够记录256笔记录,因此一个间接可以记录的文件大小如上; 双间接: 2562561K=256 2 K 第一层block会指定256个第二层,每个第二层可以指定256个号码,因此总额大小如上; 三间接: 256256256*1K=256 3 K 第一层block会指定256个第二层,每个第二层可以指定256个第三层,每个第三层可以指定256个号码,因此总额大小如上; 总额:将直接、间接、双间接、三间接加总,得到12 + 256 + 256256 + 256256*256 (K) = 16GB 此时我们知道当文件系统将block格式化为1K大小时,能够容纳的最大文件为16GB,比较一下文件系统限制表的结果可发现是一致的!但这个方法不能用在2K及4K block大小的计算中,因为大于2K的block将会受到Ext2文件系统本身的限制,所以计算的结果会不太符合 文件系统大小与磁盘读取性能
关于文件系统的使用效率,当你的一个文件系统规划的很大时,例如100GB这么大时,由于磁盘上的资料总是来来去去的,所以,整个文件系统上面的文件通常无法连续写在一起(block号码不连续),而是填入式的将资料填入没有被使用的block当中。如果文件写入的block真的分的很散,此时就会有所谓的文件资料离散的问题发生了。
如前所述,虽然我们的ext2 在inode 处已经将该文件所记录的block 号码都记上了, 所以资料可以一次性读取,但是如果文件真的太过离散,确实还是会发生读取效率低的问题。因为磁盘读取头还是得要在整个文件系统中来来去去的频繁读取!果真如此,那么可以将整个文件系统内的资料全部复制出来,将该文件系统重新格式化, 再将资料给他复制回去即可解决这个问题。








