ext2ファイルシステム


Rev.4を表示中。最新版はこちら

ext2/3/4はファイルシステムをグループで管理し、各ファイルをHD全領域に散りばめることで、ブロックの断片化を起こりにくくしています。

・ファイルシステムイメージ
ブートブロックブロックグループ0ブロックグループ1・・・・ブロックグループn
・ブロックグループイメージ
スーパブロックブロックグループdesデータブロックbmpiノードbmpiノードtblデータブblk

データブロックbmpおよびiノードbmpは1ブロックです。従って1グループ内で管理するブロック数はブロックサイズを4096バイトとすると、4096×8個となり、サイズは4K×8×4K=128Mです。inodeおよびブロックを管理するのはグループ単位で行いますが、ファイルシステムとしてinode番号は一意となります。もしグループm内のn番目と言う場合、inode番号はm×グループ内inode数+nです。

inodeをアロケート(inode番号を割り当てる)するのはext2_new_inodeで行います。まずグループ番号を取得します。inodeはディレクトリまたはファイルによって、グループアロケートロジックがことなります。またディレクトリはマウントオプションにより、簡易なfind_group_dirと高度なfind_group_orlovに処理がゆだねられます。
 if (S_ISDIR(mode)) {
     if (test_opt(sb, OLDALLOC))
           group = find_group_dir(sb, dir);
     else
           group = find_group_orlov(sb, dir);
 } else 
     group = find_group_other(sb, dir);
find_group_dirはスーパブロック情報の全未使用のinode数をブロックグループ数で割ることで、それを平均的な未使用なinode数とし、全グループからこの平均的な未使用inode数より少ない、未使用inodeを有しているグループ内で、未使用なデータブロック数を一番多く有するグループが選ばれます。

find_group_orlovは、アロケートするディレクトリがルートの場合とそうでない場合で処理が分かれます。ルートの場合は平均的inode数と平均的ブロック数より小さいグループ内で、アロケートされているディレクトリが一番少ないものを選択します。ルート配下のディレクトリは全グループに散りばめるということです。
 freei = percpu_counter_read_positive(&sbi->s_freeinodes_counter);
 avefreei = freei / ngroups;
 free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter);
 avefreeb = free_blocks / ngroups;
 ndirs = percpu_counter_read_positive(&sbi->s_dirs_counter);

ルートでない場合は、最小未使用inode数、最小未使用ブロック数で、それより大きいものが選択されるようです(しきいちが異なる)。なお、rootと大きく違うのは、負債数というものが判断基準に入っています。これはグループ内のディレクトリと通常ファイルの割合をしめすもので、この値が大きければと対ファイル数と比べて、ディレクトリが多く入っていることになりますが、この値より小さい債数のグループが選択されます。
 blocks_per_dir = (le32_to_cpu(es->s_blocks_count)-free_blocks) / ndirs;
 max_debt = EXT2_BLOCKS_PER_GROUP(sb) / max(blocks_per_dir, BLOCK_COST);
 min_inodes = avefreei - inodes_per_group / 4;
 min_blocks = avefreeb - EXT2_BLOCKS_PER_GROUP(sb) / 4;
全グループ内で、未使用のinode数がmin_inodes多く、未使用のブロック数がmin_blocks多く、そしてmax_debtよりディレクトリ数が小さいものが選択されます。要は一定数の空きinode、空きブロックがあって、対ファイル数、ディレクトリ数割合が一定より小さいものが選択ということです。

プログラムを追っているいるだけで、今ひとつ具体的な違いはみえてきませんが、まあ、ディレクトリはちりばめて、できるだけ空いているグループを探していると言う感じです。

通常ファイルのfind_group_otherは単純です。まず、この親ディレクトリのグループに空きinode、空きブロックがあれば、それで選択されます。そうでなければ、適当なところから空いているinode、空いているブロックのあるグループをみつけます。

つづきます。

最終更新 2010/03/26 14:00:17 - north
(2010/03/26 13:56:21 作成)


検索

アクセス数
3593194
最近のコメント
コアダンプファイル - sakaia
list_head構造体 - yocto_no_yomikata
勧告ロックと強制ロック - wataash
LKMからのファイル出力 - 重松 宏昌
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
Adsense
広告情報が設定されていません。