Unix的なファイルシステム(前篇)

HDDの構造

HDDは円盤です

HDDを分解したことがある人はご存じだと思いますが、磁気ディスク(プラッタ)は円盤です。
そしてこの円盤は何枚か重なっています。

ちなみにHDDを分解したことがない人はこちらを見ると良いです。
http://www.pc-info.sakura.ne.jp/hdd-bunkai1.html
http://www.youtube.com/watch?v=BI6j0M1li_A

パーティションで分割する

HDDが地球だとすると、ここは日本、ここはアメリカ、といった具合にそれぞれお互いに不可侵の領域を確保する、という説明であってると思いますがどうでしょう。

パーティションで区切る場合は外側から順番に割り当てられるようです。

円盤をトラックで区切る

トラックと呼ばれる同心円*1に分割されます。
運動会の100m走が分かりやすいかな。

トラックをさらに分割してセクタに

それぞれのトラックが分割され、セクタと呼ばれる単位に区切られます。512バイトといった一定の大きさに分割します。ディスクブロックという言葉はこのセクタと同義で使われるようです。

セクタに番号をつけると準備完了

番号が存在することによって、私たちはHDDを配列になっているブロックとして扱えるのです。

ブロックの配列をさらに3つの領域にわける

ファイルシステムは次の事を行います。

  • ファイルの内容を記録
  • オーナー、タイムスタンプなどのファイルのプロパティを記録
  • ファイルが属するディレクトリを記録

Unixはこれを次の3つにわけて実装しています。

  • スーパーブロック
  • iノードテーブル
  • データ領域
スーパーブロック

ファイルシステムの先頭ブロックにはファイルシステム自体の構造について記録されます。

iノードテーブル

ファイルは、サイズやオーナーのユーザーIDなどのプロパティを持っていますが、これらの情報はiノードで管理されます。

データ領域

実際に内容が記録される領域です。

たとえば1000バイトの内容を記録する必要がある場合、1セクタが512バイトしか記録できないのでこのデータ領域に割り振られたセクタから空いている2つのセクタを使用することになります。

このとき、どのセクタが使われているかはiノードテーブルで管理されることになります。

1500バイトのファイルを保存して、そのファイルls -aiでみると、inodeが47と表示されていたとします。
そのファイルの内容はデータ領域に格納されますが、この場合はセクタが3つほど必要です。

そしてこの時、セクタが常に連番になるとは限りませんが、inodeは固定長で13個分のスペースが用意されいるのでその順番に読み込んでいけば内容を復元することができます。

Perlで書くとこんな感じでしょうか

my %inode_of = (
    47   => [qw/627 200 992/],
	...
);

あれ、13個で足りる?

もちろん動画ファイルなど、おおきなファイルを保存しようとすると13*512では足りないケースがでてきます。

この場合は間接ブロックという作法が使われる事になります。


ちょっと長くなってきたので続きは次回

*1:中心が同じ大小異なる円