Linuxでinodeが枯渇した日の話|ディスク容量があるのにファイルが作れない謎を解いた経験

HOMEリナックスマスター.JP 公式ブログLinux学習ガイド > Linuxでinodeが枯渇した日の話|ディスク容量があるのにファイルが作れない謎を解いた経験
宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
「No space left on device」——ファイルを作ろうとしたアプリがエラーを吐き出した夜、私が真っ先にやったのはdfコマンドでディスクの空き確認でした。結果は「78%の空き」。何も問題ない。

「なぜ? 空きがあるのにファイルが作れない」——2003年、SEとして客先常駐していた頃の経験です。この謎を解くまでに数時間かかりました。答えはinodeの枯渇でした。

この記事では、セミナーで3,100名以上を指導してきた私が、inode枯渇の正体と、df -iコマンドを使った真因の特定手順、そして再発させないための3つの習慣を解説します。

この記事のポイント

・dfで空きがあっても「df -i」でinodeが100%ならファイルは作れない
・inodeはファイルの「管理情報スロット」でファイル1つにつき1つ消費する
・find /path -xdev -type f | wc -l でディレクトリごとのファイル数を数えられる
・小さなファイルを大量生成するアプリが主な原因


Linuxでinodeが枯渇した日の話|ディスク容量があるのにファイルが作れない謎を解いた経験
「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

「ディスクが空いているのにファイルが作れない」——謎の状況

2003年、私はSEとして客先のLinuxサーバーを担当していました。ある夕方、担当しているWebアプリのサーバーから「ファイルの書き込みに失敗している」という連絡が入りました。

ログを確認すると、PHPアプリケーションがセッションファイルの作成に失敗していました。エラーメッセージはこうです。

Warning: session_start(): open(/tmp/sess_xxxx, O_RDWR) failed: No space left on device (28) in /var/www/html/index.php on line 3

「No space left on device」。ディスク容量が足りないというエラーです。しかし少し前にサーバーを確認したとき、まだ余裕があったはずでした。まず状態を確認しました。

# ディスク空き容量の確認 $ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 40G 8.8G 31G 22% / /dev/sda2 10G 2.1G 7.9G 21% /var tmpfs 1.0G 0 1.0G 0% /dev/shm

ディスクの使用率は22%。空きは十分あります。「なぜファイルが作れないのか」——私はしばらく頭を抱えました。Apacheを再起動しても、PHPを再起動しても、同じエラーが出続けます。

数時間後に気づいたこと——inodeという概念

調査を続ける中で、私がたどり着いたのは「inode」という言葉でした。当時の私にはあまり馴染みがなかった概念です。先輩のエンジニアに相談し、別のコマンドを試すように教えてもらいました。

# inodeの使用状況を確認する(dfに -i オプションを付ける) $ df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda1 2621440 2621440 0 100% / /dev/sda2 655360 98304 557056 15% /var tmpfs 256000 1 255999 1% /dev/shm

「IUse%」列が「100%」——ルートパーティションのinodeが全部埋まっていました。「Inodes」の数(2,621,440)が全て「IUsed」で消費され、「IFree」がゼロです。

この状態では、ディスクに物理的な空き容量があっても、新しいファイルを1つも作れません。謎の答えが分かった瞬間でした。

inodeとは何か——Linuxのファイルシステムが管理する「ファイルの戸籍」

inodeはLinuxのファイルシステムが内部的に使う管理情報の単位です。ファイルやディレクトリ1つにつき、1つのinodeが割り当てられます。inode内には以下のような情報が格納されています。

ファイルの種類:通常ファイル・ディレクトリ・シンボリックリンクの区別
パーミッション:所有者・グループ・その他の読み書き実行権限
タイムスタンプ:作成日時・最終変更日時・最終アクセス日時
データブロックの場所:実際のデータがディスクのどこにあるかを示すポインタ

重要なのは、inodeの総数はファイルシステムの作成時(mkfs)に決まり、後から増やせないという点です。ext4では通常、16KBごとに1つのinodeが作成される設定が多いですが、小さなファイルを大量に作るとinodeだけが先に尽きてしまいます。

原因のディレクトリを探す——findコマンドでファイル数を数える

inodeの枯渇が確認できたら、次は「どのディレクトリが大量のファイルを持っているか」を特定します。20年以上サーバーを運用してきた経験から言うと、inode枯渇の主な原因として最も多いのは、小さなファイルの大量生成です。

1. ファイル数が多いディレクトリを特定する

まずルートからサブディレクトリごとにファイル数を数えます。-xdevオプションで他のパーティションをまたがずに調査できます。

# 各サブディレクトリ配下のファイル数をカウントする(件数の多い順に表示) $ for dir in /*; do count=$(find "$dir" -xdev -type f 2>/dev/null | wc -l); echo "$count $dir"; done | sort -rn | head -10 2615233 /tmp 154820 /usr 8752 /lib 5614 /var 4801 /home 1832 /etc 124 /bin 42 /boot 0 /opt

「/tmp: 2,615,233」——/tmpに260万超のファイルがありました。ルートパーティションのinode数(2,621,440)とほぼ一致しています。犯人は/tmpでした。

2. /tmp配下のファイルを確認する

# /tmpのファイル一覧(lsは大量すぎて固まる可能性があるのでheadで先頭のみ確認) $ ls /tmp | head -10 sess_0a1b2c3d4e5f6a7b sess_1c2d3e4f5a6b7c8d sess_2e3f4a5b6c7d8e9f sess_3a4b5c6d7e8f9a0b sess_4b5c6d7e8f9a0b1c sess_5c6d7e8f9a0b1c2d sess_6d7e8f9a0b1c2d3e sess_7e8f9a0b1c2d3e4f sess_8f9a0b1c2d3e4f5a sess_9a0b1c2d3e4f5a6b

PHPのセッションファイルでした。このサーバーではPHPの設定でセッションファイルを/tmpに保存するようになっており、有効期限切れのファイルを自動削除するGC(ガベージコレクション)の機能が意図せず無効になっていたのです。毎日数千から数万のセッションファイルが積み上がり、数週間で260万を超えていました。

3. 不要なファイルを削除してinodeを解放する

大量のファイルをrmで一括削除する場合、引数が多すぎて「argument list too long」エラーになることがあります。findとxargsを組み合わせて安全に削除します。

# まず削除対象のファイル数を確認する(実行前に必ずファイル数を把握する) $ find /tmp -maxdepth 1 -name 'sess_*' -type f | wc -l 2615233 # 実際に削除する(xargsで分割処理することで引数過多エラーを回避) $ find /tmp -maxdepth 1 -name 'sess_*' -type f | xargs rm -f # 削除後にinode使用状況を再確認する $ df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda1 2621440 6207 2615233 1% / /dev/sda2 655360 98304 557056 15% /var

inode使用率が1%まで回復しました。アプリのエラーも即座に解消されました。あの失敗から20年、私は「df -i」を「障害発生時に真っ先に確認するコマンド」のリストに加えています。

inode枯渇を防ぐ3つの習慣

20年以上サーバーを運用してきた経験から、あの夜の経験が生んだ習慣を3つ紹介します。

1. df -iを日次監視に追加する

dfだけではinode枯渇を検知できません。日次のヘルスチェックにはdf -hとdf -iの両方を含めることが鉄則です。監視ツールを使っている場合は、inode使用率のアラートを80%で設定しておくと余裕を持って対処できます。

# ディスク容量とinode使用率を両方一度に確認するコマンド $ df -h && echo "---inode---" && df -i

2. 一時ファイルを作るアプリの設定を定期確認する

PHPのセッション管理、メールスプールのmbox、Apacheのアクセスログローテーションなど、小さなファイルを大量生成する可能性があるアプリは要注意です。以下の点を確認してください。

PHPの場合:session.gc_probabilityとsession.gc_maxlifetimeが有効になっているか
一時ファイルの場所:/tmpや/varなどどのパーティションに作られるかを把握する
ログローテーション:logrotateで古いログが定期的に削除されているか

セミナーで3,100名以上を指導してきた中で、inode枯渇で困っていたエンジニアのほぼ全員が「アプリ側の設定は確認していなかった」と話していました。

3. cronで古い一時ファイルを定期削除する

GCが機能している環境でも、念のためにcronで定期的に古い一時ファイルを削除するジョブを組んでおくと安心です。

# 7日以上前のPHPセッションファイルを毎日午前4時に削除する(crontab記載例) MAILTO="" 0 4 * * * find /tmp -name 'sess_*' -mtime +7 -type f | xargs rm -f

まとめ

「No space left on device」なのにdfで空きがある——これはinodeの枯渇が原因です。2003年に経験したこの事故は、20年以上の運用で「知っているか知らないかで大違いな典型例」として今もセミナーで話し続けています。

やりたいこと コマンド
inode使用率を確認する df -i
ディレクトリごとのファイル数を数える find /path -xdev -type f | wc -l
大量ファイルを安全に削除する find /tmp -name 'sess_*' | xargs rm -f
現在のinode設定を確認する tune2fs -l /dev/sda1 | grep -i inode
Linuxのトラブルシューティングで「エラーメッセージが指している原因」と「本当の原因」が違うことは珍しくありません。「No space left on device」はディスク容量の話だと思いがちですが、その下にはinodeという管理レイヤーが存在します。「df」だけでなく「df -i」もセットで確認する習慣が、誰もがはまりがちな落とし穴を防いでくれます。

本番サーバーのトラブル対応で「まず確認する手順」の全体像については「Linuxの本番サーバー作業でヒヤリハットした経験談|現役講師が20年で学んだ事故を防ぐ3つの確認習慣」も参考にしてください。ディスクが急に満杯になった場合の対処については「Linuxでディスクが容量不足になった時の対処手順|原因ファイルの特定から安全な削除まで」でも詳しく解説しています。

「No space left on device」で焦らない「本物のLinux力」を身につけませんか?

「エラーメッセージが出ると頭が真っ白になる」という方は多いです。現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。


Linux無料マニュアル(図解60P) 名前とメールで30秒登録