ext4文件系统的磁盘布局是先把磁盘分成一个个相同大小的block块(每个block块的大小默认是4K),然后把这些block块合成一个个group。
group大小最大为256M(默认为256M),其计算公式:
Group_size = (blk_size*8)*blk_size=4096*8*4096= 32768*4096=128M
更详细一点如下,针对第一个group(即group0)而言:
Group |
||
功能 |
占用块数 |
备注 |
Group0 padding |
1024bytes |
仅group0含有 |
ext4 super block |
1 block |
仅某些group含有 |
Group Descriptors |
many blocks |
仅某些group含有 |
Reserved GDT Blocks |
many blocks |
仅某些group含有 |
Data Block Bitmap |
1 block |
所有group均含有 |
inode Bitmap |
1 block |
所有group均含有 |
inode Table |
many blocks |
所有group均含有 |
Data Blocks |
many more blocks |
所有group均含有 |
Group0最前面的1024bytes用作它用(比如启动引导等),当然也只有group0中的前1024bytes是保留的,其他任何的group都不会保留。
Ext4 super block大小大约为0x2D0(即720)bytes,如果block块大小为2K或4K,那么super block将存放在第一个block(索引为0)中;如果block块为1K,则super block将存放在第二个block(索引为1)中;如果block块为512bytes(很少设置为这个值了),则super block将存放在第三、四个block(索引为2,3)中。
Group Descriptors blocks(简称GDBs),每一个描述符的大小64byte,GDBs所占用block多少是与卷的大小有关的。
Reserved GDT Blocks(简称RGDTBs),为卷扩容预留的空间。
需要注意的是:superblock有备份机制(关于超级块的备份机制,请阅本系列相关文章),超级块备份时,GDBs数据也是会备份的。而GDBs和RGDTBs一般共计128个blocks。关于flexgroup分析,
Data block bitmap,用于描述本group(即对应所在的group)内各个block块的使用状态,一个bit位对应标识一个block块,如果该bit为0,则表示对应block块为空闲状态,否则表示为使用状态或其它(比如物理上不存在,发生在最后一个group最靠后的位置)。如果一个block块大小为4K,那么可以映射标识4*1024*8=32768个block块的使用状态;由于一个group只有一个Data Block Bitmap block块,所以一个group组最大为32768*4KB=128MB。
Inode bitmap,用于描述本group(即对应所在的group)内inodetable中各个inode项的使用状态,一个bit位对应标识一个inode项,如果该bit为0,则表示对应inode table的inode项为空闲状态,否则表示为使用状态。Inode bitmap在每个group中均占用一个block,每个group中可创建文件多少就是由inode bitmap决定的,4K大小的block块可以映射标识4096*8=32768个inode,即是一个group组最多只有32768个inode。,。
Inode table:用于存放inode数据,一个inode数据大小为256bytes,inode block默认为512个block,所以一个group中的文件多少为512*4096/256=8192个。
Datablock,(除去之前那么几类数据,剩余的block全部为data blocks)用于存放普通数据。
注:由于ext4系统引入了Flexible group的概念,本文可以理解为不支持flex_bg特性。
关于flex group分析,请阅本系列其他文章。
作者:Younger Liu,
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。