ファイルシステムの仕組み ― データはどうやってディスクに保存されるのか


inodeベースのファイルシステム構造 ディレクトリ report.txt inode 42 photo.jpg inode 87 > > inode 42 サイズ: 4KB rw-r--r-- inode 87 サイズ: 2MB rw-r--r-- データブロック B1 B2 B3 B4 B5 B6 B7 B8 report.txt photo.jpg ジャーナル(変更ログ) 10:01 inode 42 のサイズを 3KB > 4KB に更新 10:02 ブロック B8 を inode 87 に割り当て 10:03 ディレクトリに photo.jpg を追加 ※ 停電時もジャーナルから復旧できる
ファイルシステムの構造:ディレクトリ → inode → データブロック と ジャーナルの関係
ひよこ ひよこ

パソコンで「保存」を押すとファイルができるけど、ディスクの中では何が起きてるの?

ペンギン先生 ペンギン先生

いい質問だね。ディスクは「ブロック」という一定サイズの区画に分かれていて、ファイルシステムがそのブロックをまとめて管理しているんだ。ファイル名から実際のデータの場所を引けるようにする、いわば図書館の目録みたいな役割だよ。

ひよこ ひよこ

ブロック?ファイルって1個の塊じゃないの?

ペンギン先生 ペンギン先生

ディスク上では、1つのファイルが複数のブロック(たとえば4KBずつ)に分割されて保存されるんだ。そして「inode」と呼ばれるメタデータ領域に、ファイルのサイズ・権限・タイムスタンプ・どのブロックにデータがあるか、が記録されている。ファイル名とinodeの対応を管理するのがディレクトリだよ。

ひよこ ひよこ

ディレクトリって、ただのフォルダじゃないの?

ペンギン先生 ペンギン先生

実はディレクトリも「ファイル」の一種なんだ。中身は「ファイル名 → inode番号」の対応表。だから ls コマンドを打つと、ディレクトリファイルを読んで名前の一覧を表示し、各inodeを参照してサイズや日付を取得している、という流れになるよ。

ひよこ ひよこ

へぇ〜。でも停電とかでデータが壊れたりしないの?

ペンギン先生 ペンギン先生

そこを守るのが「ジャーナリング」だよ。ext4やNTFSは、データを書き込む前にまず「これからこういう変更をする」というログ(ジャーナル)を先に記録するんだ。電源が落ちても、再起動時にジャーナルを再生すれば中途半端な状態を修復できる。データベースのトランザクションログと同じ発想だね。

ひよこ ひよこ

ファイルシステムっていろいろ種類があるよね?どう違うの?

ペンギン先生 ペンギン先生

代表的なものだと、Linuxのext4は安定性とバランスが良い汎用型、WindowsNTFSアクセス制御や暗号化が充実、macOSのAPFSはSSD最適化とスナップショットが特徴だよ。大容量サーバー向けにはXFSが強くて、数百TBのファイルでも高速に扱えるんだ。

ひよこ ひよこ

ZFSってたまに聞くけど、何が特別なの?

ペンギン先生 ペンギン先生

ZFSは「コピーオンライト」という方式を使っていて、データを上書きせずに新しい場所に書き込むんだ。これによりスナップショット(ある時点の状態を丸ごと保存)がほぼゼロコストで作れる。さらに全データにチェックサムを付けて、読み出し時にビット腐敗(サイレントデータ破損)を検知・自動修復する機能もある。NASサーバーで人気なのはこの堅牢性のおかげだよ。

ひよこ ひよこ

HDDって使ってるとだんだん遅くなるって聞いたけど、あれって何?

ペンギン先生 ペンギン先生

それが「フラグメンテーション(断片化)」だね。ファイルの作成・削除を繰り返すと、1つのファイルがディスク上のバラバラなブロックに散らばってしまう。HDDは物理的にヘッドを動かして読むから、断片化すると読み書きが遅くなる。だからWindowsにはデフラグ(再配置)機能があるんだ。

ひよこ ひよこ

SSDではデフラグしなくていいの?

ペンギン先生 ペンギン先生

SSDはどのブロックにも同じ速度でアクセスできるから、断片化による速度低下はほぼないんだ。代わりにSSDではTRIMという仕組みが重要で、削除済みブロックをSSD通知して、内部で事前に消去しておくことで書き込み速度を維持する。SSDデフラグをかけると無駄な書き換えで寿命を縮めるだけだから、やらない方がいいよ。

ひよこ ひよこ

そういえば、ファイルを「削除」しても復元ソフトで戻せることがあるよね。あれはなんで?

ペンギン先生 ペンギン先生

ここが面白いところで、ファイルの「削除」は実はディレクトリエントリの削除(unlink)なんだ。inodeとデータブロック自体はすぐには消えない。新しいデータで上書きされるまでディスク上に残っているから、復元ツールで読み取れることがある。本当にデータを消したい場合は、ブロックをゼロやランダムデータで上書きする必要があるよ。

ひよこ ひよこ

ハードリンクとシンボリックリンクの違いも関係あるの?

ペンギン先生 ペンギン先生

まさにinodeの仕組みと直結しているね。ハードリンクは「同じinodeを指すもう1つのディレクトリエントリ」だから、元のファイル名を消してもinodeとデータは残る。一方シンボリックリンクは「パス名を記録した別のinode」で、リンク先を消すと壊れるリンク(dangling link)になる。unlinkでinode参照カウントが0になった時だけ、本当にデータ領域が解放されるんだ。

ひよこ ひよこ

inodeに限りがあるって聞いたことあるけど、困ることってある?

ペンギン先生 ペンギン先生

あるよ。ext4ではファイルシステム作成時にinode数の上限が決まるんだ。数百万個の小さなファイルを作るようなシステム、たとえばメールサーバーやキャッシュサーバーでは、ディスク容量が余っているのにinodeが枯渇して新しいファイルが作れなくなることがある。df -i で inode使用率を確認できるから、運用では容量とinode両方を監視するのがベテランの常識だね。

ひよこ ひよこ

ファイルシステムって奥が深いんだね…!普段意識しないけど大事な存在なんだ。

ペンギン先生 ペンギン先生

そうだね。ファイルシステムはOSの中でも最も身近で、かつ最もデータの安全に直結する部分だよ。ジャーナリング、コピーオンライト、TRIM、inode管理、どれもデータを守りながら速度を出すための工夫の積み重ねなんだ。普段は意識しなくていいけど、仕組みを知っておくとトラブル時に「何が起きているか」を推測できるようになるよ。