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的块组的数量由 2 s b . s _ l o g _ g r o u p s _ p e r _ f l e x 2 ^{sb.s\_{} log\_{}groups\_{}per\_{}flex} 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,则默认情况下,文件系统可以存 2 32 ∗ 4 K = 16 T 2^{32}*4K=16T 232∗4K=16T数据
- 如果用64bit来存储block count,则默认清空下,文件系统可以存 2 64 ∗ 4 K = 2 36 T 2^{64}*4K=2^{36}T 264∗4K=236T数据
- 假设磁盘容量222G,采用default config,可以计算:
已 知 : V = 222 G , b l o c k s i z e = 4 K , i n o d e s i z e = 256 b y t e , i n o d e r a t i o = 16384 b y t e = 16 K 已知:V = 222G,block size = 4K,inodesize = 256byte,inoderatio=16384byte=16K\\ 已知:V=222G,blocksize=4K,inodesize=256byte,inoderatio=16384byte=16K
可 得 : 可得: 可得:
b l o c k s i z e = V / b l o c k s i z e = 58195968 个 b l o c k s p e r g r o u p = b l o c k s i z e ∗ 8 = 32768 个 g r o u p c o u n t = b l o c k s i z e / b l o c k p e r g r o u p = 1776 个 I n o d e s p e r g r o u p = b l o c k s p e r g r o u p / 4 = 8192 个 i n o d e c o u n t = I n o d e s p e r g r o u p ∗ g r o u p c o u n t = 14548992 , 当 然 实 际 的 会 比 该 数 稍 等 大 i n o d e b l o c k s p e r g r o u p = I n o d e s p e r g r o u p ∗ 256 b y t e = I n o d e s p e r g r o u p ∗ 4 K / 16 = 512 个 b l o c k block \,size = V / blocksize = 58195968 个 \\ blocks \, per\, group = blocksize * 8 = 32768 个\\ group\, count = block\,size / block\,per\,group = 1776 个\\ Inodes\, per\, group = blocks \, per\, group / 4 = 8192 个 \\ inode\, count = Inodes\, per\, group * group\, count =14548992,当然实际的会比该数稍等大\\ inode\, blocks\, per\, group = Inodes\, per\, group * 256byte = Inodes\, per\, group * 4K / 16 = 512 个 block 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