コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
i-node とディレクトリ
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 photosi-node とブロックの関係図
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 つができることを確認しましょう。
- i-node の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. i-node とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン