乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Linux下對superblock的理解

       惡之一眉 2012-03-22

      對superblock的理解

      superblock的理解首先從partition structure的結構開始:

      1、首先了解下block,對于ext2(ext3)文件系統(tǒng)而言,硬盤分區(qū)首先被劃分為一個個的block,同一個ext2文件系統(tǒng)上的每個block大小都是一樣的。但是對于不同的ext2文件系統(tǒng),block的大小可以有區(qū)別。典型的block大小是1024 bytes或者4096 bytes。這個大小在創(chuàng)建ext2、ext3文件系統(tǒng)的時候被決定,mkfs –t ext2/3 –b xx就可以設定塊大小了!一個硬盤分區(qū)上的block計數(shù)是從0開始的,總的來說,block這個概念好理解。
      2、理解了block的概念后,接著就是對block group的理解,硬盤分區(qū)上所有的block被聚在一起分成幾個大的block group。其中每個block group中有多少個block是固定的。從上面的圖可以看出來!每個block group都相對應一個group descriptor,每個group descriptor當中有幾個重要的block指針,指向block group中的inode table、block bitmapinode bitmap
      以上三個結構記載了其所屬block group的許多信息。
      3、下面就是對super block的理解了
      Super block即為超級塊,它是硬盤分區(qū)開頭——開頭的第一個bytebyte 0,從 byte 1024開始往后的一部分數(shù)據(jù)。由于 block size最小是 1024 bytes,所以super block可能是在block 1中(此時block 的大小正好是 1024 bytes
      超級塊中的數(shù)據(jù)其實就是文件卷的控制信息部分,也可以說它是卷資源表,有關文件卷的大部分信息都保存在這里。例如:硬盤分區(qū)中每個block的大小、硬盤分區(qū)上一共有多少個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文件系統(tǒng)來說,這個字段的值應該正好等于0xEF53。如果不等的話,那么這個硬盤分區(qū)上肯定不是一個正常的ext2或ext3文件系統(tǒng)。

      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的大小這一非常重要的數(shù)據(jù)。

      3、s_blocks_count和s_blocks_per_group

        通過這兩個成員,我們可以得到硬盤分區(qū)上一共有多少個block group,或者說一共有多少個group descriptors
        s_blocks_count記錄了硬盤分區(qū)上的block的總數(shù),而 s_blocks_per_group記錄了每個group中有多少個block。顯然,文件系統(tǒng)上的block groups數(shù)量,我們把它記作G,G=(s_blocks_count-s_first_data_block- 1)/s_blocks_per_group+1。為什么要減去s_first_data_block,因為s_blocks_count是硬盤分區(qū)上全 部的block的數(shù)量,而在s_first_data_block之前的block是不歸block group管的,所以當然要減去。最后為什么又要加一,這是因為尾巴上可能多出來一些block,這些block我們要把它劃在一個相對較小的group 里面。

      4、s_inodes_per_group

        s_inodes_per_group記載了每個block group中有多少個inode。在從已知的inode號,讀取這個inode數(shù)據(jù)的過程中,s_inodes_per_group起到了至關重要的作用。
        用我們得到的inode號數(shù)除以s_inodes_per_group,我們就知道了我們要的 這個inode是在哪一個block group里面,這個除法的余數(shù)也告訴我們,我們要的這個inode是這個block group里面的第幾個inode;然后,我們可以先找到這個block group的group descriptor,從這個descriptor,我們找到這個group的inode table,再從inode table找到我們要的第幾個 inode,再以后,我們就可以開始讀取inode中的用戶數(shù)據(jù)了。這個公式是這樣的:
        block_group = (ino - 1) / s_inodes_per_group。這里ino就是我們的inode號數(shù)
        offset = (ino - 1) % s_inodes_per_group,這個offset就指出了我們要的inode是這個block group里面的第幾個inode。

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多