上一遍博文的重點其實将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 部分