天天看點

深入解析ext2檔案系統之mke2fs

  上一遍博文的重點其實将ext2整體的組織架構,我們知道了ext2檔案系統由塊組組成,每個塊組裡面的組織形式。我們甚至直接把超級塊群組描述符裡面的内容,用十六進制形式展現了出來。這篇博文主要講述如何mke2fs生成合适需要的ext2 檔案系統,基本就是參數選擇的問題。

     mke2fs 常用的幾個參數有:

    1)    -b     block-size .

    塊大小是ext2檔案系統比較重要的一個參數,目前隻支援1024、2048和4096。上篇博文講到了其中的一點,就是塊大小決定了每個塊組最多管理多少個block塊。因為塊組中用1個block作為位圖來之時該塊組的某一塊是否空閑。

      1024----最多有8K個塊----------塊組大小為8M位元組   (1024位元組/block*8K塊)

      2048----最多有16K個塊---------塊組大小為32M位元組

      4096----最多有32K個快----------塊組大小為128M位元組

    說block-size重要,不光是因為他決定了塊組的一些屬性,她還決定了一個ext2檔案的屬性(最大長度)。我們知道Inode中有個長度為15的數組指向檔案的資料存儲的塊。前12個為直接指針,指向了資料所在的block塊。第13 個數組元素是1級間接指針,第14個數組元素為二級間接指針,第15個元素為三級間接指針,通過間接指針,ext2支援的檔案最大長度獲得了極大的擴充。

    檔案的組織形式不是這篇博文的重點,我們掠過不細講

塊大小

直接尋址

間接尋址

二次間接尋址

三次間接尋址

1024

12KB

268KB

64.26MB

16.06GB

2048

24KB

1.02MB

513.02MB

265.5GB

4096

48KB

4.04MB

4GB

~ 4TB

    預設情況下為1024。blocksize決定了,總的塊數也就決定了(在磁盤空間一定的情況下。比如我們空間就是500MB)。

linux-tods:/mnt/bean # mke2fs /dev/loop0

mke2fs 1.41.9 (22-Aug-2009)

Filesystem label=

OS type: Linux

Block size=1024 (log=0)

Fragment size=1024 (log=0)

128016 inodes, 512000 blocks

25600 blocks (5.00%) reserved for the super user

First data block=1

Maximum filesystem blocks=67633152

63 block groups

8192 blocks per group, 8192 fragments per group

2032 inodes per group

Superblock backups stored on blocks: 

    8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

Writing inode tables: done 

Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 26 mounts or

180 days, whichever comes first. Use tune2fs -c or -i to override.

或者

linux-tods:/mnt/bean # tune2fs -l /dev/loop0

tune2fs 1.41.9 (22-Aug-2009)

Filesystem volume name:   <none>

Last mounted on:          <not available>

Filesystem UUID:          8feecddf-756d-427f-9018-7993119aced5

Filesystem magic number:  0xEF53

Filesystem revision #:    1 (dynamic)

Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super

Filesystem flags:         signed_directory_hash 

Default mount options:    (none)

Filesystem state:         clean

Errors behavior:          Continue

Filesystem OS type:       Linux

Inode count:              128016

Block count:              512000

Reserved block count:     25600

Free blocks:              493526

Free inodes:              128005

First block:              1

Block size:               1024

Fragment size:            1024

     使用者可以修改成4096,這樣的話,總塊數一會跟着變化從512000變成了128000.

linux-tods:/mnt/bean # mke2fs -b 4096 /dev/loop0

Block size=4096 (log=2)

Fragment size=4096 (log=2)

128000 inodes, 128000 blocks

6400 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=134217728

4 block groups

32768 blocks per group, 32768 fragments per group

32000 inodes per group

    32768, 98304

This filesystem will be automatically checked every 39 mounts or

---------------------------------------------------------------------------------------------------

     2)  -m reserved-blocks-percentage

    為超級使用者保留的塊的比例。為了防止所有的塊都被用光,某些情況下啟動不起來,必須要為超級使用者保留一定比例的塊,這個值預設是5%。下面是上篇博文中預設參數中的保留塊。

           block總數*%5 = 保留塊的塊數。

           Block count: 512000

           Reserved block count: 25600

    下面看下我将它參數修改成10%:可以看到,Reserved block count變成了51200 。 一般來說這個參數不需要改變。

linux-tods:/mnt/bean # mke2fs -m 10 /dev/loop0

mke2fs 1.41.9 (22-Aug-2009)

OS type: Linux

Fragment size=1024 (log=0)

128016 inodes, 512000 blocks

51200 blocks (10.00%) reserved for the super user

8192 blocks per group, 8192 fragments per group

Superblock backups stored on blocks: 

    8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

Writing inode tables: done 

Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 23 mounts or

180 days, whichever comes first. Use tune2fs -c or -i to override.

-------------------------------------------------------------------------------------------------------

       3    -i bytes-per-inode

     這個參數是我認為是比較重要的一個參數。這個參數乍一看看不懂是幹嘛的,深入了解linux核心講到mke2fs的時候,說預設選項是每8192個位元組的組配置設定一個inode。第一次看,沒看懂啥意思。畢竟不如blocksize這麼通俗易懂。後來我才明白了。(另外,這個參數ULK是錯的,我測試了,我mke2fs預設為4096位元組每inode)

    這個參數的含義是多少個位元組配置設定一個inode。這個參數反映的是,我們對儲存在我們檔案系統上的每個檔案大小的期許。換句話說,我們期待,每個檔案都是4096個位元組左右,每個檔案需要一個inode。是以我們一共需要500M/4096=12800個inode。

    舉例說明,如果我打算在我這個ext2存儲的檔案都很小,比如說大多數檔案都小于1K。那麼如果這個-i的值為8192的話,就會出現下面的情況:總共有512000個塊卻隻有64008個inode。 如果你還沒體會到我的意思,那麼看Group 0 ,1000個左右的free inode,但是有近8000個free block 。根據我的設定,我的檔案大多數比較小,那麼,當我的檔案個數達到1000個時 free inode先用完了,Group 0 還有近7000個塊空閑。 也就是說選錯了 -i參數使我的inode先用完了。那麼就算有大把的free block,你也無法建立檔案了。

    OK,這個參數的取值範圍是 1024~65536 。設定原則為:考慮下你的大多數檔案有多大,就設為多大。有意思的是,你不設成1024的整數倍也是可以的。

點選(此處)折疊或打開

linux-tods:/mnt/bean # mke2fs -i 8192 /dev/loop0

64008 inodes, 512000 blocks

25600 blocks (5.00%) reserved for the super user

......

linux-tods:/mnt/bean # dumpe2fs /dev/loop0

Group 0: (Blocks 1-8192)

Primary superblock at 1, Group descriptors at 2-3

Reserved GDT blocks at 4-259

Block bitmap at 260 (+259), Inode bitmap at 261 (+260)

Inode table at 262-388 (+261)

7790 free blocks, 1005 free inodes, 2 directories

Free blocks: 403-8192

Free inodes: 12-1016

Group 1: (Blocks 8193-16384)

Backup superblock at 8193, Group descriptors at 8194-8195

Reserved GDT blocks at 8196-8451

Block bitmap at 8452 (+259), Inode bitmap at 8453 (+260)

Inode table at 8454-8580 (+261)

7804 free blocks, 1016 free inodes, 0 directories

Free blocks: 8581-16384

Free inodes: 1017-2032

       設成1524居然也可以,呵呵

linux-tods:/mnt/bean # mke2fs -i 1524 /dev/loop0

Block size=1024 (log=0)

344232 inodes, 512000 blocks

5464 inodes per group

Superblock backups stored on blocks:

     最後一個PROBLEM,我想了很久也沒想明白,請路過的高手如果知道答案,不吝賜教:

    下面是mke2fs的預設選項 ,發現Inode count總數多出來了16個,預設-i為4096位元組每inode,本來應該是:500MB/4096B = 128000,可是dumpefs的結果為128016。多出來的16個inode我是百思不得其解。昨天看了部分e2fsprogs的代碼,也沒看出來。

Inode count: 128016

Block count: 512000

Reserved block count: 25600

Free blocks: 493526

Free inodes: 128005

First block: 1

Block size: 1024

     其他的參數也可指定,但是我覺得沒多少必要,比如說inode size,你可以指定但是我覺128位元組就挺好,既不浪費,而且也比較适合cache line的大小,你非要設成256有點浪費空間。再比如block per group,前面根據blocksize可以算出最大值,比如1024的就能支援最大8192個block per group, 你非要設定成4096 blocks per group ,其實也沒多大必要。

參考文獻

1 ULK

2 Linux man page

3 e2fsprogs

4如何恢複 Linux 上删除的檔案,第 1 部分

下一篇: 嵌入式

繼續閱讀