块组描述符

文件系统上的每个块组都有一个与其关联的描述符。如上文“布局”部分所述,组描述符(如果存在)是块组中的第二个项。标准配置是每个块组都包含块组描述符表的完整副本,除非设置了 sparse_super 功能标志。

请注意,组描述符如何记录位图和 inode 表的位置(即它们可以浮动)。这意味着在一个块组内,唯一具有固定数据结构的是超级块和组描述符表。flex_bg 机制利用此特性将几个块组分组为一个 flex 组,并将所有组的位图和 inode 表安排在 flex 组的第一个组中,形成一个长条连续区域。

如果设置了 meta_bg 功能标志,则将几个块组组合成一个元组。但请注意,在 meta_bg 的情况下,较大元组内的第一个和最后两个块组仅包含元组内部组的组描述符。

flex_bg 和 meta_bg 似乎不是互斥功能。

在 ext2、ext3 和 ext4(当未启用 64 位功能时),块组描述符仅长 32 字节,因此在 bg_checksum 处结束。在启用了 64 位功能的 ext4 文件系统上,块组描述符扩展到至少下面描述的 64 字节;其大小存储在超级块中。

如果设置了 gdt_csum 但未设置 metadata_csum,则块组校验和是 FS UUID、组号和组描述符结构的 crc16。如果设置了 metadata_csum,则块组校验和是 FS UUID、组号和组描述符结构校验和的低 16 位。块和 inode 位图校验和都是根据 FS UUID、组号和整个位图计算的。

块组描述符在 struct ext4_group_desc 中定义。

偏移量

大小

名称

描述

0x0

__le32

bg_block_bitmap_lo

块位图位置的低 32 位。

0x4

__le32

bg_inode_bitmap_lo

inode 位图位置的低 32 位。

0x8

__le32

bg_inode_table_lo

inode 表位置的低 32 位。

0xC

__le16

bg_free_blocks_count_lo

空闲块计数的低 16 位。

0xE

__le16

bg_free_inodes_count_lo

空闲 inode 计数的低 16 位。

0x10

__le16

bg_used_dirs_count_lo

目录计数的低 16 位。

0x12

__le16

bg_flags

块组标志。参见下面的 bgflags 表。

0x14

__le32

bg_exclude_bitmap_lo

快照排除位图位置的低 32 位。

0x18

__le16

bg_block_bitmap_csum_lo

块位图校验和的低 16 位。

0x1A

__le16

bg_inode_bitmap_csum_lo

inode 位图校验和的低 16 位。

0x1C

__le16

bg_itable_unused_lo

未使用 inode 计数的低 16 位。如果设置,我们无需扫描此组的 inode 表中超出 (sb.s_inodes_per_group - gdt.bg_itable_unused) 个条目。

0x1E

__le16

bg_checksum

组描述符校验和;如果设置了 RO_COMPAT_GDT_CSUM 功能,则为 crc16(sb_uuid+group_num+bg_desc),如果设置了 RO_COMPAT_METADATA_CSUM 功能,则为 crc32c(sb_uuid+group_num+bg_desc) & 0xFFFF。计算 crc16 校验和时跳过 bg_desc 中的 bg_checksum 字段,如果使用 crc32c 校验和则将其设置为零。

这些字段仅在启用 64 位功能且 s_desc_size > 32 时存在。

0x20

__le32

bg_block_bitmap_hi

块位图位置的高 32 位。

0x24

__le32

bg_inode_bitmap_hi

inode 位图位置的高 32 位。

0x28

__le32

bg_inode_table_hi

inode 表位置的高 32 位。

0x2C

__le16

bg_free_blocks_count_hi

空闲块计数的高 16 位。

0x2E

__le16

bg_free_inodes_count_hi

空闲 inode 计数的高 16 位。

0x30

__le16

bg_used_dirs_count_hi

目录计数的高 16 位。

0x32

__le16

bg_itable_unused_hi

未使用 inode 计数的高 16 位。

0x34

__le32

bg_exclude_bitmap_hi

快照排除位图位置的高 32 位。

0x38

__le16

bg_block_bitmap_csum_hi

块位图校验和的高 16 位。

0x3A

__le16

bg_inode_bitmap_csum_hi

inode 位图校验和的高 16 位。

0x3C

__u32

bg_reserved

填充至 64 字节。

块组标志可以是以下任意组合

描述

0x1

inode 表和位图未初始化 (EXT4_BG_INODE_UNINIT)。

0x2

块位图未初始化 (EXT4_BG_BLOCK_UNINIT)。

0x4

inode 表已清零 (EXT4_BG_INODE_ZEROED)。