Linux下对superblock的理解
Posted 骑着赶路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下对superblock的理解相关的知识,希望对你有一定的参考价值。
对superblock的理解首先从partition structure的结构开始:
1、首先了解下block,对于ext2(ext3)文件系统而言,硬盘分区首先被划分为一个个的block,同一个ext2文件系统上的每个block大小都是一样的。但是对于不同的ext2文件系统,block的大小可以有区别。典型的block大小是1024 bytes或者4096 bytes。这个大小在创建ext2、ext3文件系统的时候被决定,mkfs –t ext2/3 –b xx就可以设定块大小了!一个硬盘分区上的block计数是从0开始的,总的来说,block这个概念好理解。
2、理解了block的概念后,接着就是对block group的理解,硬盘分区上所有的block被聚在一起分成几个大的block group。其中每个block group中有多少个block是固定的。从上面的图可以看出来!每个block group都相对应一个group descriptor,每个group descriptor当中有几个重要的block指针,指向block group中的inode table、block bitmap和inode bitmap。
以上三个结构记载了其所属block group的许多信息。
3、下面就是对super block的理解了
Super block即为超级块,它是硬盘分区开头——开头的第一个byte是byte 0,从 byte 1024开始往后的一部分数据。由于 block size最小是 1024 bytes,所以super block可能是在block 1中(此时block 的大小正好是 1024 bytes)
超级块中的数据其实就是文件卷的控制信息部分,也可以说它是卷资源表,有关文件卷的大部分信息都保存在这里。例如:硬盘分区中每个block的大小、硬盘分区上一共有多少个block group、以及每个block group中有多少个inode。
对于super block的结构和涵义可以通过查看/usr/include/linux/ext3_fs.h文件:
通过set number:
386 struct ext3_super_block {
386 struct ext3_super_block {
387 /*00*/ __le32 s_inodes_count; /* Inodes count */
388 __le32 s_blocks_count; /* Blocks count */
389 __le32 s_r_blocks_count; /* Reserved blocks count */
390 __le32 s_free_blocks_count; /* Free blocks count */
391 /*10*/ __le32 s_free_inodes_count; /* Free inodes count */
392 __le32 s_first_data_block; /* First Data Block */
393 __le32 s_log_block_size; /* Block size */
394 __le32 s_log_frag_size; /* Fragment size */
395 /*20*/ __le32 s_blocks_per_group; /* # Blocks per group */
396 __le32 s_frags_per_group; /* # Fragments per group */
397 __le32 s_inodes_per_group; /* # Inodes per group */
398 __le32 s_mtime; /* Mount time */
399 /*30*/ __le32 s_wtime; /* Write time */
400 __le16 s_mnt_count; /* Mount count */
401 __le16 s_max_mnt_count; /* Maximal mount count */
402 __le16 s_magic; /* Magic signature */
403 __le16 s_state; /* File system state */
404 __le16 s_errors; /* Behaviour when detecting errors */
405 __le16 s_minor_rev_level; /* minor revision level */
406 /*40*/ __le32 s_lastcheck; /* time of last check */
407 __le32 s_checkinterval; /* max. time between checks */
408 __le32 s_creator_os; /* OS */
409 __le32 s_rev_level; /* Revision level */
410 /*50*/ __le16 s_def_resuid; /* Default uid for reserved blocks */
411 __le16 s_def_resgid; /* Default gid for reserved blocks */
2、理解了block的概念后,接着就是对block group的理解,硬盘分区上所有的block被聚在一起分成几个大的block group。其中每个block group中有多少个block是固定的。从上面的图可以看出来!每个block group都相对应一个group descriptor,每个group descriptor当中有几个重要的block指针,指向block group中的inode table、block bitmap和inode bitmap。
以上三个结构记载了其所属block group的许多信息。
3、下面就是对super block的理解了
Super block即为超级块,它是硬盘分区开头——开头的第一个byte是byte 0,从 byte 1024开始往后的一部分数据。由于 block size最小是 1024 bytes,所以super block可能是在block 1中(此时block 的大小正好是 1024 bytes)
超级块中的数据其实就是文件卷的控制信息部分,也可以说它是卷资源表,有关文件卷的大部分信息都保存在这里。例如:硬盘分区中每个block的大小、硬盘分区上一共有多少个block group、以及每个block group中有多少个inode。
对于super block的结构和涵义可以通过查看/usr/include/linux/ext3_fs.h文件:
通过set number:
386 struct ext3_super_block {
386 struct ext3_super_block {
387 /*00*/ __le32 s_inodes_count; /* Inodes count */
388 __le32 s_blocks_count; /* Blocks count */
389 __le32 s_r_blocks_count; /* Reserved blocks count */
390 __le32 s_free_blocks_count; /* Free blocks count */
391 /*10*/ __le32 s_free_inodes_count; /* Free inodes count */
392 __le32 s_first_data_block; /* First Data Block */
393 __le32 s_log_block_size; /* Block size */
394 __le32 s_log_frag_size; /* Fragment size */
395 /*20*/ __le32 s_blocks_per_group; /* # Blocks per group */
396 __le32 s_frags_per_group; /* # Fragments per group */
397 __le32 s_inodes_per_group; /* # Inodes per group */
398 __le32 s_mtime; /* Mount time */
399 /*30*/ __le32 s_wtime; /* Write time */
400 __le16 s_mnt_count; /* Mount count */
401 __le16 s_max_mnt_count; /* Maximal mount count */
402 __le16 s_magic; /* Magic signature */
403 __le16 s_state; /* File system state */
404 __le16 s_errors; /* Behaviour when detecting errors */
405 __le16 s_minor_rev_level; /* minor revision level */
406 /*40*/ __le32 s_lastcheck; /* time of last check */
407 __le32 s_checkinterval; /* max. time between checks */
408 __le32 s_creator_os; /* OS */
409 __le32 s_rev_level; /* Revision level */
410 /*50*/ __le16 s_def_resuid; /* Default uid for reserved blocks */
411 __le16 s_def_resgid; /* Default gid for reserved blocks */
super block的几个重要成员
1、Magic 签名
对于ext2和ext3文件系统来说,这个字段的值应该正好等于0xEF53。如果不等的话,那么这个硬盘分区上肯定不是一个正常的ext2或ext3文件系统。2、s_log_block_size
从这个字段,我们可以得出真正的block的大小。我们把真正block的大小记作B,B=1 << s_log_block_size + 10),单位是bytes。举例来说,如果这个字段是0,那么block的大小就是 1024bytes,这正好就是最小的block大小;如果这个字段是2,那么block大小就是4096 bytes。从这里我们就得到了block的大小这一非常重要的数据。3、s_blocks_count和s_blocks_per_group
通过这两个成员,我们可以得到硬盘分区上一共有多少个block group,或者说一共有多少个group descriptors4、s_inodes_per_group
s_inodes_per_group记载了每个block group中有多少个inode。在从已知的inode号,读取这个inode数据的过程中,s_inodes_per_group起到了至关重要的作用。以上是关于Linux下对superblock的理解的主要内容,如果未能解决你的问题,请参考以下文章
# linux文件系统(inode block superblock)