深入解析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支持的文件最大长度获得了极大的扩展。

    文件的组织形式不是这篇博文的重点,我们掠过不细讲

表 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.  
  17. Writing inode tables: done 
  18. Writing superblocks and filesystem accounting information: done
  19.  
  20. This filesystem will be automatically checked every 23 mounts or
  21. 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 部分

 

时间: 2024-10-27 08:12:01

深入解析ext2文件系统之mke2fs的相关文章

深入解析 ext2 文件系统

 很久以来,就想写一篇关于ext 家族文件系统的文章,源于我刚工作的时候,曾经一不小心rm -rf,误删除了很多文件,当时真想有个数据恢复软件能帮我把数据回复了.当然学习数据恢复,首先要学习文件系统.最近工作原因,好长时间没看学习Linux kernel 相关的东西,感觉面目可憎.扯远了,开始我们的ext2 文件系统的探索之旅.       那些介绍ext2特征的套话我就不说了,任何一本靠谱的linux教程中都可以找到,我们直接单刀直入,开始探索.       首先生成一个ext2文件系统.我在

ext2文件系统

2.1. 总体存储布局 我们知道,一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如某种mkfs命令)格式化成某种格式的文件系统,然后才能存储文件,格式化的过程会在磁盘上写一些管理存储布局的信息.下图是一个磁盘分区格式化成ext2文件系统后的存储布局. 图 29.2. ext2文件系统的总体存储布局 文件系统中存储的最小单位是块(Block),一个块究竟多大是在格式化时确定的,例如mke2fs的-b选项可以设定块大小为1024.2048或4096字节.而上图中启动块(Boot Bloc

Ext2文件系统的硬盘布局

本文主要讲述 Linux 上比较流行的 ext2 文件系统在硬盘分区上的详细布局情况.Ext2 文件系统加上日志支持的下一个版本是 ext3 文件系统,它和 ext2 文件系统在硬盘布局上是一样的,其差别仅仅是 ext3 文件系统在硬盘上多出了一个特殊的 ino de(可以理解为一个特殊文件),用来记录文件系统的日志,也即所谓的 journal.由于本文并不讨论日志文件,所以本文的内容对于 ext2 和 ext3 都是适用的. 1.前言 本文的资料来源是 Linux 内核中 ext3 文件系统的

ext2文件系统存储结构(sina博客移入)

看了几天<深入理解linux内核>的ext2文件系统部分和VFS部分,稍微了解了点文件在内存中的存储结构,但是总是弄不清楚在硬盘上实际的存储方式,特别是文件夹的存储. 保存文件夹的结构很简单,没有这个文件夹下所有文件的索引,看了几遍书,都不能理解在硬盘上文件夹结构的存储,只能根据网上的例子自己跟着做实验.(过程参考了http://blog.chinaunix.net/u1/48373/showart_1210707.html的博客) 首先显示要分配一个空间,格式化为ext2分区,并在这个空间上

在ubuntu,基于ext2文件系统实现一个加密的文件系统?

问题描述 在ubuntu,基于ext2文件系统实现一个加密的文件系统? 不是重新挂载一个新的文件系统,而是修改ext2内核代码达到加密的功能.要修改哪个文件的哪些函数能达到加密的效果呀?

Linux中ext2文件系统存储结构的个人理解

看了几天<深入理解linux内核>的ext2文件系统部分和VFS部分,稍微了解了点文件在内存中的存储结构,但是总是弄不清楚在硬盘上实际的存储方式,特别是文件夹的存储. 保存文件夹的结构很简单,没有这个文件夹下所有文件的索引,看了几遍书,都不能理解在硬盘上文件夹结构的存储,只能根据网上的例子自己跟着做实验.(过程参考了http://blog.chinaunix.net/u1/48373/showart_1210707.html的博客) 首先显示要分配一个空间,格式化为ext2分区,并在这个空间上

Ext2 文件系统的硬盘布局_unix linux

本文主要讲述 Linux 上比较流行的 ext2 文件系统在硬盘分区上的详细布局情况.Ext2 文件系统加上日志支持的下一个版本是 ext3 文件系统,它和 ext2 文件系统在硬盘布局上是一样的,其差别仅仅是 ext3 文件系统在硬盘上多出了一个特殊的 ino de(可以理解为一个特殊文件),用来记录文件系统的日志,也即所谓的 journal.由于本文并不讨论日志文件,所以本文的内容对于 ext2 和 ext3 都是适用的. 1.前言 本文的资料来源是 Linux 内核中 ext3 文件系统的

LINUX 的EXT2文件系统的组织方式

LINUX 的EXT2文件系统学习理解 文件系统的构架非常复杂,在学习中使用了EXT2进行分析和学习,EXT3,EXT4虽然有改进但是基本原理一致 结合学习的东西必须记录一下. 磁盘的块分布情况,默认的我们的一个块是4K,在磁盘中块被划分成成组的形式.记为GROUP 0-GROUP N. 使用dumpe2fs 命令可以看到block group的使用情况. 块的组织方式: 磁盘第一个块:启动块 (boot block) 组0:(假设I个块) 组第一个块:超级块 (SUPER BLOCK) 组第二

解析FAT16文件系统

引导扇区的信息如下:   1.  偏移地址00H,长度3,内容:EB 3C 90 跳转指令. 2.  偏移地址03H,长度8,内容:4D 53 44 4F 53 35 2E 30 为厂商标志和os 版本号,这里是MSDOS5.0. 3.  偏移地址0BH,长度2,内容:00 02.注意这里数据的布局,高地址放高字节,低地址放低字节(数据为小端格式组织),所以数据应该是0200,即512.表示的意思是,该磁盘每个扇区有512个字节.有的可能是1024.2048.4096. 4.  偏移地址0DH,