1. 程式人生 > >ext4 筆記一(與ext3比較)

ext4 筆記一(與ext3比較)

整體來講,是在ext3的基礎上做了些改進。

下面來看看ext3與ext4的對比:

一、磁碟佈局對比

ext4 中採用了元塊組(metablock group)的概念。所謂元塊組就是指塊組描述符可以儲存在一個數據塊中的一些連續塊組。仍然以 128MB 的塊組(資料塊為 4KB)為例,ext4 中每個元塊組可以包括 4096 / 64 = 64 個塊組,即每個元塊組的大小是 64 * 128 MB = 8 GB。

二、節點表對比

索引節點結構並沒有發生太大變化,不同之處在於最後添加了 5 個與時間有關的欄位,這是為了提高時間戳的精度。

索引節點中的 i_block 欄位保持不變,但是由於 extent 概念的引入,對於這個陣列的使用方式已經改變了,其前 3 個元素一定是一個ext4_extent_header 結構,後續每 3 個元素可能是一個ext4_extent 或ext4_extent_idx 結構,這取決於所表示的檔案的大小。這種設計可以有效地表示連續存放的大檔案,

1、ext3中i_block欄位使用


i.i_block Offset

Where It Points

0 to 11

Direct map to file blocks 0 to 11.

12

Indirect block: (file blocks 12 to ($block_size / 4) + 11, or 12 to 1035 if 4KiB blocks)

Indirect Block Offset

Where It Points

0 to ($block_size / 4)

Direct map to ($block_size / 4) blocks (1024 if 4KiB blocks)

13

Double-indirect block: (file blocks $block_size/4 + 12 to ($block_size / 4) ^ 2 + ($block_size / 4) + 11, or 1036 to 1049611 if 4KiB blocks)

Double Indirect Block Offset

Where It Points

0 to ($block_size / 4)

Map to ($block_size / 4) indirect blocks (1024 if 4KiB blocks)

Indirect Block Offset

Where It Points

0 to ($block_size / 4)

Direct map to ($block_size / 4) blocks (1024 if 4KiB blocks)

14

Triple-indirect block: (file blocks ($block_size / 4) ^ 2 + ($block_size / 4) + 11 to ($block_size / 4) ^ 3 + $block_size / 4) ^ 2 + ($block_size / 4) + 12, or 1049611 to 1074791436 if 4KiB blocks)

Triple Indirect Block Offset

Where It Points

0 to ($block_size / 4)

Map to ($block_size / 4) double indirect blocks (1024 if 4KiB blocks)

Double Indirect Block Offset

Where It Points

0 to ($block_size / 4)

Map to ($block_size / 4) indirect blocks (1024 if 4KiB blocks)

Indirect Block Offset

Where It Points

0 to ($block_size / 4)

Direct map to ($block_size / 4) blocks (1024 if 4KiB blocks)

2、ext4中i_block欄位使用

Ext4在ext3的基礎上增加了extern取代了ext3的直接、間接、二級間接和三級間接塊的形式來定位磁碟中的資料塊

其中相關結構體如下:

 /*
  * This is the extent on-disk structure.
  * It's used at the bottom of the tree.
  */
 struct ext4_extent {
         __le32  ee_block;       /* first logical block extent covers */
         __le16  ee_len;         /* number of blocks covered by extent */
         __le16  ee_start_hi;    /* high 16 bits of physical block */
         __le32  ee_start;       /* low 32 bits of physical block */
 };
 
 /*
  * This is index on-disk structure.
  * It's used at all the levels except the bottom.
  */
 struct ext4_extent_idx {
         __le32  ei_block;       /* index covers logical blocks from 'block' */
         __le32  ei_leaf;        /* pointer to the physical block of the next *
                                  * level. leaf or next index could be there */
         __le16  ei_leaf_hi;     /* high 16 bits of physical block */
         __u16   ei_unused;
 };
 
 /*
  * Each block (leaves and indexes), even inode-stored has header.
  */
 struct ext4_extent_header {
         __le16  eh_magic;       /* probably will support different formats */
         __le16  eh_entries;     /* number of valid entries */
         __le16  eh_max;         /* capacity of store in entries */
         __le16  eh_depth;       /* has tree real underlying blocks? */
         __le32  eh_generation;  /* generation of the tree */
};