Ext4文件系统也是由相关数据结构组成,按照数据结构存放位置可以分为Ext4磁盘数据结构和Ext4内存数据结构.
Ext 磁盘数据结构
- 标准块
弹性块
从ext4开始,有一个新功能称为弹性块组(flex_bg)。在flex_bg中,几个块组绑在一起,成为一个逻辑块组。flex_bg的第一个块组中的位图空间和inode表空间被扩展为包括flex_bg中所有其他块组的位图和inode表。例如,如果flex_bg大小为4,则组0将包含(按顺序)超级块,组描述符,组0-3的数据块位图,组0-3的inode位图,组0-3的inode表,组0中的剩余空间用于文件数据。这样的效果是将块元数据紧密地分组在一起,以加快加载速度,并使大文件在磁盘上连续。超级块和组描述符的备份副本始终位于块组的开头,即使启用了flex_bg。组成flex_bg的块组的数量由2sb.s_log_groups_per_flex。
block 相关计算
- block size 在 磁盘格式化的时候就固定下来,使用mke2fs工具进行格式化时,可以指定 block size 等参数
- block-size: 只能为 1K/2K/4K bytes.一般不用指定,会采用/etc/mke2fs.conf 中的配置
| 磁盘容量 |
mke2fs.conf中的配置 |
block-size(K) |
inode-size(byte) |
inode-ratio(byte) |
file system type |
| V < 3M |
floppy |
1 |
128 |
8192 |
ext2 |
| 3M < V < 512 |
small |
1 |
128 |
4096 |
ext2 |
| 4T< V < 16T |
big |
4 |
256 |
32768 |
ext4 |
| V > 16T |
hug |
4 |
256 |
65536 |
ext4 |
| other |
default |
4 |
256 |
16384 |
ext4 |

- inode-ratio: bytes-per-inode,即 多少个字节的数据可以分配到一个inode,根据该信息和磁盘容量就可以计算出inode count
- 默认块大小为4KiB,每个组将包含32,768个块,长度为128MiB
- 如果用32bit来存储block count,则默认情况下,文件系统可以存232∗4K=16T数据
- 如果用64bit来存储block count,则默认清空下,文件系统可以存264∗4K=236T数据
- 假设磁盘容量222G,采用default config,可以计算:
已知:V=222G,blocksize=4K,inodesize=256byte,inoderatio=16384byte=16K
可得:
blocksize=V/blocksize=58195968个blockspergroup=blocksize∗8=32768个groupcount=blocksize/blockpergroup=1776个Inodespergroup=blockspergroup/4=8192个inodecount=Inodespergroup∗groupcount=14548992,当然实际的会比该数稍等大inodeblockspergroup=Inodespergroup∗256byte=Inodespergroup∗4K/16=512个block
- group 可能的排列
| index |
super block |
group descriptor |
reserved GDT |
Block bitmap |
Inode bitmap |
Inode table |
| group 0 |
0 |
1-14 |
15-1024 |
1025 |
1041 |
1057-1568 |
| group 1 |
32768 |
32769-32782 |
32783-33792 |
1026 |
1042 |
1569-2080 |
| group2 |
|
|
|
1027 |
1043 |
2081-2592 |
| group3 |
98304 |
98305-98318 |
98319-99328 |
1028 |
1044 |
2593-3104 |
| group4 |
|
|
|
1029 |
1045 |
3105-3616 |
| … |
|
|
|
|
|
|
struct
- super block
- group descriptor
- inode
相关文章: