
ディスクは空きなのに書き込めない|inode枯渇の見つけ方と対処
「ディスクがいっぱいです」とエラーが出た。あるいはログに No space left on device。あわてて df -h を打ってみたら——使用率はまだ余裕がある。
この「容量は空いているのに書き込めない」状況は、保守運用でいちばん混乱する障害のひとつですよね。容量を空けようと大きなファイルを探しても見つからず、原因がわからないまま時間だけが過ぎていく。頭の片隅で「これ、本当にディスクの問題なの?」という不安がふくらみます。
でも、落ち着いて大丈夫です。この症状の多くは、inode(アイノード)の枯渇という、はっきり原因のある状態です。容量(バイト数)ではなく、ファイルの「数」の上限に当たっているだけ。見る場所さえ分かれば、順番にたどって落ち着けます。
この記事では、df -i での確認から、どこが小さいファイルを大量に抱えているかの絞り込み、消してよいものの見極め、そして再発を防ぐ監視までを一緒に整理します。環境(ext4/XFSなど)で細部は変わりますが、「数の上限を疑って、どこに集まっているかを探す」という流れはそのまま使えます。
結論:まずdf -iを打って、IUse%(inode使用率)が100%近くになっているパーティションがないかを見ます。あれば、原因は容量ではなく inode(ファイル数)の枯渇 です。次に、その中で 小さいファイルを大量に抱えているディレクトリを絞り込み(セッションファイル・キャッシュ・メール滞留・ログの破片などが定番)、中身と役割を確かめてから不要分を安全に減らします。そのうえで、掃除の自動化(ローテーション・期限削除)とdf -iの監視を足して、同じ枯渇を繰り返さないようにします。あわてて何かを消す前に、まず「容量ではなく数だった」と正体を1つに絞るのが、結果的にいちばん早いです。
何が起きているか:inodeは「ファイル1つにつき1枚」の管理札
まず、正体をはっきりさせます。Linuxのファイルシステム(ext4など)では、ファイルやディレクトリ1つひとつに inode(アイノード) という管理情報の札が割り当てられます。ファイルの中身が入る「容量」とは別に、この管理札の総数にも上限があり、ext4などでは基本的にフォーマット(作成)時に決まって、後から簡単には増やせません。
ここが今回のポイントです。
- 容量(バイト)とinode(個数)は別々のメーターです。片方が空いていても、もう片方が満杯なら書き込めません。
- 小さいファイルを大量に作る運用だと、容量はぜんぜん余っているのに、inodeだけ先に使い切ることがあります。1KBのファイルでも、10KBのファイルでも、消費するinodeは同じ「1つ」だからです。
- inodeを使い切ると、新しいファイルを作れず、容量が空いていても
No space left on device(ENOSPC) が返ります。エラーメッセージが「容量」と言うので、誤解しやすいところです。
つまり、df -h(容量)だけを見て「空いてるのに変だ」と悩むのは、片方のメーターしか見ていない状態なんです。もう一方の「数」のメーターを見れば、たいていは霧が晴れます。
どこから見るか:容量ではなく「数」のメーターを開く

順番はシンプルです。①数の枯渇かを確かめる → ②どこに集まっているかを絞る → ③安全に減らす → ④再発を防ぐ。手前から一段ずつ進みます。
① まず df -i で inode 使用率を見る
容量を見る df -h の代わりに、inode を見る df -i を打ちます。
df -iを実行すると、各パーティションの Inodes(総数)/IUsed(使用)/IFree(空き)/IUse%(使用率) が出ます。- IUse% が 100%(または直前) になっているパーティションがあれば、それが犯人です。容量の
df -hでは余裕に見えても、こちらが満杯なら書き込めません。 - どのパーティションかを控える:
/なのか/varなのか。切り分けの範囲が一気に狭まります。多くの現場では、ログやキャッシュ、メール、セッションがたまる/var配下で起きがちです。
ここで IUse% が100%近くなら、「容量ではなく数だった」と確定です。正体が分かった時点で、対処の半分は終わっています。逆に inode に余裕があるなら、原因は本当の容量不足や別の要因(後述)なので、そちらへ切り替えます。
ひと呼吸おきましょう。df -h だけを見て「空いてるのに書けない」と悩んでいた時間は、決して無駄ではありません。もう片方のメーターの存在を知っていれば、次からは最初の1分で正体にたどり着けます。
② 小さいファイルが集まっている場所を絞り込む
枯渇しているパーティションが分かったら、その中で inode(=ファイル数)を大量に消費しているディレクトリを探します。容量ではなく「個数」を数えるのがコツです。
- ディレクトリごとのファイル数を数える:対象のパーティションを起点に、
find <対象ディレクトリ> -xdev -type f | wc -lのようにファイル数を数えると、どこが多いかの当たりがつきます(-xdevで別のパーティションへ潜り込まないようにします)。 - 一段ずつ掘る:まずは対象パーティション直下の各ディレクトリで数を比べ、多いところをさらに一段掘る、を繰り返します。いきなり全体を数えると時間がかかるので、大きいところから順に絞るのが実務的です。
- 定番の「たまり場」を思い出す:セッションファイル(PHPのセッション等)、キャッシュ、メールキュー(滞留した大量メール)、細切れのログ、アップロードやテンポラリの残骸、監視やバッチが吐く小さな中間ファイル——このあたりが、容量は小さいのに数だけ膨れる典型です。
- 本番でのfindは負荷に注意:ファイル数が多いディレクトリを丸ごと走査すると負荷やI/Oが上がります。ピーク時を避け、範囲を区切って流すなど、一手ずつ様子を見ながら進めます。
数の多い場所を1〜2か所に絞れれば、次は「それは消していいのか」の見極めです。
③ 中身と役割を確かめてから、安全に減らす
たまり場が分かっても、いきなり削除しないことが大事です。小さいファイルの群れの中に、消すと壊れるものが混ざっていることがあります。
- まず「何のファイルか」を確かめる:いくつか中身やタイムスタンプを見て、アプリが使う一時ファイルなのか、単なる残骸なのかを判断します。役割が分からないものは、消す前に調べる。ここを飛ばさないだけで、二次障害をかなり防げます。
- 古いものから、範囲を区切って消す:消してよいと判断できたら、更新日時が古いものに絞って少しずつ削除します。
find ... -type f -mtime +Nのように期間で区切ると、必要な新しいものを巻き込みにくくなります。まず対象を数えてから、同じ条件で削除、が安全です。 - アプリ都合のものはアプリの作法で:メールキューやセッションは、直接rmするよりサービス側の仕組み(キューの処理・セッションのGC設定)で減らすのが本筋です。仕組みの背景(なぜたまったか)を1行残しておくと、次に活きます。
- 削除で急いで容量が変わらないとき:ファイルを消しても、そのファイルを開いたままのプロセスがいると、inodeがすぐには解放されないことがあります。掴んでいるプロセスの扱い(安全な再起動など)も含めて確認します。
削除して書き込めるようになったら、それは一次対処(急場をしのいだ状態)です。ここで終えず、④の再発防止まで続けるのが、同じ夜を繰り返さないコツです。
④ 再発を防ぐ:掃除の自動化と df -i の監視
inode枯渇は、一度起きた場所でまた起きやすい障害です。手で消して終わりにせず、仕組みで止めます。
- たまり場に「掃除」を仕込む:ログはローテーション、キャッシュ・一時ファイルは期限削除、セッションは自動GC——古いものが自然に消える流れを作ります。「増え続ける置き場」をなくすのが根本策です。
- 監視に
df -i(inode使用率)を足す:多くの監視は容量(df -h)だけを見ていて、inodeを見ていないことがあります。inode使用率にもしきい値(例:80%で通知)を入れておくと、満杯になる前に気づけます。 - 平常値(ベースライン)を知っておく:ふだんの inode 使用率がどのくらいかを控えておくと、「じわじわ増えている」異常に早く気づけます。
- 設計段階から意識できるなら:小さいファイルを大量に持つ用途(メール・セッション・キャッシュ)が分かっているなら、そのパーティションの持ち方や掃除方針を最初に決めておくと、後々ずっと楽になります。
具体例:「容量は6割なのに、突然メール送信でエラー」を追う
よくある一例を、順番に切り分けてみます。
- ①症状:バッチのメール送信が
No space left on deviceで失敗。df -hを見ると/varの容量使用率は6割ほどで、一見余裕がある。 - ②数のメーター:
df -iを打つと、/varの IUse% が 100%。容量ではなく inode の枯渇と判明。犯人は「数」だった。 - ③絞り込み:
/var配下でファイル数を数えると、メールキューのディレクトリに、送信に失敗して滞留した小さなメールファイルが大量にたまっていた。1通ずつは小さいので容量は増えず、数だけが膨れていた。 - ④見極めと対処:まず古い滞留分を期間で区切って確認・整理。次に、そもそも送信失敗が滞留の原因だったので、その失敗自体を調べて手当て。最後に、キューの滞留を通知する監視と、
df -iのしきい値監視を追加した。
もし最初に「容量が足りないのかも」と大きなファイル探しに時間を使っていたら、いつまでも原因にたどり着けなかったはずです。df -i で「数だった」と一手で切り替えられたからこそ、短い時間で本丸(滞留の原因)まで進めました。
影響:この障害を「知っている」だけで、夜が変わる
inode枯渇は、知らないと長く迷い、知っていれば数分で正体が分かる——差が極端に出る障害です。
- 「容量は空いているのに書けない」で消耗する時間を、
df -iの一手でほぼ無くせる。 - 原因がはっきりするので、やみくもに大きいファイルを探して回る手戻りが消える。
- 消してよいものを見極める習慣がつき、掃除で二次障害を起こすリスクが下がる。
- 監視に inode を足せば、満杯になる前に気づけるようになり、障害そのものが減る。
逆に、この存在を知らないままだと、同じ「空いてるのに書けない」で毎回ふりだしに戻ります。今日この記事で正体を1つ知ったことが、次の当直の自分を助けます。
明日やること:自分の現場の inode を、平常時に見ておく
障害の最中ではなく、落ち着いている今のうちにできる、いちばん小さな一歩です。
- 担当サーバーで
df -iを打って、各パーティションの IUse%(inode使用率) を控える。ふだんの値を知っておくだけでいい。 - その中で使用率が高め、または上がり続けていそうなパーティションがあれば、どのディレクトリにファイルが多いかをファイル数で軽く確認する。
- 定番のたまり場(セッション・キャッシュ・メール・ログの破片)に、古いものが消える仕組みが入っているかを見る。無ければ、掃除を1か所だけ足す。
- 監視に inode使用率のしきい値(例:80%)が入っているか確認する。容量だけ見ていたら、inodeも足す。
- 分かったこと(平常値・多いディレクトリ・掃除の有無)を、運用メモに1行残す。
全部を今日やらなくて大丈夫です。df -i を一度打って、自分の現場の平常値を知る——それだけで、次に「空いてるのに書けない」に出くわしたとき、迷わず正体にたどり着けます。
inode枯渇 切り分けチェックリスト
対応に着手するとき、これだけ確認できているかを見る項目です。コピーして自分のメモに当ててみてください。全部を毎回そろえる必要はありません。
まず外せない最低ラインはこの3つです。急いでいても、ここだけは押さえます。
- 【最低ライン】
df -h(容量)だけでなく、df -i(inode使用率)も見たか - 【最低ライン】IUse%が100%近いパーティションを特定できたか
- 【最低ライン】消す前に、ファイルの中身・役割・更新日時を確かめたか
次の項目は、原因を奥まで追うとき・再発を止めたいときに追加で確認します。当てはまらなければ飛ばして大丈夫です。
- 枯渇パーティション内で、ファイル数の多いディレクトリを絞り込んだか
- 定番のたまり場(セッション・キャッシュ・メール・ログの破片)を確認したか
- 削除は更新日時が古いものに絞り、期間で区切って行ったか
- 消しても解放されないとき、ファイルを掴んだままのプロセスを疑ったか
- たまり場に「古いものが消える仕組み」(ローテーション・期限削除・GC)を足したか
- 監視に inode使用率のしきい値を追加したか
- 平常値と、効いた対処を運用メモに残したか
全部に○が付かなくても大丈夫です。最低ラインの「df -i を見たか」さえ押さえられれば、容量探しで消耗するより、ずっと確かな一歩になります。
よければ、こちらも
inode枯渇は、「たまり場を掃除し続ける仕組み」と「早めに気づく監視」があるほど、起きにくくなります。ディスク周りの備えとログの見方をセットにしておくと、この手の障害がだいぶ軽くなります。
- ディスク使用率100%を防ぐログローテーションと監視設定:容量側の枯渇を防ぐ掃除と監視の入れ方です。inode側の掃除・監視と考え方は同じで、セットで持っておくと安心です。
- 500エラーが出たら最初に見る5つのログ|場所と確認の順番:「書き込めない」がアプリの5xxとして表面化したとき、どのログをどの順で見るかの土台になります。
- 大量ログからエラーを絞り込む|grep・tail・lessの実務術:
No space left on deviceの初出時刻や、たまり場を吐いている犯人をログから素早く絞る調べ方です。

「ディスクは空いているのに書き込めない」がこわいのは、エラーの言葉(容量)と本当の原因(数)がずれているからです。でも、df -i でもう一方のメーターを見ると決めるだけで、霧はかなり晴れます。多くの場合、あなたのサーバーがおかしいわけではなく、ただ小さなファイルが静かに増えて、数の上限に当たっていただけです。
今日は、落ち着いている今のうちに df -i を一度打って、自分の現場の平常値を知るところからで十分です。その一手が、次の「空いてるのに書けない」を、迷路ではなく手順に変えてくれます。
ほかの実務ヒントは記事一覧からどうぞ。保守運用の小さな備えを、メールでも少しずつお届けしています。