Linux磁盤分區對superblock的理解

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 tableblock bitmap和inode bitmap
以上三個結構記載了其所屬block group的許多信息。


3、下面就是對super block的理解了

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


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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章