inodeとは?Linuxのファイル管理の仕組みをわかりやすく解説

Linux

Linuxサーバーを運用していると、「inodeが枯渇してファイルが作れない」というトラブルに出くわすことがあります。
ディスク容量には余裕があるのにファイルを作れない——この不思議な現象の裏側には、inode(アイノード)という仕組みが関わっています。
この記事では、inodeとは何か、何を管理しているのか、確認・運用方法まで、初心者にもわかるように解説します。


スポンサーリンク

inodeとは

inode(アイノード)とは、UNIX系OSのファイルシステムでファイルやディレクトリごとに作成される管理データのことです。
ext2・ext3・ext4などのファイルシステムで使用されており、各ファイルの「メタデータ(属性情報)」を格納しています。

ファイルの実データはディスク上の「データブロック」に書き込まれますが、そのデータがどこにあるのか、誰が所有しているのか、いつ更新されたのか——こうした情報をまとめて管理しているのがinodeです。

ファイルシステムの基本構造についてはLinuxファイルシステムの基本構造とは?主要ディレクトリの役割を完全解説も参考にしてください。

“i” は “index” の略

inodeの “i” が何を意味するかについて、UNIX開発者のデニス・リッチーは「たぶん “index” が元になっているんじゃないかと思う」と述べています(Wikipediaより)。
ただしリッチー自身も語源を確信しておらず、「実際、私にもわからない」と前置きした上での推測発言です。
全ファイルのアクセス情報をディスク内のフラット配列に格納しており、i-number(inode番号)はその配列のインデックス、i-nodeはその配列の要素にあたるためです。


inodeに格納されている情報

inodeが管理する情報は以下のとおりです。
ファイル名はinodeには含まれない点が重要なポイントで、ファイル名はディレクトリが別途リストとして管理しています。

項目内容
inode番号パーティション内で一意の整数値
ファイルの種別通常ファイル・ディレクトリ・シンボリックリンクなど
パーミッション所有者・グループ・その他の読み書き実行権限
所有者UID/GIDユーザーIDとグループID
ファイルサイズバイト単位のサイズ
タイムスタンプatime(最終参照)・mtime(最終更新)・ctime(最終inode更新)
ハードリンク数このinodeを参照するリンクの数
データブロックへのポインタ実データが格納されている場所

ファイルにアクセスするときの仕組み

ファイル名でアクセスが行われるとき、Linuxは以下の順序で処理します。

  1. ディレクトリ内のリストからファイル名に対応するinode番号を取得する
  2. inode番号を使ってinodeのメタデータを読み込む
  3. inode内のデータブロックポインタをたどって実データにアクセスする

プログラムがファイルをオープンした後は、inode番号をベースにやり取りが行われるため、OSはファイル名を「忘れて」しまいます。
これが、ファイルを開いたまま削除しても実データが消えない理由です(最後にクローズされたときに削除される)。


inodeとハードリンクの関係

ハードリンクは、同じinode番号を参照する別名を作る仕組みです。
複数のファイル名が1つのinodeを指すため、どの名前から開いても同じデータにアクセスできます。

# ハードリンクを作成する
ln original.txt hardlink.txt

# 同じinode番号になっていることを確認
ls -li

出力例:

17425057 -rw-r--r--. 2 user user 100 3月 1 10:00 hardlink.txt
17425057 -rw-r--r--. 2 user user 100 3月 1 10:00 original.txt

ハードリンク数(上記例の 2)がinodeの参照カウントです。
このカウントが0になり、かつオープン中のファイルがすべてクローズされて初めて、ファイルデータが削除されます(前述のとおり、開いたまま削除しても最後にクローズされるまでデータは残存します)。

一方、シンボリックリンクは独自のinodeを持ちますが、そのinodeに格納されているのは元ファイルのパス文字列です。
そのため元ファイルを削除するとパスの参照先がなくなり、デッドリンクになります。


inodeを確認するコマンド

ファイルのinode番号を確認する(ls -i)

ls -li

出力例:

17425056 drwxr-xr-x. 2 root root 45  3月  1 10:00 .
 8409153 dr-xr-x---. 20 root root 4096  3月  1 10:00 ..
17425057 -rw-r--r--. 1 root root  0  3月  1 10:00 a.txt
17425059 -rw-r--r--. 1 root root  0  3月  1 10:00 b.txt

一番左の数値がinode番号です。

ファイルの詳細なinode情報を確認する(stat)

stat a.txt

出力例:

  File: 'a.txt'
  Size: 0           Blocks: 0     IO Block: 4096 通常の空ファイル
Device: fd00h/64768d  Inode: 17425057  Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 0/ root)  Gid: ( 0/ root)
Access: 2025-03-01 10:00:00
Modify: 2025-03-01 10:00:00
Change: 2025-03-01 10:00:00

パーティション全体のinode使用状況を確認する(df -i)

df -i

出力例:

Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda2      363600  85013  278587   24% /
tmpfs          127561      5  127556    1% /dev/shm

Inodes が上限数、IUsed が使用数、IFree が空き数です。

ストレージ容量の確認方法全般についてはLinuxのストレージ容量を確認する全方法!dfコマンドから可視化ツールまで完全ガイドも参考にしてください。


inodeの上限(枯渇問題)

inodeの数はファイルシステム作成時(フォーマット時)に決まります。
ext4では「ファイルシステム全体の容量 ÷ bytes-per-inode(デフォルト16384)」で上限数が算出されます。

ディスク容量が余っていてもinodeが枯渇するとファイルを作れなくなります。
小さなファイルを大量に作成するシステム(メールスプール・ログ・テンポラリファイルの大量生成など)では特に注意が必要です。

inodeが枯渇した状態で touch コマンドを実行すると以下のエラーになります。

touch: cannot touch 'test.txt': デバイスに空き領域がありません

df ではディスク残量を示す Use% が低くても、df -iIUse% が100%になっているケースがあります。
定期的に df -i でinode使用率を監視することをおすすめします。

ext4ファイルシステムの仕組みや上限についての詳細はext4とは?Linuxの標準ファイルシステムを初心者向けに徹底解説も参考にしてください。


まとめ

inodeとは、LinuxなどUNIX系OSでファイルやディレクトリごとに作られるメタデータ管理の仕組みです。
パーミッション・所有者・タイムスタンプ・データブロックへのポインタなどを格納しており、ファイル名はinodeではなくディレクトリが管理しています。

サーバー運用で押さえておきたいポイントをまとめると以下のとおりです。

  • ls -li でファイルのinode番号を確認できる
  • stat <ファイル名> でinode情報の詳細を確認できる
  • df -i でパーティション全体のinode使用状況を確認できる
  • ディスク容量が余っていてもinodeが枯渇するとファイルが作れなくなる
  • inodeの上限はフォーマット時に決まり、後から変更できない(一部例外あり)

ディスク容量だけでなくinode使用率も定期的に監視することで、突然のファイル作成エラーを未然に防ぐことができます。
パーティション設計の際にはLinuxのパーティションとは?意味と基本構成をわかりやすく解説もあわせて確認しておくといいでしょう。


コメント

タイトルとURLをコピーしました