小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Linux下對superblock的理解

 惡之一眉 2012-03-22

對superblock的理解

superblock的理解首先從partition structure的結(jié)構(gòu)開始:

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就可以設(shè)定塊大小了!一個硬盤分區(qū)上的block計數(shù)是從0開始的,總的來說,block這個概念好理解。
2、理解了block的概念后,接著就是對block group的理解,硬盤分區(qū)上所有的block被聚在一起分成幾個大的block group。其中每個block group中有多少個block是固定的。從上面的圖可以看出來!每個block group都相對應(yīng)一個group descriptor,每個group descriptor當(dāng)中有幾個重要的block指針,指向block group中的inode tableblock bitmapinode bitmap。
以上三個結(jié)構(gòu)記載了其所屬block group的許多信息。
3、下面就是對super block的理解了
Super block即為超級塊,它是硬盤分區(qū)開頭——開頭的第一個bytebyte 0,從 byte 1024開始往后的一部分?jǐn)?shù)據(jù)。由于 block size最小是 1024 bytes,所以super block可能是在block 1中(此時block 的大小正好是 1024 bytes
超級塊中的數(shù)據(jù)其實(shí)就是文件卷的控制信息部分,也可以說它是卷資源表,有關(guān)文件卷的大部分信息都保存在這里。例如:硬盤分區(qū)中每個block的大小、硬盤分區(qū)上一共有多少個block group、以及每個block group中有多少個inode
對于super block的結(jié)構(gòu)和涵義可以通過查看/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)來說,這個字段的值應(yī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,因?yàn)閟_blocks_count是硬盤分區(qū)上全 部的block的數(shù)量,而在s_first_data_block之前的block是不歸block group管的,所以當(dāng)然要減去。最后為什么又要加一,這是因?yàn)槲舶蜕峡赡芏喑鰜硪恍゜lock,這些block我們要把它劃在一個相對較小的group 里面。

4、s_inodes_per_group

  s_inodes_per_group記載了每個block group中有多少個inode。在從已知的inode號,讀取這個inode數(shù)據(jù)的過程中,s_inodes_per_group起到了至關(guān)重要的作用。
  用我們得到的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)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多