转载:http://blog.youkuaiyun.com/lieye_leaves/article/details/78507040
EXT4文件系统的磁盘布局
一.磁盘空间的计算
EXT4文件系统是从EXT2/EXT3文件系统上继承和发展而来的,EXT4也使用EXT2/EXT3的一些元数据的概念,如超级块,块组描述符,块组位图,节点位图,节点数据,在EXT2/EXT3中还有间接数据块,EXT4的节点如果不用content结构的话,也应该有间接数据块的概念,因为EXT4在某些情况下会与EXT3文件系统兼容。
在EXT2/EXT3/EXT4文件系统中一个块组最大为128M,块组描述符在EXT2/EXT3中为32个字节,在EXT4中为64个字节;下面就专门讨论EXT4的情况。在EXT4中,支持的最大块组数为2^21 个,是这样计算出来的,块组数最多时其块组描述符占用满一个块组,一个块组大小为128M, 即块组数为128M/64= 2^27/2^6= 2^21;所以支持的最大空间数为2^21X128M= 2^21x2^27=2^48=256T,即为文件系统磁盘的最大空间。
为了突破256T空间的限制,引入了meta_block_group的方法;在该方法中将多个块组组成一个meta_block_group。那个数为多少呢?组成的方法如下,在meta_block_group中拿出一个数据块来存储块组描述符,数据块大小假设现在的大小是4K,块组描述符就描述本meta_block_group中的块组,那一个meta_block_group中的块组个数可以是4K/64=2^12/2^6=2^6=64,即为64个块组。这样,块组数就不受空间大小的限制了,空间不够只要在最后加上去就可以了;因此,磁盘寻址的时候,48个bit的地址空间(两个32bit的地址组合起来,可以是64bit,但是现在只支持到48bit)就都可以利用起来,磁盘空间块大小为4K的话,总的寻址空间就可以有2^48X4K= 2^48X2^12=2^60=1EB,所以这是EXT4文件系统的最大的空间。
二.Flexibleblock group
在生成EXT4文件系统时可以加入特性flex_bg参数,生成的文件系统就支持flexibleblock group的特性。原来每个块组中都有描述该块组内部的数据块位图,节点位图,节点表;引入该特性后,每个块组中这些数据就被移动到第一个块组中去了,后面的块组就没有数据块位图,节点位图,节点表了,就剩下数据块了,不过偶尔会插入块组描述符和备份的超级块了,他们会在块组的开头。这样就使数据块部分紧密的联系在一起,保证大文件存储的高效性。
一个flexible blockgroup中块组的个数,是由超级块中该变量定义的s_log_groups_per_flex,个数为2^s_log_groups_per_flex。现在假设取4,那么2^4=16,即一个flexibleblock group中有16个块组,那么其结构如下:
A:super block超级块
B:block group des 磁盘上所有块组的块描述符
C:data block bitmap 块组0-15的所有数据块的使用位图
D:inode bitmap 块组0-15的所有节点表的使用位图
E:inode table 块组0-15的的所有节点表
F:Block data 块组0-15的数据块。
A,B,C,D,E的位置是在块组0上的,而F数据块是块组0中剩下的部分和块组1到块组15,在块组1-块组15的开头有时有超级块的备份或者块组描述符的备份,余下全部为数据块。
三.meta block group
在生成EXT4文件系统的时候,如果使用了特性meta_bg,则文件系统就支持meta block group的格式。如上文计算,如果磁盘块大小为4K,一个meta block group支持的块组数值为64个块组,具体结构如下:
附: SB 超级块
GDT属于本meta block group的块组描述符
BB 该块组的数据块位图
IB 该块组的节点位图
IT 该块组的节点表
DATA BLOCKS该块组的数据块
值得指出的是在块组0到块组63组成的一个meta block group中,只有三个块组中保存了属于本meta block group的块组描述符,保存的位置在块组0,块组1和块组63,也在上表的表现出来了。
四.flexible block group结合metablock group
在生成EXT4文件系统的时候,使用的特性结合了meta_bg和flexible_bg,那么磁盘的布局与单个参数的情况有点不一样了。假设磁盘块大小为4K,s_log_groups_per_flex为4,那么如上文分析的,flexible block group为16个块组一个单位,meta block group为64个块组为一个单位,两者结合的结构如下:
如上图所示,在一个metablock group中,共有64个块组,里面又细分为4个flexible block group,每个flexible block group又包含16个块组,得16X4共64个块组。
对于总的64个块组中,其保存了metablock group的特性,块组0包含超级块,本group的块组描述符,BB, IB, IT;块组1同样包含超级块,本group的块组描述符;块组63,包含本group的块组描述符。
对于细分的4个flexibleblock group,第一个flex_bg,块组0到块组15;第二个flex_bg,块组16到块组31;第三个flex_bg,块组32到块组47;最后一个flex_bg,块组48到块组63;对于具体的每个小组,以第一个flex_bg为例,块组0的BB是块组0-15的数据块位图,IB是块组0-15的节点位图,IT是块组0-15的节点表,以下皆为数据块。
五.其他
在生成EXT4文件系统中,如果使用了特性uninit_bg,有的块组就不会被初始化,磁盘格式化的速度会加快。四中的flexible block group结合meta block group的情况,假设块组1没被初始化,但是SB和GDT会写入块组1,后面的数据没被初始化,该块组也不会被加入到flexible block group中去,放入flexible block group的块组会跳过未初始化的块组1,选择下个块组,比如初始化的块组2,以下类推,未初始化的跳过。
如果使用了sparse_super参数,备份的超级块会出现在3,5,7为幂的块组中,其他块组中不会出现。