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

i-node とディレクトリ

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

i-node とディレクトリ

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

  • i-node(インデックスノード)はファイル 1 つにつき 1 つ存在する メタデータの塊 です
  • ファイル名は i-node には含まれず、ディレクトリエントリ が「名前 → i-node 番号」の対応を持ちます
  • ハードリンクとシンボリックリンクの違いは、i-node 番号を共有するか別の i-node にパスを書くかの違いです

i-node とディレクトリ とは

i-node とディレクトリ。本レッスンでは、i-node とディレクトリ の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

i-node の中身

i-node には下記のような情報がまとまっています(ext4 の例)。

項目説明
i-node 番号FS 内で一意
ファイルタイプ通常/ディレクトリ/リンク/デバイス等
サイズバイト数
所有者 UID / GIDパーミッション判定に使用
パーミッション(mode)rwx の 9 ビット + setuid 等
リンクカウント自分を指すディレクトリエントリの数
タイムスタンプatime / mtime / ctime
データブロックのポインタ直接 12 個、間接、二重間接、三重間接

ファイル名は含まれていない ことに注意してください。名前は親ディレクトリ側が持ちます。

ディレクトリの正体

ディレクトリは「名前 → i-node 番号 の対応表を持つ特別なファイル」です。

プレーンテキスト

/home/alice ディレクトリの内容(抜粋) +----------------------+----------+ | 名前 | i-node # | +----------------------+----------+ | . | 12345 | 自分自身 | .. | 1 | 親ディレクトリ | memo.txt | 67890 | | photos | 67891 | | .bashrc | 67892 | +----------------------+----------+

ls -i を実行すると i-node 番号が見られます。

ターミナル

ls -li

プレーンテキスト

total 8 67890 -rw-r--r-- 1 alice users 240 May 27 11:00 memo.txt 67891 drwxr-xr-x 2 alice users 4096 May 27 11:01 photos

i-node とブロックの関係図

diagram (will load when visible)

ext2/ext3 などの古典的な実装では直接ポインタが 12 個(48KB まで)、それを超える場合は 間接 → 二重間接 → 三重間接 とブロックを介してアドレスします。なお、ext4 は通常エクステント(extent)方式を採用していますが、ここでは仕組みを理解しやすい古典的な間接ブロック方式で説明しています。

ハードリンクとシンボリックリンク

ターミナル

ln file1 file2 # ハードリンク (同じ i-node を指す別名) ln -s file1 file3 # シンボリックリンク(パスを記録) ls -li

プレーンテキスト

67890 -rw-r--r-- 2 alice users 240 May 27 11:00 file1 67890 -rw-r--r-- 2 alice users 240 May 27 11:00 file2 67893 lrwxrwxrwx 1 alice users 5 May 27 11:05 file3 -> file1
観点ハードリンクシンボリックリンク
i-node 番号同じ別(リンク用 i-node)
中身同じ実体テキストでパスを保持
別 FS をまたぐ不可可能
元ファイル削除リンクカウント減るだけ、データは生存リンク切れ
ディレクトリへの作成禁止可能

リンクカウントが 0 になり、かつそのファイルを開いているプロセスもいなくなると、データブロックが解放されます。逆に 開きっぱなしのファイルは rm してもデータが生きる という性質はログローテートの定番テクです。

具体例

ターミナル

echo "hello" > a.txt ln a.txt b.txt stat a.txt b.txt # Inode: 同じ rm a.txt cat b.txt # まだ読める ("hello")

ハードリンク先が残っているので i-node は解放されません。

トレードオフ

  • i-node は FS 作成時に 固定数 で確保される実装(ext4 等)があります。小ファイルが膨大に増えると、容量は余っているのに「i-node 不足でファイル作成不可」が起こります(df -i で確認可)
  • ハードリンクは便利ですが、find のような走査ツールで同じ内容を二重カウントする原因になることもあります

よくある誤解

  • 「シンボリックリンクはエイリアス」――概念は近いですが、シンボリックリンクは 専用の i-node 1 つ消費 します
  • 「ファイル名を変えると i-node も変わる」も誤解で、mv はディレクトリエントリの名前を更新するだけで i-node は不変です

やってみよう

ターミナル

df -i

各 FS の i-node 残量が見られます。/var/log などに小ファイルが多い環境では、容量より先に i-node が枯渇することがあります。

よくある質問

Q. このトピックは実務でどう役立ちますか?

A. DB のクエリ最適化、API 設計、データ構造の選択など、設計判断の根拠になります。表面的にライブラリを使うだけでなく「なぜそれが速いのか」を理解できると、性能問題を未然に防げます。コーディング面接でも頻出のテーマです。

Q. 計算量はどう求めれば良いですか?

A. ループのネストごとに掛け算する、再帰なら漸化式から解く、というのが基本です。Big-O 表記は定数倍と低次の項を無視するため、n の指数(n²、n log n など)に注目してください。最悪・平均・最良の 3 つを意識すると説得力が増します。

Q. 覚えるべき定番アルゴリズムは何ですか?

A. 二分探索、クイックソート/マージソート、BFS/DFS、ダイクストラ、DP の基本問題(フィボナッチ・ナップサック)が必修です。これらを「白紙から書ける」状態にすると、応用問題が一気に解けるようになります。

次のレッスン

次は ext4 / APFS / NTFS の違い で、代表的なファイルシステムの設計差を学びます。

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

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

理解度チェック (30 秒)

Q. i-node とは何か、1 文で説明してください。

この章のポイント

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

関連レッスン