1. 程式人生 > >ext2文件系統 - mke2fs

ext2文件系統 - mke2fs

desc name cin ever call resize problem 常用 oop

上一遍博文的重點其實將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支持的文件最大長度獲得了極大的擴展。
文件的組織形式不是這篇博文的重點,我們掠過不細講
表 1. 各種數據塊對應的文件尋址範圍
塊大小 直接尋址 間接尋址 二次間接尋址 三次間接尋址
1024 12KB 268KB 64.26MB 16.06GB
2048 24KB 1.02MB 513.02MB 265.5GB
4096 48KB 4.04MB 4GB ~ 4TB
默認情況下為1024。blocksize決定了,總的塊數也就決定了(在磁盤空間一定的情況下。比如我們空間就是500MB)。
  1. linux-tods:/mnt/bean # mke2fs /dev/loop0
  2. mke2fs 1.41.9 (22-Aug-2009)
  3. Filesystem label=
  4. OS type: Linux
  5. Block size=1024 (log=0)
  6. Fragment size=1024 (log=0)
  7. 128016 inodes, 512000 blocks
  8. 25600 blocks (5.00%) reserved for the super user
  9. First data block=1
  10. Maximum filesystem blocks=67633152
  11. 63 block groups
  12. 8192 blocks per group, 8192 fragments per group
  13. 2032 inodes per group
  14. Superblock backups stored on blocks:
  15. 8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409
  16. Writing inode tables: done
  17. Writing superblocks and filesystem accounting information: done
  18. This filesystem will be automatically checked every 26 mounts or
  19. 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.
  1. linux-tods:/mnt/bean # mke2fs -b 4096 /dev/loop0
  2. mke2fs 1.41.9 (22-Aug-2009)
  3. Filesystem label=
  4. OS type: Linux
  5. Block size=4096 (log=2)
  6. Fragment size=4096 (log=2)
  7. 128000 inodes, 128000 blocks
  8. 6400 blocks (5.00%) reserved for the super user
  9. First data block=0
  10. Maximum filesystem blocks=134217728
  11. 4 block groups
  12. 32768 blocks per group, 32768 fragments per group
  13. 32000 inodes per group
  14. Superblock backups stored on blocks:
  15. 32768, 98304
  16. Writing inode tables: done
  17. Writing superblocks and filesystem accounting information: done
  18. This filesystem will be automatically checked every 39 mounts or
  19. 180 days, whichever comes first. Use tune2fs -c or -i to override.
--------------------------------------------------------------------------------------------------- 2) -m reserved-blocks-percentage 為超級用戶保留的塊的比例。為了防止所有的塊都被用光,某些情況下啟動不起來,必須要為超級用戶保留一定比例的塊,這個值默認是5%。下面是上篇博文中默認參數中的保留塊。 block總數*%5 = 保留塊的塊數。 Block count: 512000 Reserved block count: 25600 下面看下我將它參數修改成10%:可以看到,Reserved block count變成了51200 。 一般來說這個參數不需要改變。
  1. linux-tods:/mnt/bean # mke2fs -m 10 /dev/loop0
  2. mke2fs 1.41.9 (22-Aug-2009)
  3. Filesystem label=
  4. OS type: Linux
  5. Block size=1024 (log=0)
  6. Fragment size=1024 (log=0)
  7. 128016 inodes, 512000 blocks
  8. 51200 blocks (10.00%) reserved for the super user
  9. First data block=1
  10. Maximum filesystem blocks=67633152
  11. 63 block groups
  12. 8192 blocks per group, 8192 fragments per group
  13. 2032 inodes per group
  14. Superblock backups stored on blocks:
  15. 8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409
  16. Writing inode tables: done
  17. Writing superblocks and filesystem accounting information: done
  18. This filesystem will be automatically checked every 23 mounts or
  19. 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的整數倍也是可以的。

點擊(此處)折疊或打開

  1. linux-tods:/mnt/bean # mke2fs -i 8192 /dev/loop0
  2. mke2fs 1.41.9 (22-Aug-2009)
  3. Filesystem label=
  4. OS type: Linux
  5. Block size=1024 (log=0)
  6. Fragment size=1024 (log=0)
  7. 64008 inodes, 512000 blocks
  8. 25600 blocks (5.00%) reserved for the super user
  9. First data block=1
  10. Maximum filesystem blocks=67633152
  11. 63 block groups
  12. ......
  13. linux-tods:/mnt/bean # dumpe2fs /dev/loop0
  14. Group 0: (Blocks 1-8192)
  15. Primary superblock at 1, Group descriptors at 2-3
  16. Reserved GDT blocks at 4-259
  17. Block bitmap at 260 (+259), Inode bitmap at 261 (+260)
  18. Inode table at 262-388 (+261)
  19. 7790 free blocks, 1005 free inodes, 2 directories
  20. Free blocks: 403-8192
  21. Free inodes: 12-1016
  22. Group 1: (Blocks 8193-16384)
  23. Backup superblock at 8193, Group descriptors at 8194-8195
  24. Reserved GDT blocks at 8196-8451
  25. Block bitmap at 8452 (+259), Inode bitmap at 8453 (+260)
  26. Inode table at 8454-8580 (+261)
  27. 7804 free blocks, 1016 free inodes, 0 directories
  28. Free blocks: 8581-16384
  29. Free inodes: 1017-2032
設成1524居然也可以,呵呵
  1. linux-tods:/mnt/bean # mke2fs -i 1524 /dev/loop0
  2. mke2fs 1.41.9 (22-Aug-2009)
  3. Filesystem label=
  4. OS type: Linux
  5. Block size=1024 (log=0)
  6. Fragment size=1024 (log=0)
  7. 344232 inodes, 512000 blocks
  8. 25600 blocks (5.00%) reserved for the super user
  9. First data block=1
  10. Maximum filesystem blocks=67633152
  11. 63 block groups
  12. 8192 blocks per group, 8192 fragments per group
  13. 5464 inodes per group
  14. Superblock backups stored on blocks:
最後一個PROBLEM,我想了很久也沒想明白,請路過的高手如果知道答案,不吝賜教: 下面是mke2fs的默認選項 ,發現Inode count總數多出來了16個,默認-i為4096字節每inode,本來應該是:500MB/4096B = 128000,可是dumpefs的結果為128016。多出來的16個inode我是百思不得其解。昨天看了部分e2fsprogs的代碼,也沒看出來。
  1. Inode count: 128016
  2. Block count: 512000
  3. Reserved block count: 25600
  4. Free blocks: 493526
  5. Free inodes: 128005
  6. First block: 1
  7. 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 部分

ext2文件系統 - mke2fs