日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Linux下對(duì)superblock的理解

 惡之一眉 2012-03-22

對(duì)superblock的理解

對(duì)superblock的理解首先從partition structure的結(jié)構(gòu)開(kāi)始:

1、首先了解下block,對(duì)于ext2(ext3)文件系統(tǒng)而言,硬盤(pán)分區(qū)首先被劃分為一個(gè)個(gè)的block,同一個(gè)ext2文件系統(tǒng)上的每個(gè)block大小都是一樣的。但是對(duì)于不同的ext2文件系統(tǒng),block的大小可以有區(qū)別。典型的block大小是1024 bytes或者4096 bytes。這個(gè)大小在創(chuàng)建ext2ext3文件系統(tǒng)的時(shí)候被決定,mkfs –t ext2/3 –b xx就可以設(shè)定塊大小了!一個(gè)硬盤(pán)分區(qū)上的block計(jì)數(shù)是從0開(kāi)始的,總的來(lái)說(shuō),block這個(gè)概念好理解。
2、理解了block的概念后,接著就是對(duì)block group的理解,硬盤(pán)分區(qū)上所有的block被聚在一起分成幾個(gè)大的block group。其中每個(gè)block group中有多少個(gè)block是固定的。從上面的圖可以看出來(lái)!每個(gè)block group都相對(duì)應(yīng)一個(gè)group descriptor,每個(gè)group descriptor當(dāng)中有幾個(gè)重要的block指針,指向block group中的inode table、block bitmapinode bitmap。
以上三個(gè)結(jié)構(gòu)記載了其所屬block group的許多信息。
3、下面就是對(duì)super block的理解了
Super block即為超級(jí)塊,它是硬盤(pán)分區(qū)開(kāi)頭——開(kāi)頭的第一個(gè)bytebyte 0,從 byte 1024開(kāi)始往后的一部分?jǐn)?shù)據(jù)。由于 block size最小是 1024 bytes,所以super block可能是在block 1中(此時(shí)block 的大小正好是 1024 bytes
超級(jí)塊中的數(shù)據(jù)其實(shí)就是文件卷的控制信息部分,也可以說(shuō)它是卷資源表,有關(guān)文件卷的大部分信息都保存在這里。例如:硬盤(pán)分區(qū)中每個(gè)block的大小、硬盤(pán)分區(qū)上一共有多少個(gè)block group、以及每個(gè)block group中有多少個(gè)inode
對(duì)于super block的結(jié)構(gòu)和涵義可以通過(guò)查看/usr/include/linux/ext3_fs.h文件:
通過(guò)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的幾個(gè)重要成員

1、Magic 簽名

  對(duì)于ext2和ext3文件系統(tǒng)來(lái)說(shuō),這個(gè)字段的值應(yīng)該正好等于0xEF53。如果不等的話,那么這個(gè)硬盤(pán)分區(qū)上肯定不是一個(gè)正常的ext2或ext3文件系統(tǒng)。

2、s_log_block_size

   從這個(gè)字段,我們可以得出真正的block的大小。我們把真正block的大小記作B,B=1 << s_log_block_size + 10),單位是bytes。舉例來(lái)說(shuō),如果這個(gè)字段是0,那么block的大小就是 1024bytes,這正好就是最小的block大?。蝗绻@個(gè)字段是2,那么block大小就是4096 bytes。從這里我們就得到了block的大小這一非常重要的數(shù)據(jù)。

3、s_blocks_count和s_blocks_per_group

  通過(guò)這兩個(gè)成員,我們可以得到硬盤(pán)分區(qū)上一共有多少個(gè)block group,或者說(shuō)一共有多少個(gè)group descriptors
  s_blocks_count記錄了硬盤(pán)分區(qū)上的block的總數(shù),而 s_blocks_per_group記錄了每個(gè)group中有多少個(gè)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是硬盤(pán)分區(qū)上全 部的block的數(shù)量,而在s_first_data_block之前的block是不歸block group管的,所以當(dāng)然要減去。最后為什么又要加一,這是因?yàn)槲舶蜕峡赡芏喑鰜?lái)一些block,這些block我們要把它劃在一個(gè)相對(duì)較小的group 里面。

4、s_inodes_per_group

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

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多