ablog

不器用で落着きのない技術者のメモ

mke2fs の -i オプションに指定する値はどうやって決めたらよいか

$ mke2fs -c -b 4096 -i 4096 -j /dev/hda9

などと ext3ファイルシステムを作る時に -i オプションに指定する値はどうやって決めたらいいのかわからないので、調べてみた。

man で見てみると、

$ man mk2sfs

...

       -i bytes-per-inode
              Specify  the  bytes/inode  ratio.   mke2fs  creates an inode for
              every bytes-per-inode bytes of space on the  disk.   The  larger
              the  bytes-per-inode  ratio,  the  fewer inodes will be created.
              This value generally shouldn't be smaller than the blocksize  of
              the  filesystem,  since  then  too many inodes will be made.  Be
              warned that is not possible to expand the number of inodes on  a
              filesystem  after it is created, so be careful deciding the cor-
              rect value for this parameter.

しばらく眺めてて、やっと理解できた。

まとめ

10MB = 10485760 byte
10485760 byte / 4096 byte = 2602.571358 個 <-- 作られる inode の数
2602.571358 個 * 128 byte = 333129.1338 = 約25 KB <-- inode に使われる容量
10485760 byte - 333129.1338 byte = 10152630.87 byte = 約9.7 MB <-- データブロックに使われる容量
※正確にはスーパーブロックに使われる容量もあるのでもう少し減るはず。
  • mke2fs でファイルシステムを作るときに、「-i の値 > -b の値」とすると、inode が枯渇する可能性がある。
  • 逆に、「-i の値 < -b の値」とすると、必要以上に inode が作られて、無駄にディスク容量を使う。
  • 「-i の値 = -b の値」とすると、inode が枯渇することはないはず。1 byte のファイルでも物理的には1つのデータブロックが使われるので、1 byte のファイルというか 4096 byte 以下のファイルでパーティションを埋め尽くした場合、データブロックも inode も 100% 使用された状態になる。
  • 例えば、Oracle のデータファイルをおく領域の場合、ファイルサイズは大きいので、-i の値を大きくして inode の数を少なくするとデータブロックに使用できる領域が大きくなりディスクを効率的に使えると思う。

補足

*1:ファイルタイプ・アクセス権・所有者・所有グループ・ファイルサイズ・作成日時など