对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 */

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 descriptors

s_blocks_count记录了硬盘分区上的block的总数,而 s_blocks_per_group记录了每个group中有多少个block。显然,文件系统上的block groups数量,我们把它记作G,G=(s_blocks_count-s_first_data_block- 1)/s_blocks_per_group+1。为什么要减去s_first_data_block,因为s_blocks_count是硬盘分区上全 部的block的数量,而在s_first_data_block之前的block是不归block group管的,所以当然要减去。最后为什么又要加一,这是因为尾巴上可能多出来一些block,这些block我们要把它划在一个相对较小的group 里面。

4、s_inodes_per_group

s_inodes_per_group记载了每个block group中有多少个inode。在从已知的inode号,读取这个inode数据的过程中,s_inodes_per_group起到了至关重要的作用。

用我们得到的inode号数除以s_inodes_per_group,我们就知道了我们要的 这个inode是在哪一个block group里面,这个除法的余数也告诉我们,我们要的这个inode是这个block group里面的第几个inode;然后,我们可以先找到这个block group的group descriptor,从这个descriptor,我们找到这个group的inode table,再从inode table找到我们要的第几个 inode,再以后,我们就可以开始读取inode中的用户数据了。这个公式是这样的:

block_group = (ino - 1) / s_inodes_per_group。这里ino就是我们的inode号数

offset = (ino - 1) % s_inodes_per_group,这个offset就指出了我们要的inode是这个block group里面的第几个inode。

linux superblock位置,Linux下对superblock的理解相关推荐

  1. linux superblock位置,Linux下恢复EXT3 Superblock的正确方法

    Linux Ext3文件系统超级块(Superblock)错误问题. .... bad superblock on /dev/hda4 一个同事做的恢复, 结果把数据都抹掉了. 后来想想, 当时的直接 ...

  2. redis linux 文件位置,Linux下Redis的安装和部署

    一.Redis介绍 Redis是当前比较热门的NOSQL系统之一 它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多 ...

  3. linux rz位置,Linux下rz命令使用的实例详解

    Linux中rz命令和sz命令都可用于文件传输,而rz命令主要用于文件的上传,下面将通过几个实例来给大家详细介绍下Linux下rz命令的用法,一起来学习下吧. rz命令可以批量上传文件,当然也可上传单 ...

  4. dota2 linux文件位置,Linux下能玩魔兽世界、打DOTA2了 4K 120Hz很爽

    最近魔兽世界的官方怀旧服开始测试了,月底就会正式运营,不少魔兽世界老粉也开始回归了,现在魔兽人气也高涨中,很多人正在为魔兽怀旧服做准备. 魔兽世界本身是有Windows及Mac版本的,但是没有官方Li ...

  5. linux openmpi 位置,ubuntu下安装openMPI

    1.确认以下编译器已安装: gcc --version g++ --version python --version 2.下载(默认至当前用户的Downloads目录下) URL: http://ww ...

  6. linux man 位置,Linux系统如何查看命令帮助,man命令使用详解

    man命令是linux中的一个基础命令,使用man命令可以了解更多关于Linux中的命令和工具. 使用man,可以查找任何支持它的命令的手册,这些手册最多分为9个章节,描述该命令是如何工作的,可用的参 ...

  7. linux crossover 位置,Linux系统中如何安装CrossOver虚拟机?CrossOver Linux安装说明

    很多用户都喜欢使用Linux系统,主要是因为它拥有自由.共享等优点,但是Linux系统下的虚拟机所拥有的一些应用并不能兼容到Windows系统,给电脑的使用带来了不少麻烦.其实,我们可以使用Cross ...

  8. linux分区表位置,Linux中/etc/fstab /etc/mtab /proc/mounts这三个文件的分析与比较 分区表位置...

    本文主要讲解Linux中/etc/fstab /etc/mtab /proc/mounts这三个文件的作用以及不同之处. 转自http://haohaozhang.blog.51cto.com/917 ...

  9. Windows10激活自带Linux子系统以及Linux子系统安装位置介绍

    为什么需要激活自带Linux子系统 在公司日常开发工作中,绝大多数开发环境都是在Linux下,而公司配的电脑是 Windows10的系统,权限不够无法重装Linux系统,这时绝大多数人只能自己再买台M ...

最新文章

  1. MATLAB【四】 ————批量适配图片信息与excel/txt等文档信息,批量移动拷贝图片,批量存图片中点和方框
  2. [k8s] 第九章 安全认证
  3. Android进程级别
  4. 大学生学python到底有没有有-除了不会生孩子,Python还有啥不会的呢
  5. 如何用MediaCapture解决二维码扫描问题
  6. Windows XP环境下Apache2.2.21和Tomcat7.0.26下的整合
  7. python请输入_不断提示用户输入Python
  8. Minor GC和Major GC和Full GC
  9. Link-Cut Tree
  10. 【译】索引进阶(四):页和区
  11. win10安装oracle12c注意事项,win10系统安装oracle 12c出现ins-30131错误的修复办法
  12. win10电脑忘记开机密码的解锁方法
  13. java编译器eclipse_java编译器eclipse
  14. java 定时调用api_java定时任务接口ScheduledExecutorService
  15. 人民币大写的正确写法(开票据事项)
  16. 文明与征服汉尼拔阵容技能推荐
  17. Maven的几个常用Plugin
  18. 米家扫地机器人是石头代工_科沃斯投资研究报告 - 大湾区小家电分享
  19. Oday安全 11.6利用加载模块之外的地址绕过SafeSEH一节注记---jmp [ebp+N] (上)
  20. 嫦娥是白月光,高翠兰是朱砂痣,谁才是猪八戒最想娶的女人

热门文章

  1. python期中测试
  2. shell脚本——变量定义
  3. 爱酷学习网鼓励大家上传视频教程
  4. 药店的药品销售统计系统(排序应用)
  5. 【国际知名-hacker`动态`】洞悉-最新 hacker技术 新闻
  6. iis 6.0 中一些文件无法下载问题解决
  7. U盘装PE,U盘安装WIN7 ISO镜像文件
  8. mybatis29道练习题
  9. python 去读DAT文件
  10. 使用 css 和 js 禁止复制文本