上一遍博文的重点其实将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)。
- 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
- mke2fs 1.41.9 (22-Aug-2009)
- Filesystem label=
- OS type: Linux
- 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
- Superblock backups stored on blocks:
- 32768, 98304
- Writing inode tables: done
- Writing superblocks and filesystem accounting information: done
- This filesystem will be automatically checked every 39 mounts or
- 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 。 一般来说这个参数不需要改变。
- linux-tods:/mnt/bean # mke2fs -m 10 /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
- 51200 blocks (10.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 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
- mke2fs 1.41.9 (22-Aug-2009)
- Filesystem label=
- OS type: Linux
- Block size=1024 (log=0)
- Fragment size=1024 (log=0)
- 64008 inodes, 512000 blocks
- 25600 blocks (5.00%) reserved for the super user
- First data block=1
- Maximum filesystem blocks=67633152
- 63 block groups
- ......
- 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
- mke2fs 1.41.9 (22-Aug-2009)
- Filesystem label=
- OS type: Linux
- Block size=1024 (log=0)
- Fragment size=1024 (log=0)
- 344232 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
- 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 部分