linux ext2文件系统

Ext4文件系统也是由相关数据结构组成,按照数据结构存放位置可以分为Ext4磁盘数据结构和Ext4内存数据结构.

Ext 磁盘数据结构

  • 标准块
    linux ext2文件系统

弹性块

从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_flex2 ^{sb.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

linux ext2文件系统

  • inode-ratio: bytes-per-inode,即 多少个字节的数据可以分配到一个inode,根据该信息和磁盘容量就可以计算出inode count
  • 默认块大小为4KiB,每个组将包含32,768个块,长度为128MiB
  • 如果用32bit来存储block count,则默认情况下,文件系统可以存2324K=16T2^{32}*4K=16T数据
  • 如果用64bit来存储block count,则默认清空下,文件系统可以存2644K=236T2^{64}*4K=2^{36}T数据
  • 假设磁盘容量222G,采用default config,可以计算:
    V=222Gblocksize=4K,inodesize=256byte,inoderatio=16384byte=16K 已知:V = 222G,block size = 4K,inodesize = 256byte,inoderatio=16384byte=16K\\
    可得:
    blocksize=V/blocksize=58195968blockspergroup=blocksize8=32768groupcount=blocksize/blockpergroup=1776Inodespergroup=blockspergroup/4=8192inodecount=Inodespergroupgroupcount=14548992,inodeblockspergroup=Inodespergroup256byte=Inodespergroup4K/16=512block 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
  • 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