摘取自骏马金龙的第4章ext文件系统机制原理剖析
如果文件系统比较大,imap本身就会很大(我理解是数据量大),每次存储文件都要进行扫描,会导致效率不够高。为解决此问题,将文件系统占用的block划分成块组(block group)。
在物理层面上的划分是将磁盘按柱面划分为多个分区,即多个文件系统;在逻辑层面上的划分是将文件系统划分成块组。每个文件系统包含多个块组,每个块组包含多个元数据区和数据区:元数据区存储bmap、inode table、imap等数据;数据区存储文件数据的区域。注意块组是逻辑层面的概念,所以并不会真的在磁盘上按柱面、按扇区、按磁道等概念进行划分。
块组在文件系统创建完成后就已经划分完成了,也就是说元数据区bmap、inode table和imap等信息占用的block以及数据区占用的block已经划分好了。那么文件系统如何知道一个块组元数据区包含多少个block,数据区又包含多少block呢?
它只需确定一个数据:每个block的大小,再根据bmap至多只能占用一个完整的block的标准就能计算出块组如何划分。如果文件系统非常小,所有的bmap总共都不能占用完一个block,那么也只能空闲bmap的block了。
每个block的大小在创建文件系统时可以人为指定,不指定也有默认值。
假如现在block的大小是1KB,一个bmap完整占用一个block能标识1024*8= 8192个block(当然这8192个block是数据区和元数据区共8192个,因为元数据区分配的block也需要通过bmap来标识)。每个block是1K,每个块组是8192K即8M,创建1G的文件系统需要划分1024/8=128个块组,如果是1.1G的文件系统呢?128+12.8=128+13=141个块组。
每个组的block数目是划分好了,但是每个组设定多少个inode号呢?inode table占用多少block呢?这需要由系统决定了,因为描述"每多少个数据区的block就为其分配一个inode号"的指标默认是我们不知道的,当然创建文件系统时也可以人为指定这个指标或者百分比例。见后文"inode深入"。
inode大小为128字节的倍数,最小为128字节。它有默认值大小,它的默认值由/etc/mke2fs.conf文件中指定。不同的文件系统默认值可能不同。
同样观察到这个文件中还记录了blocksize的默认值和inode分配比率inode_ratio。inode_ratio=16384表示每16384个字节即16KB就分配一个inode号,由于默认blocksize=4KB,所以每4个block就分配一个inode号。
但是分配的inode自身会占用block,而且其自身大小256字节还不算小,所以inode号的浪费代表着空间的浪费。
既然知道了inode分配比率,就能计算出每个块组分配多少个inode号,也就能计算出inode table占用多少个block。
查看文件系统信息的命令dumpe2fs
使用dumpe2fs可以将ext类的文件系统信息全部显示出来,当然bmap是每个块组固定一个block的不用显示,imap比bmap更小所以也只占用1个block不用显示。
从这张表中能计算出文件系统的大小,该文件系统共4667136个blocks,每个block大小为4K,所以文件系统大小为4667136*4/1024/1024=17.8GB。
也能计算出分了多少个块组,因为每一个块组的block数量为32768,所以块组的数量为4667136/32768=142.4即143个块组。由于块组从0开始编号,所以最后一个块组编号为Group 142。如下图所示是最后一个块组的信息。
总结回答问题
文件系统由多少个block group组成?每个block group有多少个block组成?每个block由多少inode组成?
文章真绕,看了半天才懂。
举例:block是1K的话,每个block group有8192个block组成。1G的文件系统由128个block group组成,每个块组8M。
block是1K的话,占用1个block的bmap,bmap也是8位的,所以每个块组是8M (1024字节*8位*1K block,bmap的每一位都可以标识一个block,1K大小的block有1024字节,每个字节8位),也就是有8192个block组成。也就是说1G大小的文件系统,有128个块组组成,每个块组8M。
举例:block是4K的话,每个block group有32768个block组成。1G的文件系统由8个block group组成,每个块组128M。
block是4K的话,占用1个block的bmap,bmap也是8位的,所以每个块组是128M (4096字节*8位*4K block,bmap的每一位都可以标识一个block,1K大小的block有1024字节,4K大小的block有4096字节,每个字节8位),也就是有32768个block组成。也就是说1G大小的文件系统,有8个块组组成,每个块组128M。
如果/etc/mke2fs.conf中inode分配比率为16K,一个block 4K,则每4个block分配一个inode号。