块组描述符¶
文件系统上的每个块组都有一个与其关联的描述符。如上文“布局”部分所述,组描述符(如果存在)是块组中的第二个项。标准配置是每个块组都包含块组描述符表的完整副本,除非设置了 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 表中超出 |
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)。 |