超级块

超级块记录了关于包含文件系统的各种信息,例如块计数、inode 计数、支持的特性、维护信息等等。

如果设置了 sparse_super 特性标志,超级块和组描述符的冗余副本只保存在组号为 0 或 3、5、7 的幂次的组中。如果未设置该标志,冗余副本则保存在所有组中。

超级块校验和是针对超级块结构计算的,其中包括文件系统 UUID。

ext4 超级块在 struct ext4_super_block 中布局如下

偏移量

大小

名称

描述

0x0

__le32

s_inodes_count

总 inode 计数。

0x4

__le32

s_blocks_count_lo

总块计数。

0x8

__le32

s_r_blocks_count_lo

此数量的块只能由超级用户分配。

0xC

__le32

s_free_blocks_count_lo

空闲块计数。

0x10

__le32

s_free_inodes_count

空闲 inode 计数。

0x14

__le32

s_first_data_block

第一个数据块。对于 1k 块的文件系统,此值必须至少为 1,对于所有其他块大小,通常为 0。

0x18

__le32

s_log_block_size

块大小为 2 ^ (10 + s_log_block_size)。

0x1C

__le32

s_log_cluster_size

如果启用了 bigalloc,集群大小为 2 ^ (10 + s_log_cluster_size) 块。否则 s_log_cluster_size 必须等于 s_log_block_size。

0x20

__le32

s_blocks_per_group

每组块数。

0x24

__le32

s_clusters_per_group

如果启用了 bigalloc,每组集群数。否则 s_clusters_per_group 必须等于 s_blocks_per_group。

0x28

__le32

s_inodes_per_group

每组 inode 数。

0x2C

__le32

s_mtime

挂载时间,自 epoch 以来的秒数。

0x30

__le32

s_wtime

写入时间,自 epoch 以来的秒数。

0x34

__le16

s_mnt_count

自上次 fsck 以来的挂载次数。

0x36

__le16

s_max_mnt_count

需要 fsck 的最大挂载次数。

0x38

__le16

s_magic

魔术签名,0xEF53

0x3A

__le16

s_state

文件系统状态。更多信息请参见 super_state

0x3C

__le16

s_errors

检测到错误时的行为。更多信息请参见 super_errors

0x3E

__le16

s_minor_rev_level

次要修订级别。

0x40

__le32

s_lastcheck

上次检查时间,自 epoch 以来的秒数。

0x44

__le32

s_checkinterval

两次检查之间的最大时间间隔,单位秒。

0x48

__le32

s_creator_os

创建者操作系统。更多信息请参见表 super_creator

0x4C

__le32

s_rev_level

修订级别。更多信息请参见表 super_revision

0x50

__le16

s_def_resuid

保留块的默认 uid。

0x52

__le16

s_def_resgid

保留块的默认 gid。

这些字段仅适用于 EXT4_DYNAMIC_REV 超级块。

注意:兼容特性集和不兼容特性集之间的区别在于,如果不兼容特性集中设置了内核不认识的位,它应该拒绝挂载文件系统。

e2fsck 的要求更严格;如果它在兼容或不兼容特性集中不认识某个特性,它必须中止并且不尝试干预它不理解的事情...

0x54

__le32

s_first_ino

第一个非保留 inode。

0x58

__le16

s_inode_size

inode 结构的大小,单位字节。

0x5A

__le16

s_block_group_nr

此超级块的块组号。

0x5C

__le32

s_feature_compat

兼容特性集标志。即使内核不理解某个标志,它仍然可以读/写此文件系统;fsck 不应这样做。更多信息请参见 super_compat 表。

0x60

__le32

s_feature_incompat

不兼容特性集。如果内核或 fsck 不理解其中一个位,它应该停止。更多信息请参见 super_incompat 表。

0x64

__le32

s_feature_ro_compat

只读兼容特性集。如果内核不理解其中一个位,它仍然可以只读挂载。更多信息请参见 super_rocompat 表。

0x68

__u8

s_uuid[16]

卷的 128 位 UUID。

0x78

char

s_volume_name[16]

卷标。

0x88

char

s_last_mounted[64]

文件系统上次挂载的目录。

0xC8

__le32

s_algorithm_usage_bitmap

用于压缩(未在 e2fsprogs/Linux 中使用)

性能提示。目录预分配只应在 EXT4_FEATURE_COMPAT_DIR_PREALLOC 标志开启时发生。

0xCC

__u8

s_prealloc_blocks

要为...文件预分配的块数?(未在 e2fsprogs/Linux 中使用)

0xCD

__u8

s_prealloc_dir_blocks

要为目录预分配的块数。(未在 e2fsprogs/Linux 中使用)

0xCE

__le16

s_reserved_gdt_blocks

为未来文件系统扩展保留的 GDT 条目数。

仅当设置了 EXT4_FEATURE_COMPAT_HAS_JOURNAL 时,日志支持才有效。

0xD0

__u8

s_journal_uuid[16]

日志超级块的 UUID

0xE0

__le32

s_journal_inum

日志文件的 inode 号。

0xE4

__le32

s_journal_dev

如果设置了外部日志特性标志,则为日志文件的设备号。

0xE8

__le32

s_last_orphan

要删除的孤立 inode 列表的开始。

0xEC

__le32

s_hash_seed[4]

HTREE 哈希种子。

0xFC

__u8

s_def_hash_version

用于目录哈希的默认哈希算法。更多信息请参见 super_def_hash

0xFD

__u8

s_jnl_backup_type

如果此值为 0 或 EXT3_JNL_BACKUP_BLOCKS (1),则 s_jnl_blocks 字段包含 inode 的 i_block[] 数组和 i_size 的副本。

0xFE

__le16

s_desc_size

如果设置了 64bit 不兼容特性标志,则为组描述符的大小,单位字节。

0x100

__le32

s_default_mount_opts

默认挂载选项。更多信息请参见 super_mountopts 表。

0x104

__le32

s_first_meta_bg

如果启用了 meta_bg 特性,则为第一个元数据块组。

0x108

__le32

s_mkfs_time

文件系统创建时间,自 epoch 以来的秒数。

0x10C

__le32

s_jnl_blocks[17]

日志 inode 的 i_block[] 数组(前 15 个元素)、i_size_high 和 i_size(第 16 和 17 个元素)的备份副本。

仅当设置了 EXT4_FEATURE_COMPAT_64BIT 时,64 位支持才有效。

0x150

__le32

s_blocks_count_hi

块计数的高 32 位。

0x154

__le32

s_r_blocks_count_hi

保留块计数的高 32 位。

0x158

__le32

s_free_blocks_count_hi

空闲块计数的高 32 位。

0x15C

__le16

s_min_extra_isize

所有 inode 至少有 # 字节。

0x15E

__le16

s_want_extra_isize

新 inode 应保留 # 字节。

0x160

__le32

s_flags

杂项标志。更多信息请参见 super_flags 表。

0x164

__le16

s_raid_stride

RAID 步幅。这是在移动到下一个磁盘之前从磁盘读取或写入的逻辑块数。这会影响文件系统元数据的放置,希望能够加快 RAID 存储速度。

0x166

__le16

s_mmp_interval

多重挂载预防 (MMP) 检查的等待秒数。理论上,MMP 是一种在超级块中记录哪个主机和设备挂载了文件系统的机制,以防止多重挂载。此功能似乎尚未实现...

0x168

__le64

s_mmp_block

多重挂载保护数据的块号。

0x170

__le32

s_raid_stripe_width

RAID 条带宽度。这是在返回当前磁盘之前从磁盘读取或写入的逻辑块数。块分配器使用此值来尝试减少 RAID5/6 中的读-修改-写操作次数。

0x174

__u8

s_log_groups_per_flex

弹性块组的大小是 2 ^ s_log_groups_per_flex

0x175

__u8

s_checksum_type

元数据校验和算法类型。唯一有效值为 1 (crc32c)。

0x176

__u8

s_encryption_level

加密的版本级别。

0x177

__u8

s_reserved_pad

填充到下一个 32 位。

0x178

__le64

s_kbytes_written

此文件系统在其生命周期内写入的 KiB 数。

0x180

__le32

s_snapshot_inum

活动快照的 inode 号。(未在 e2fsprogs/Linux 中使用。)

0x184

__le32

s_snapshot_id

活动快照的序列 ID。(未在 e2fsprogs/Linux 中使用。)

0x188

__le64

s_snapshot_r_blocks_count

为活动快照未来使用保留的块数。(未在 e2fsprogs/Linux 中使用。)

0x190

__le32

s_snapshot_list

磁盘上快照列表头部的 inode 号。(未在 e2fsprogs/Linux 中使用。)

0x194

__le32

s_error_count

遇到的错误数。

0x198

__le32

s_first_error_time

第一次发生错误的时间,自 epoch 以来的秒数。

0x19C

__le32

s_first_error_ino

第一次错误涉及的 inode。

0x1A0

__le64

s_first_error_block

第一次错误涉及的块号。

0x1A8

__u8

s_first_error_func[32]

发生错误的函数名称。

0x1C8

__le32

s_first_error_line

发生错误的行号。

0x1CC

__le32

s_last_error_time

最近一次错误发生的时间,自 epoch 以来的秒数。

0x1D0

__le32

s_last_error_ino

最近一次错误涉及的 inode。

0x1D4

__le32

s_last_error_line

最近一次错误发生时的行号。

0x1D8

__le64

s_last_error_block

最近一次错误涉及的块号。

0x1E0

__u8

s_last_error_func[32]

最近一次错误发生时的函数名称。

0x200

__u8

s_mount_opts[64]

挂载选项的 ASCIIZ 字符串。

0x240

__le32

s_usr_quota_inum

用户 quota 文件的 inode 号。

0x244

__le32

s_grp_quota_inum

quota 文件的 inode 号。

0x248

__le32

s_overhead_blocks

文件系统中的开销块/集群。(什么?此字段始终为零,这意味着内核会动态计算它。)

0x24C

__le32

s_backup_bgs[2]

包含超级块备份的块组(如果 sparse_super2)

0x254

__u8

s_encrypt_algos[4]

使用的加密算法。在任何时候最多可以使用四种算法;有效算法代码在下面的 super_encrypt 表中给出。

0x258

__u8

s_encrypt_pw_salt[16]

用于加密的 string2key 算法的 salt 值。

0x268

__le32

s_lpf_ino

lost+found 的 inode 号

0x26C

__le32

s_prj_quota_inum

跟踪项目配额的 inode。

0x270

__le32

s_checksum_seed

用于 metadata_csum 计算的校验和种子。此值为 crc32c(~0, $orig_fs_uuid)。

0x274

__u8

s_wtime_hi

s_wtime 字段的高 8 位。

0x275

__u8

s_mtime_hi

s_mtime 字段的高 8 位。

0x276

__u8

s_mkfs_time_hi

s_mkfs_time 字段的高 8 位。

0x277

__u8

s_lastcheck_hi

s_lastcheck 字段的高 8 位。

0x278

__u8

s_first_error_time_hi

s_first_error_time 字段的高 8 位。

0x279

__u8

s_last_error_time_hi

s_last_error_time 字段的高 8 位。

0x27A

__u8

s_first_error_errcode

0x27B

__u8

s_last_error_errcode

0x27C

__le16

s_encoding

文件名字符集编码。

0x27E

__le16

s_encoding_flags

文件名字符集编码标志。

0x280

__le32

s_orphan_file_inum

孤立文件 inode 号。

0x284

__le32

s_reserved[94]

填充到块的末尾。

0x3FC

__le32

s_checksum

超级块校验和。

超级块状态是以下各项的某种组合

描述

0x0001

干净卸载

0x0002

检测到错误

0x0004

正在恢复孤立文件

超级块错误策略是以下之一

描述

1

继续

2

重新挂载为只读

3

恐慌

文件系统创建者是以下之一

描述

0

Linux

1

Hurd

2

Masix

3

FreeBSD

4

Lites

超级块修订版是以下之一

描述

0

原始格式

1

带有动态 inode 大小的 v2 格式

请注意,EXT4_DYNAMIC_REV 指的是版本 1 或更新的文件系统。

超级块兼容特性字段是以下任意组合

描述

0x1

目录预分配 (COMPAT_DIR_PREALLOC)。

0x2

“imagic inodes”。代码中不清楚其作用 (COMPAT_IMAGIC_INODES)。

0x4

有日志 (COMPAT_HAS_JOURNAL)。

0x8

支持扩展属性 (COMPAT_EXT_ATTR)。

0x10

为文件系统扩展保留 GDT 块 (COMPAT_RESIZE_INODE)。需要 RO_COMPAT_SPARSE_SUPER。

0x20

有目录索引 (COMPAT_DIR_INDEX)。

0x40

“Lazy BG”。不在 Linux 内核中,似乎用于未初始化的块组?(COMPAT_LAZY_BG)

0x80

“排除 inode”。未使用。(COMPAT_EXCLUDE_INODE)。

0x100

“排除位图”。似乎用于指示存在与快照相关的排除位图?未在内核中定义或在 e2fsprogs 中使用 (COMPAT_EXCLUDE_BITMAP)。

0x200

稀疏超级块,v2。如果设置了此标志,SB 字段 s_backup_bgs 指向包含备份超级块的两个块组 (COMPAT_SPARSE_SUPER2)。

0x400

支持快速提交。尽管快速提交块向后不兼容,但日志中并非总是存在快速提交块。如果日志中存在快速提交块,则设置 JBD2 不兼容特性 (JBD2_FEATURE_INCOMPAT_FAST_COMMIT) (COMPAT_FAST_COMMIT)。

0x1000

已分配孤立文件。这是一种特殊文件,用于更有效地跟踪未链接但仍打开的 inode。当文件中可能存在任何条目时,我们还会设置适当的 rocompat 特性 (RO_COMPAT_ORPHAN_PRESENT)。

超级块不兼容特性字段是以下任意组合

描述

0x1

压缩 (INCOMPAT_COMPRESSION)。

0x2

目录条目记录文件类型。请参见下面的 ext4_dir_entry_2 (INCOMPAT_FILETYPE)。

0x4

文件系统需要恢复 (INCOMPAT_RECOVER)。

0x8

文件系统有独立的日志设备 (INCOMPAT_JOURNAL_DEV)。

0x10

元块组。请参见前面关于此特性的讨论 (INCOMPAT_META_BG)。

0x40

此文件系统中的文件使用区段 (INCOMPAT_EXTENTS)。

0x80

启用 2^64 块的文件系统大小 (INCOMPAT_64BIT)。

0x100

多重挂载保护 (INCOMPAT_MMP)。

0x200

弹性块组。请参见前面关于此特性的讨论 (INCOMPAT_FLEX_BG)。

0x400

Inode 可用于存储大型扩展属性值 (INCOMPAT_EA_INODE)。

0x1000

目录条目中的数据 (INCOMPAT_DIRDATA)。(未实现?)

0x2000

元数据校验和种子存储在超级块中。此特性允许管理员在文件系统挂载时更改 metadata_csum 文件系统的 UUID;如果没有它,校验和定义要求重写所有元数据块 (INCOMPAT_CSUM_SEED)。

0x4000

大型目录 >2GB 或 3 级 htree (INCOMPAT_LARGEDIR)。在此特性之前,目录不能大于 4GiB,并且 htree 深度不能超过 2 级。如果启用此特性,目录可以大于 4GiB,并且最大 htree 深度为 3。

0x8000

inode 中的数据 (INCOMPAT_INLINE_DATA)。

0x10000

文件系统上存在加密 inode。(INCOMPAT_ENCRYPT)。

超级块只读兼容特性字段是以下任意组合

描述

0x1

稀疏超级块。请参见前面关于此特性的讨论 (RO_COMPAT_SPARSE_SUPER)。

0x2

此文件系统已用于存储大于 2GiB 的文件 (RO_COMPAT_LARGE_FILE)。

0x4

未在内核或 e2fsprogs 中使用 (RO_COMPAT_BTREE_DIR)。

0x8

此文件系统具有以逻辑块为单位(而非 512 字节扇区)表示大小的文件。这确实意味着一个非常大的文件!(RO_COMPAT_HUGE_FILE)

0x10

组描述符有校验和。除了检测损坏之外,这对于未初始化组的惰性格式化也很有用 (RO_COMPAT_GDT_CSUM)。

0x20

指示旧的 ext3 32,000 子目录限制不再适用 (RO_COMPAT_DIR_NLINK)。如果目录的 i_links_count 增加超过 64,999,它将被设置为 1。

0x40

指示此文件系统上存在大型 inode (RO_COMPAT_EXTRA_ISIZE)。

0x80

此文件系统有快照 (RO_COMPAT_HAS_SNAPSHOT)。

0x100

配额 (RO_COMPAT_QUOTA)。

0x200

此文件系统支持“bigalloc”,这意味着文件区段以集群(块的)而不是块为单位进行跟踪 (RO_COMPAT_BIGALLOC)。

0x400

此文件系统支持元数据校验和。(RO_COMPAT_METADATA_CSUM;隐含 RO_COMPAT_GDT_CSUM,尽管 GDT_CSUM 不得设置)

0x800

文件系统支持副本。此特性既不在内核中,也不在 e2fsprogs 中。(RO_COMPAT_REPLICA)

0x1000

只读文件系统映像;内核不会以读写方式挂载此映像,并且大多数工具将拒绝写入此映像。(RO_COMPAT_READONLY)

0x2000

文件系统跟踪项目配额。(RO_COMPAT_PROJECT)

0x8000

Verity inode 可能存在于文件系统上。(RO_COMPAT_VERITY)

0x10000

指示孤立文件可能包含有效的孤立条目,因此在挂载文件系统时需要清理它们 (RO_COMPAT_ORPHAN_PRESENT)。

s_def_hash_version 字段是以下之一

描述

0x0

传统。

0x1

半 MD4。

0x2

Tea。

0x3

传统,无符号。

0x4

半 MD4,无符号。

0x5

Tea,无符号。

s_default_mount_opts 字段是以下任意组合

描述

0x0001

(重新)挂载时打印调试信息。(EXT4_DEFM_DEBUG)

0x0002

新文件采用包含目录的 gid(而不是当前进程的 fsgid)。(EXT4_DEFM_BSDGROUPS)

0x0004

支持用户空间提供的扩展属性。(EXT4_DEFM_XATTR_USER)

0x0008

支持 POSIX 访问控制列表 (ACL)。(EXT4_DEFM_ACL)

0x0010

不支持 32 位 UID。(EXT4_DEFM_UID16)

0x0020

所有数据和元数据都提交到日志。(EXT4_DEFM_JMODE_DATA)

0x0040

在元数据提交到日志之前,所有数据都刷新到磁盘。(EXT4_DEFM_JMODE_ORDERED)

0x0060

数据排序不保留;数据可能在元数据写入后写入。(EXT4_DEFM_JMODE_WBACK)

0x0100

禁用写入刷新。(EXT4_DEFM_NOBARRIER)

0x0200

跟踪文件系统中哪些块是元数据,因此不应作为数据块使用。此选项有望在 3.18 中默认启用。(EXT4_DEFM_BLOCK_VALIDITY)

0x0400

启用 DISCARD 支持,即通知存储设备块变得未使用。(EXT4_DEFM_DISCARD)

0x0800

禁用延迟分配。(EXT4_DEFM_NODELALLOC)

s_flags 字段是以下任意组合

描述

0x0001

使用有符号目录哈希。

0x0002

使用无符号目录哈希。

0x0004

用于测试开发代码。

s_encrypt_algos 列表可以包含以下任意项

描述

0

无效算法 (ENCRYPTION_MODE_INVALID)。

1

XTS 模式下的 256 位 AES (ENCRYPTION_MODE_AES_256_XTS)。

2

GCM 模式下的 256 位 AES (ENCRYPTION_MODE_AES_256_GCM)。

3

CBC 模式下的 256 位 AES (ENCRYPTION_MODE_AES_256_CBC)。

超级块的总大小为 1024 字节。