超级块概述
在 EXT2 文件系统中,超级块(superblock)是一个非常重要的数据结构,包含了文件系统的全局信息。每个文件系统都有一个超级块,位于文件系统的第一个块之后,通常在块组的起始处。
超级块包含以下关键信息:
- 文件系统的大小:块总数、空闲块数、inode 总数等。
- 块和 inode 的大小:描述数据块和 inode 的尺寸。
- 文件系统状态:例如文件系统是否干净或是否发生错误。
- 挂载信息:挂载次数、最后挂载时间、上次检查时间等。
- 特性支持:例如是否支持扩展属性、目录索引等功能。
- 保留块数:为系统管理员保留的块数量,以防止磁盘满时影响系统操作。
超级块还存储了文件系统的创建时间和 UUID,用于唯一标识文件系统。
创建模拟设备
- 创建虚拟设备
创建一个100M的磁盘设备,并进行分区和格式化为ext2文件系统
dd if=/dev/zero of=./disk.img bs=1M count=100
fdisk disk.img
losetup -fP disk.img
mkfs.ext2 /dev/loop0p1
- 查看超级块
[root@node09 ~]# dumpe2fs /dev/loop0
dumpe2fs 1.42.9 (28-Dec-2013)
dumpe2fs: Bad magic number in super-block while trying to open /dev/loop0
Couldn't find valid filesystem superblock.
[root@node09 ~]# dumpe2fs /dev/loop0p1
[root@node09 ~]# dumpe2fs /dev/loop0p1
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: b2986a8e-5b67-40c3-aa75-495e250daa56
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: ext_attr resize_inode dir_index filetype sparse_super
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 25376
Block count: 101376
Reserved block count: 5068
Free blocks: 96615
Free inodes: 25365
First block: 1
Block size: 1024
Fragment size: 1024
Reserved GDT blocks: 256
Blocks per group: 8192
Fragments per group: 8192
Inodes per group: 1952
Inode blocks per group: 244
Filesystem created: Fri Sep 13 15:56:48 2024
Last mount time: n/a
Last write time: Fri Sep 13 15:56:48 2024
Mount count: 0
Maximum mount count: -1
Last checked: Fri Sep 13 15:56:48 2024
Check interval: 0 (<none>)
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 128
Default directory hash: half_md4
Directory Hash Seed: 8b289b24-46fe-412c-8be1-96ec46b08e0d
Group 0: (Blocks 1-8192)
Primary superblock at 1, Group descriptors at 2-2
Reserved GDT blocks at 3-258
Block bitmap at 259 (+258), Inode bitmap at 260 (+259)
Inode table at 261-504 (+260)
7674 free blocks, 1941 free inodes, 2 directories
Free blocks: 519-8192
Free inodes: 12-1952
Group 1: (Blocks 8193-16384)
Backup superblock at 8193, Group descriptors at 8194-8194
Reserved GDT blocks at 8195-8450
Block bitmap at 8451 (+258), Inode bitmap at 8452 (+259)
Inode table at 8453-8696 (+260)
7688 free blocks, 1952 free inodes, 0 directories
Free blocks: 8697-16384
Free inodes: 1953-3904
Group 2: (Blocks 16385-24576)
Block bitmap at 16385 (+0), Inode bitmap at 16386 (+1)
Inode table at 16387-16630 (+2)
7946 free blocks, 1952 free inodes, 0 directories
Free blocks: 16631-24576
Free inodes: 3905-5856
Group 3 ....
....
解读超级块
以上输出信息的详细解释
一般信息:
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: <none>
- dumpe2fs 1.42.9:
dumpe2fs
工具的版本。
- /dev/loop0p1: 被检查的设备或回环文件系统(这是一个回环设备上的分区)。
文件系统详情:
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: b2986a8e-5b67-40c3-aa75-495e250daa56
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
- Filesystem volume name: 没有设置卷标。
- Last mounted on: 没有可用信息,因为文件系统尚未挂载。
- Filesystem UUID: 文件系统的唯一标识符(UUID),可用于在重启后识别该文件系统。
- Filesystem magic number:
0xEF53
,标识此文件系统为 ext2/ext3/ext4 类型。 - Filesystem revision #: 1(动态),表示该文件系统支持动态特性集。
文件系统特性:
Filesystem features: ext_attr resize_inode dir_index filetype sparse_super
- ext_attr: 支持扩展属性(用于 ACL、安全标签等)。
- resize_inode: 支持调整文件系统大小。
- dir_index: 目录索引已启用,这可以加快目录查找速度。
- filetype: 文件系统在目录项中记录文件类型。
- sparse_super: 使用稀疏超级块,减少开销,只在部分组中存储超级块备份。
文件系统标志:
Filesystem flags: signed_directory_hash
- signed_directory_hash: 文件系统使用签名的目录哈希,用于确保使用哈希 B 树的目录的完整性。
默认挂载选项:
Default mount options: user_xattr acl
- user_xattr: 默认启用用户扩展属性。
- acl: 默认启用访问控制列表(ACL)。
文件系统状态:
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
- Filesystem state: 干净,表示文件系统处于良好状态。
- Errors behavior: 发现错误时系统会继续工作。
- Filesystem OS type: 文件系统所属的操作系统类型。
Inode 和块信息:
Inode count: 25376
Block count: 101376
Reserved block count: 5068
Free blocks: 96615
Free inodes: 25365
First block: 1
Block size: 1024
Fragment size: 1024
Reserved GDT blocks: 256
- Inode count: 25,376 个 inode(用于存储元数据的索引节点数量)。
- Block count: 101,376 个块(总数据块数)。
- Reserved block count: 为 root 用户保留 5,068 个块,防止磁盘填满时系统无法正常运行。
- Free blocks: 96,615 个空闲块(未使用)。
- Free inodes: 25,365 个空闲 inode,表示大多数文件存储空间尚未使用。
- First block: 第 1 块是第一个数据块。
- Block size: 1,024 字节,每个块大小为 1KB。
- Fragment size: 1,024 字节(碎片是子块单位,这里与块大小一致)。
- Reserved GDT blocks: 为组描述符表(GDT)保留 256 个块,GDT 包含块组的元数据。
块组信息:
Blocks per group: 8192
Fragments per group: 8192
Inodes per group: 1952
Inode blocks per group: 244
- Blocks per group: 每个块组包含 8,192 个块。
- Fragments per group: 每个块组包含 8,192 个碎片。
- Inodes per group: 每个块组包含 1,952 个 inode。
- Inode blocks per group: 每个块组用 244 个块来存储 inode。
文件系统创建与维护:
Filesystem created: Fri Sep 13 15:56:48 2024
Last mount time: n/a
Last write time: Fri Sep 13 15:56:48 2024
Mount count: 0
Maximum mount count: -1
Last checked: Fri Sep 13 15:56:48 2024
Check interval: 0 (<none>)
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
- Filesystem created: 文件系统创建时间为 2024 年 9 月 13 日 15:56:48。
- Last mount time: 没有可用信息,因为尚未挂载。
- Last write time: 文件系统创建时的时间,即 2024 年 9 月 13 日 15:56:48。
- Mount count: 0,表示文件系统尚未挂载。
- Maximum mount count: -1,表示没有强制性挂载次数检查。
- Last checked: 文件系统最后检查时间与创建时间相同。
- Check interval: 0,表示没有设置自动检查间隔。
- Reserved blocks uid: 0,表示 root 用户(UID 0)可以使用保留块。
- Reserved blocks gid: 0,表示 root 组(GID 0)可以使用保留块。
其他元数据:
First inode: 11
Inode size: 128
Default directory hash: half_md4
Directory Hash Seed: 8b289b24-46fe-412c-8be1-96ec46b08e0d
- First inode: 第一个 inode 的索引是 11。
- Inode size: 每个 inode 为 128 字节(用于存储文件的元数据)。
- Default directory hash:
half_md4
,用于目录索引的哈希算法。 - Directory Hash Seed: 用于创建目录项哈希的种子值。
总体来看,该文件系统处于干净状态,块和 inode 的使用率较低,具备扩展属性、ACL、目录索引等功能,适合多种使用场景。
Group 0 的布局和使用情况
Group 0: (Blocks 1-8192)
Primary superblock at 1, Group descriptors at 2-2
Reserved GDT blocks at 3-258
Block bitmap at 259 (+258), Inode bitmap at 260 (+259)
Inode table at 261-504 (+260)
7674 free blocks, 1941 free inodes, 2 directories
Free blocks: 519-8192
Free inodes: 12-1952
这段输出描述了 ext2 文件系统中第 0 组(Group 0)的布局和使用情况。它详细列出了该组的超级块、组描述符、位图、inode 表等信息。以下是对每个部分的解释:
Group 0: (Blocks 1-8192)
-
Group 0:表示块组 0,该组的块范围是 1 到 8192。
Primary superblock at 1, Group descriptors at 2-2
-
Primary superblock at 1:超级块位于块 1。超级块存储了整个文件系统的重要元数据。
-
Group descriptors at 2-2:组描述符位于块 2,它包含了当前组中块和 inode 的位置信息。
Reserved GDT blocks at 3-258
-
Reserved GDT blocks at 3-258:块 3 到 258 为保留的组描述符表(GDT)块。GDT 储存块组描述符的冗余信息,用于容错。
Block bitmap at 259 (+258), Inode bitmap at 260 (+259)
-
Block bitmap at 259 (+258):块位图存储在块 259,位图用于记录哪些数据块是已使用的,哪些是空闲的。
+258
表示该位图与超级块位置的偏移量。 -
Inode bitmap at 260 (+259):inode 位图存储在块 260,类似地用于记录哪些 inode 是已使用的,哪些是空闲的。
+259
表示与超级块位置的偏移量。
Inode table at 261-504 (+260)
-
Inode table at 261-504 (+260):inode 表存储在块 261 到 504,包含文件系统中每个文件和目录的元数据。
+260
表示它与超级块的偏移量。
7674 free blocks, 1941 free inodes, 2 directories
-
7674 free blocks:该组中有 7674 个空闲块,表示这些块尚未分配给文件或目录。
-
1941 free inodes:该组中有 1941 个空闲的 inode,表示这些 inode 还没有分配给文件或目录。
-
2 directories:该组中有 2 个已分配的目录。
Free blocks: 519-8192
-
Free blocks: 519-8192:空闲数据块的编号范围是 519 到 8192,这些块可以分配给新文件或目录。
Free inodes: 12-1952
-
Free inodes: 12-1952:空闲 inode 的编号范围是 12 到 1952,这些 inode 可以用于新文件或目录的创建。
总结来说,这段输出详细展示了 ext2 文件系统中第 0 块组的结构,包括超级块、组描述符、位图、inode 表的存放位置,以及当前组中的空闲块和 inode 的数量及范围。
超级块原始数据
磁盘分区情况:
[root@node09 ~]# fdisk /dev/loop0 -l
Disk /dev/loop0: 104 MB, 104857600 bytes, 204800 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x76dcb4a8
Device Boot Start End Blocks Id System
/dev/loop0p1 2048 204799 101376 83 Linux
[root@node09 ~]#
通过以上中的数据:
Block size: 1024
Group 0: (Blocks 1-8192)
Primary superblock at 1, ...
再加上2个扇区的boot sector可以计算得出磁盘设备 /dev/loop0 中的2050扇区后的2个扇区中的内容就是超级块中的内容(512*2050=1049600)
[root@node09 ~]# hexdump -s 1049600 -n 1024 /dev/loop0 -C
00100400 20 63 00 00 00 8c 01 00 cc 13 00 00 67 79 01 00 | c..........gy..|
00100410 15 63 00 00 01 00 00 00 00 00 00 00 00 00 00 00 |.c..............|
00100420 00 20 00 00 00 20 00 00 a0 07 00 00 00 00 00 00 |. ... ..........|
00100430 40 f0 e3 66 00 00 ff ff 53 ef 01 00 01 00 00 00 |@..f....S.......|
00100440 40 f0 e3 66 00 00 00 00 00 00 00 00 01 00 00 00 |@..f............|
00100450 00 00 00 00 0b 00 00 00 80 00 00 00 38 00 00 00 |............8...|
00100460 02 00 00 00 01 00 00 00 b2 98 6a 8e 5b 67 40 c3 |..........j.[g@.|
00100470 aa 75 49 5e 25 0d aa 56 00 00 00 00 00 00 00 00 |.uI^%..V........|
00100480 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
001004c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 |................|
001004d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
001004e0 00 00 00 00 00 00 00 00 00 00 00 00 8b 28 9b 24 |.............(.$|
001004f0 46 fe 41 2c 8b e1 96 ec 46 b0 8e 0d 01 00 00 00 |F.A,....F.......|
00100500 0c 00 00 00 00 00 00 00 40 f0 e3 66 00 00 00 00 |........@..f....|
00100510 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00100560 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00100570 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00100800
[root@node09 ~]#
内核源码
struct ext2_super_block {
__le32 s_inodes_count; /* Inodes count */
__le32 s_blocks_count; /* Blocks count */
__le32 s_r_blocks_count; /* Reserved blocks count */
__le32 s_free_blocks_count; /* Free blocks count */
__le32 s_free_inodes_count; /* Free inodes count */
__le32 s_first_data_block; /* First Data Block */
__le32 s_log_block_size; /* Block size */
__le32 s_log_frag_size; /* Fragment size */
__le32 s_blocks_per_group; /* # Blocks per group */
__le32 s_frags_per_group; /* # Fragments per group */
__le32 s_inodes_per_group; /* # Inodes per group */
__le32 s_mtime; /* Mount time */
__le32 s_wtime; /* Write time */
__le16 s_mnt_count; /* Mount count */
__le16 s_max_mnt_count; /* Maximal mount count */
__le16 s_magic; /* Magic signature */
__le16 s_state; /* File system state */
__le16 s_errors; /* Behaviour when detecting errors */
__le16 s_minor_rev_level; /* minor revision level */
__le32 s_lastcheck; /* time of last check */
__le32 s_checkinterval; /* max. time between checks */
__le32 s_creator_os; /* OS */
__le32 s_rev_level; /* Revision level */
__le16 s_def_resuid; /* Default uid for reserved blocks */
__le16 s_def_resgid; /* Default gid for reserved blocks */
/*
* These fields are for EXT2_DYNAMIC_REV superblocks only.
*
* Note: the difference between the compatible feature set and
* the incompatible feature set is that if there is a bit set
* in the incompatible feature set that the kernel doesn't
* know about, it should refuse to mount the filesystem.
*
* e2fsck's requirements are more strict; if it doesn't know
* about a feature in either the compatible or incompatible
* feature set, it must abort and not try to meddle with
* things it doesn't understand...
*/
__le32 s_first_ino; /* First non-reserved inode */
__le16 s_inode_size; /* size of inode structure */
__le16 s_block_group_nr; /* block group # of this superblock */
__le32 s_feature_compat; /* compatible feature set */
__le32 s_feature_incompat; /* incompatible feature set */
__le32 s_feature_ro_compat; /* readonly-compatible feature set */
__u8 s_uuid[16]; /* 128-bit uuid for volume */
char s_volume_name[16]; /* volume name */
char s_last_mounted[64]; /* directory where last mounted */
__le32 s_algorithm_usage_bitmap; /* For compression */
/*
* Performance hints. Directory preallocation should only
* happen if the EXT2_COMPAT_PREALLOC flag is on.
*/
__u8 s_prealloc_blocks; /* Nr of blocks to try to preallocate*/
__u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */
__u16 s_padding1;
/*
* Journaling support valid if EXT3_FEATURE_COMPAT_HAS_JOURNAL set.
*/
__u8 s_journal_uuid[16]; /* uuid of journal superblock */
__u32 s_journal_inum; /* inode number of journal file */
__u32 s_journal_dev; /* device number of journal file */
__u32 s_last_orphan; /* start of list of inodes to delete */
__u32 s_hash_seed[4]; /* HTREE hash seed */
__u8 s_def_hash_version; /* Default hash version to use */
__u8 s_reserved_char_pad;
__u16 s_reserved_word_pad;
__le32 s_default_mount_opts;
__le32 s_first_meta_bg; /* First metablock block group */
__u32 s_reserved[190]; /* Padding to the end of the block */
};