コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

ファイルシステムとは

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

ファイルシステムとは

このレッスンで分かること

  • ファイルシステムは「ディスク上の 生のバイト列 を、人間が扱いやすい ファイルとディレクトリ に組織化する層」です
  • データを どの位置に格納し、どう取り出すか を決めるアルゴリズムとデータ構造の集まりです
  • 「ファイル名でアクセスできる」という当たり前は、ファイルシステムの大量の翻訳作業の上に成り立っています

ファイルシステム とは

ファイルシステムとは。本レッスンでは、ファイルシステム の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

何を解決しているか

ディスク(HDD / SSD)は物理的には「セクタ(512B)」あるいは「ページ(4KB)」が一列に並んだ巨大な配列に過ぎません。アプリ側は「/home/alice/memo.txt を読みたい」と人間が分かる名前で頼みます。この 名前 → 物理位置の翻訳 を担うのがファイルシステムです。

主な機能は下記のとおりです。

  • 階層的な名前空間(ディレクトリツリー)の維持
  • ファイルの内容を 複数ブロックに分散 して格納
  • 空き領域の管理(断片化、再利用)
  • メタデータ(サイズ、更新日時、所有者、パーミッション)の保存
  • 障害からの復旧(ジャーナル、コピーオンライト)

概要図

diagram (will load when visible)

Linux は VFS(Virtual File System) という抽象層を持ち、上に乗るファイルシステムが何であっても同じ API で扱えます。ローカル FS だけでなく NFS(ネットワーク)や FUSE(ユーザー空間 FS)も同じインタフェースを実装します。

ファイルの構成要素

要素説明
データブロック実際の中身(典型 4KB ずつ)
メタデータi-node などに格納される属性
ディレクトリエントリ名前 → i-node 番号の対応
ジャーナル / ログ障害復旧用の操作履歴
スーパーブロックFS 全体の情報(種類、サイズなど)

具体例

memo.txt を開く流れは下記のとおりです。

ターミナル

cat /home/alice/memo.txt
  1. / ディレクトリの i-node を読む
  2. その中の名前リストから home の i-node 番号を取得
  3. home の i-node からデータを読み、alice のエントリを探す
  4. alice の i-node からデータを読み、memo.txt のエントリを探す
  5. memo.txt の i-node を読み、データブロックの位置を知る
  6. データブロックを読んで中身を返す

たった 1 ファイル開くだけで、複数の i-node とディレクトリブロックを辿っていることが分かります。OS のページキャッシュがこれらを RAM に保持するので、2 回目以降は爆速です。

マウント

複数のファイルシステムは マウント で 1 本のツリーに繋がります。

ターミナル

mount /dev/sdb1 /mnt/data # /dev/sdb1 を /mnt/data に貼る mount -t nfs server:/share /mnt/nfs # NFS mount -t tmpfs none /mnt/ram # メモリ上の FS

Linux のシステム上では mount | column -t でマウント済みの一覧が見られます。ルート / は通常 1 つの物理デバイス、/boot /home /proc /sys などは別 FS という構成が一般的です。

トレードオフ

  • ブロックサイズを大きくすると 大ファイルの I/O が速い 反面、小ファイルが多いと無駄が増えます
  • ジャーナリングは安全だが書き込みコストが上がります(次のレッスンで詳解)
  • ネットワーク FS は便利ですが、ローカル FS よりはるかに遅く、障害時の挙動が複雑

よくある誤解

  • 「ファイル名はディスクに保存される」は半分正解で、名前は ディレクトリエントリ に保存されており、i-node 自体には名前を持ちません
  • 「rm したら復元不可」も誤りで、ext4 などはメタデータが残ることがあり、専用ツールで復元できる場合もあります(重要データなら shred で上書きを)

やってみよう

stat memo.txt(または好きなファイル)を実行し、i-node 番号、サイズ、ブロック数、3 種類の時刻(Access / Modify / Change)を観察してみてください。次のレッスンでこの i-node を深掘りします。

よくある質問

Q. i-node とディレクトリエントリの違いは何ですか?

A. i-node はファイルのメタデータ(サイズ、所有者、パーミッション、データブロックへのポインタ)を保持する構造体で、名前を持ちません。ディレクトリエントリは「ファイル名 → i-node 番号」の対応表です。stat コマンドで i-node 番号を確認し、同じ i-node に複数の名前(ハードリンク)を付けられる仕組みと合わせて理解すると整理しやすいです。

Q. ブロックサイズはどう決まりますか?

A. 一般的には 4KB(4096B)が標準ですが、ファイルシステムをフォーマットするときに指定できます。大きなファイルを多く扱うなら大きめのブロックサイズにすると I/O 効率が上がり、小さなファイルが大量にある場合は小さめにすると断片化を抑えられます。mkfs.ext4 -b 4096 のように作成時に設定します。

Q. ファイルを削除すると中身はすぐ消えますか?

A. すぐには消えません。 rm はディレクトリエントリを削除してリンクカウントを 1 減らすだけです。リンクカウントが 0 になると i-node とデータブロックが「空き」としてマークされますが、物理的に上書きされるまでデータは残ります。そのため extundelete などのツールで復元できる場合があります。機密データを確実に消したいときは shred で上書きしてください。

次のレッスン

次は i-node とディレクトリ で、ファイルの属性を保持する i-node の内部構造とディレクトリがどのように名前と i-node 番号を対応付けているかを掘り下げます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. ファイルシステム の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. ファイルシステム とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン