ext3固定分区后可以设置inode的数量最大为多少?

 原贴:http://blog.chinaunix.net/u/6303/showart_531007.html

ext3固定分区后可以设置inode的数量最大为多少?
和mlsx约定好了,每人写一篇,最后会合,本来我是想查查资料后,想想,然后就等待他的结果了。
但似乎他有点瞧不上不喜欢动手的人(属于臆断),那么我就只好硬着头皮上了,其实最可能的原因
就是我本地没有多余的磁盘,呵呵,那我也只能使用loopsetup了。
废话就不多说了,代码多读,多交流,互相印证才是此文的最终目的!

Ext3 文件系统将其所管理的磁盘或者分区(引导块除外)中的块划分到不同的块组中。每个块组大小
相同,当然最后一个块组所管理的块可能会少一些,其大小在文件系统创建时决定,主要取决于文件
系统的块大小,对于大小为4k的文件系统块来说,块组大小为 168M。每个块组都包含一些重要的元
数据信息,见下图:

或是如下图:

每个块组包含一个块位图块,一个 inode 位图块,一个或多个块用于描述 inode 表和用于存储文件数据的

数据块,除此之外,还有可能包含超级块和所有块组描述符表(取决于块组号和文件系统创建时使用的参数)。

下面将对这些元数据作一些简要介绍。

块位图用于描述该块组所管理的块的分配状态。如果某个块对应的位未置位,那么代表该块未分配,可以用于

存储数据;否则,代表该块已经用于存储数据或者该块不能够使用(譬如该块物理上不存在)。由于块位图仅占

一个块,因此这也就决定了块组的大小。

Inode位图用于描述该块组所管理的inode的分配状态。我们知道inode是用于描述文件的元数据,每个

node对应文件系统中唯一的一个号,如果inode位图中相应位置位,那么代表该inode已经分配出去;否则

可以使用。由于其仅占用一个块,因此这也限制了一个块组中所能够使用的最大 inode数量。

Inode表用于存储inode信息。它占用一个或多个块(为了有效的利用空间,多个inode存储在一个块中),其

大小取决于文件系统创建时的参数,由于inode位图的限制,决定了其最大所占用的空间。

超级块用于存储文件系统全局的配置参数(譬如:块大小,总的块数和inode数)和动态信息(譬如:当前空闲
块数和inode数),其处于文件系统开始位置的1k处,所占大小为1k。

上述资料来源于http://www.ibm.com/developerworks/cn/linux/l-cn-ext4resize/index.html,感谢作者!
理论部分说的差不多了,再深了就去/usr/src/$kernel/fs/ext3.c里看吧。现在我们就拿实际数据来验证一下吧。

具体的实验环境请参考本人以前写的一篇文章:http://blog.chinaunix.net/u/6303/showart_499626.html
环境:ubuntu8.04-alpha6 + ext3  + dumpe2fs1.40.8
建立一零文件,大小大约为500M
[root@lee-laptop LVM-test]# dd if=/dev/zero of=./file3.img bs=1000k count=512
512+0 records in
512+0 records out
检验结果
[root@lee-laptop LVM-test]# du -s file3.img
512504    file3.img
建立loop设备
lee@lee-laptop:/media/sda6/LVM-test$ sudo losetup /dev/loop0 file3.img
按照默认值格式化:
lee@lee-laptop:/media/sda6/LVM-test$ sudo mkfs.ext3 /dev/loop0
mke2fs 1.40.8 (13-Mar-2008)
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                           
Creating journal (8192 blocks): 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.
分析:
块大小默认为1024个字节,共有512000个块,则依据公式:分区中的块组数=分区大小/(块大小*8)
512504/1024*8=63(此处的1024为data-block-bitmap大小),也就说块组为63没错。
我们再来看inode.
inode-bitmap占一个块大小,也就说有1024byte,则每个块组中可至多存在inode数为1024*8即8192
个inode,因为1byte=8bit。
那么每个块组中存有8192个inode应是一个极限的值,当block大小决定了,那么这个分区的块组
也相应的被决定了,现在算下假如上述情况下,这个512504大小的分区,最多能指定inode数是多少?
8192*63=516096个
下面开始验证这么一个“阀值”?
lee@lee-laptop:~$ sudo mkfs.ext3 -b 1024 -g 8192 -N 516097 /dev/loop0
mke2fs 1.40.8 (13-Mar-2008)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
516608 inodes, 512000 blocks   //此处的inode已经不是我们指定的了,比我们预料中的多出511个。
25600 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=66906624
64 block groups                         //组也不是我们预料中的63了。
8104 blocks per group, 8104 fragments per group   //组已经不是我们设定的8192了
8072 inodes per group
Superblock backups stored on blocks:
    8105, 24313, 40521, 56729, 72937, 202601, 218809, 397097
下面是正常的情形。
lee@lee-laptop:~$ sudo mkfs.ext3 -b 1024 -g 8192 -N 516096 /dev/loop0
mke2fs 1.40.8 (13-Mar-2008)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
516096 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
8192 inodes per group
Superblock backups stored on blocks:
    8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

lee@lee-laptop:~$ sudo mkfs.ext3 -b 1024 -g 8192 -N 516095 /dev/loop0
mke2fs 1.40.8 (13-Mar-2008)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
516096 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
8192 inodes per group
Superblock backups stored on blocks:
    8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

虽然上述验证了理论,但是新的问题又出来了,当我们给定的三个参数中,有矛盾之处,那么系统
会优先满足谁了呢?
答案是显而易见的,满足了指定的inode数,但是块组中包含的块数却发生了变化!
由此可以看出,系统挪用了其他一些资源来满足这个特定的要求,但已是不能到具体了。那么这个极限值又是多少了呢?
经过几次反复试验,发现系统是减少了块组中的块数,也就是说让系统多出个块组了,来满足inode的数量。
那么当块组为64的时候,最大的inode数应该为524288,每组的块数为8104。
块组为65的时候,最大的inode数应该为532480,每组的块数为7976。
块组为66的时候,最大的inode数应该为540672,每组的块数为7856
......
......
当每组的块数为1296 的时候,则系统共有395个块组,则如果 inode可以的话,应该有3235840个,这是最后的极值。
那么能否总结出什么规律了呢?再来查看下此时的dumpe2fs的输出:
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          a3d9f790-b10f-4069-b370-b1272adbd261
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal 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:              3235840
Block count:              511921
Reserved block count:     25600
Free blocks:              94900
Free inodes:              3235829
First block:              1
Block size:               1024
Fragment size:            1024
Reserved GDT blocks:      256
Blocks per group:         1296
Fragments per group:      1296
Inodes per group:         8192
Inode blocks per group:   1024
Filesystem created:       Mon Apr 14 15:38:09 2008
Last mount time:          n/a
Last write time:          Mon Apr 14 15:39:07 2008
Mount count:              0
Maximum mount count:      27
Last checked:             Mon Apr 14 15:38:09 2008
Check interval:           15552000 (6 months)
Next check after:         Sat Oct 11 15:38:09 2008
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Journal inode:            8
也就说此时,在每个块组中除去inode占用的,只有272个块,除去4个固定的块,则有268个块,那么这就是剩下的data所占用的块了。
这个时候是没有意思的,虽然inode多了,但是能存储的数据却少了很多。
也就是说我现在这个500M的空间,只能存储268*1024*395=~100M
没错,请看我的df输出结果。
/dev/loop0            104M   12M   68M  15% /media/sda6/LVM-test/test

所以,最后的总结仍然是取得一个平衡值,既不影响到数据块,又能使inode最大。
当然如果你非执拗的不行,非得设置inode大于这个平衡值,那就得有足够的耐心等待性能。。



发表于: 2008-04-14,修改于: 2008-04-14 16:21,已浏览292次,有评论1条 推荐 投诉


网友评论
网友: mlsx 时间:2008-04-15 08:49:17 IP地址:220.205.178.★
1)果然是臆断
2)个人感觉没有必要在这个问题上钻入这么深,觉得了解了-i和-N就差不多了。
3)硬盘资源确实是稀缺资源,所以我一直都用iSCSI。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值