• Linux下对superblock的理解


    superblock的理解首先从partition structure的结构开始:

    1、首先了解下block,对于ext2(ext3)文件系统而言,硬盘分区首先被划分为一个个的block,同一个ext2文件系统上的每个block大小都是一样的。但是对于不同的ext2文件系统,block的大小可以有区别。典型的block大小是1024 bytes或者4096 bytes。这个大小在创建ext2ext3文件系统的时候被决定,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 tableblock bitmapinode bitmap
    以上三个结构记载了其所属block group的许多信息。
    3、下面就是对super block的理解了
    Super block即为超级块,它是硬盘分区开头——开头的第一个bytebyte 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。
  • 相关阅读:
    关于Jquery事件绑定的心得
    WEB前端笔记
    Linux文件权限与属性详解 之 ACL
    Linux文件权限与属性详解 之 一般权限
    MarkDown使用教程
    图床神器:七牛云 + Mpic + FScapture
    Python装饰器之 property()
    Python描述符 (descriptor) 详解
    Python魔法方法之属性访问 ( __getattr__, __getattribute__, __setattr__, __delattr__ )
    Python魔法方法总结及注意事项
  • 原文地址:https://www.cnblogs.com/654321cc/p/9261136.html
Copyright © 2020-2023  润新知