【解決】 No space left on device (inodes) の解決方法と原因 | Linux トラブルシューティング

Windowsをご利用の皆さん、Linuxサーバーで「No space left on device (inodes)」というエラーに遭遇し、困っていませんか?
「まだディスク容量は残っているはずなのに、なぜかファイルが作れない…」と表示され、途方に暮れている方もいらっしゃるかもしれませんね。
ご安心ください。このエラーはLinuxシステムで発生する一般的な問題の一つであり、適切に対処すれば必ず解決できます。
この記事では、Windowsユーザーの皆さんがこのLinux特有のエラーを理解し、迅速に解決するための具体的な手順を、PowershellやCmdを使ったアプローチを含めて詳しく解説します。
落ち着いて、一つずつ対処していきましょう!

1. No space left on device (inodes) とは?(概要と緊急度)

「No space left on device (inodes)」エラーは、「ディスク容量は残っているのに、新しいファイルやディレクトリを作成できない」という状況を示すLinux特有のメッセージです。
これは、ディスクの物理的な空き容量不足ではなく、ファイルシステム上の「inode(アイノード)」という特殊なリソースが枯渇していることが原因で発生します。

  • inodeとは?
    inodeは、Linuxファイルシステムにおいて、ファイルやディレクトリのメタデータ(ファイル名、所有者、パーミッション、作成日時、更新日時、そしてデータがディスク上のどこに保存されているか、など)を管理するためのデータ構造です。
    新しいファイルやディレクトリが作成されるたびに、1つのinodeが消費されます。
  • なぜ容量があるのにinodeが不足するのか?
    ディスクの総容量は大きくても、非常に小さなファイル(数バイト〜数KB)が大量に存在する場合、ディスク容量を使い切る前にinodeの割り当て上限に達してしまうことがあります。
    たとえば、Webサーバーのセッションファイル、メールスプール、一時的なログファイル、プログラムのキャッシュなどが大量に生成される環境でよく見られます。
  • 緊急度: 高
    inodeが不足すると、新しいファイルの作成だけでなく、既存ファイルの変更、ログの書き込み、さらにはシステムが一時ファイルを作成できなくなり、多くのサービスが正常に動作しなくなる可能性があります。
    システム全体の安定性に影響を及ぼすため、このエラーが発生した場合は迅速な対処が必要です。

2. 【最速】今すぐ試すべき解決策

まずは落ち着いて、現状を把握し、一時的にシステムを回復させるための最も簡単な解決策を試しましょう。
この問題の解決は、Windows PCからSSHクライアントを使ってLinuxサーバーに接続し、Linuxコマンドを実行することで行います。

解決策1:不要なファイルを削除し、inodeを解放する

最も直接的かつ効果的な解決策は、不要なファイル(特に小さなファイル)を特定して削除し、inodeを解放することです。
まずは、Windows PowerShellまたはCmdからLinuxサーバーへSSH接続を行います。

ステップ1: WindowsからLinuxサーバーへSSH接続する

Windows 10以降では、PowerShellやCmdから標準でSSHクライアントが利用できます。
以下のコマンドをPowerShellまたはCmdで実行し、Linuxサーバーに接続してください。

# Windows PowerShell または Cmd からLinuxサーバーにSSH接続する例
# 接続先のユーザー名と、LinuxサーバーのIPアドレス(またはホスト名)を指定します。
# 接続時にパスワード、またはSSH鍵認証が求められます。
ssh your_username@your_linux_server_ip_or_hostname

例: ssh ec2-user@192.168.1.100

ステップ2: Linuxサーバー上でinodeの使用状況を確認する

SSHでLinuxサーバーに接続できたら、まずdf -iコマンドで現在のinode使用状況を確認しましょう。
これにより、どのパーティションでinodeが枯渇しているかが一目でわかります。

# Linuxサーバー上で実行
df -i

出力例:

Filesystem       Inodes IUsed IFree IUse% Mounted on
udev             498186   403 497783    1% /dev
tmpfs            501170   575 500595    1% /run
/dev/sda1        655360 655360      0  100% /   <-- ここが100%になっている場合、inode不足です
tmpfs            501170     1 501169    1% /dev/shm
tmpfs            501170     3 501167    1% /run/lock
tmpfs            501170    16 501154    1% /sys/fs/cgroup
/dev/sdb1        262144   100 262044    1% /data

ステップ3: inodeを大量消費しているディレクトリを特定する

df -iでinodeが100%に近いパーティションを特定したら、そのパーティション内のどのディレクトリが大量のファイルを抱えているかを調べます。
以下のコマンドは、カレントディレクトリ直下の各ディレクトリがどれだけのinodeを使用しているかを概算で表示します。

# Linuxサーバー上で実行 (カレントディレクトリ直下のinode数をカウント)
# inodeが枯渇しているパーティションのルートディレクトリ(例: /)から実行すると良いでしょう
# 例: cd /
for i in $(find . -maxdepth 1 -type d ! -name "."); do echo "$(find $i -type f -print | wc -l) $(echo $i | cut -c 3-)"; done | sort -nr

これにより、ファイル数が特に多いディレクトリが上位に表示されるはずです。
特に以下のディレクトリは、一時ファイルやログファイルが大量に生成されやすいため、確認を推奨します。

  • /tmp, /var/tmp: 一時ファイル
  • /var/log: ログファイル
  • /var/lib/php/sessions (または類似パス): PHPセッションファイル
  • /var/cache/apt/archives (Debian/Ubuntu系): パッケージキャッシュ
  • Webサーバーのキャッシュディレクトリやアップロードディレクトリなど

ステップ4: 不要なファイルを削除する

大量のinodeを消費しているディレクトリを特定したら、その中の不要なファイルを安全に削除します。
削除コマンドは非常に強力なので、削除対象が本当に不要なファイルであることを必ず確認してください。
以下の例は、古い一時ファイルやログファイルを削除する一般的な方法です。

# Linuxサーバー上で実行

# 例1: /tmpディレクトリ内の7日以上更新されていないファイルを削除
# 実際に削除する前に、-delete の代わりに -print を付けて確認することを強く推奨します
find /tmp -type f -mtime +7 -print
# 確認後、実際に削除
# find /tmp -type f -mtime +7 -delete


# 例2: /var/log ディレクトリ内の古いログファイルを削除(より慎重に)
# ログファイルは重要な情報を含むことがあるため、誤って削除しないよう特に注意してください。
# logrotateが設定されていない、または機能していない場合のみ手動で対処します。
# 30日以上前の .gz 以外のログファイルを検索
find /var/log -type f -name "*.log" -mtime +30 -print
# 確認後、実際に削除(例: /var/log/myapp/ ディレクトリのログを削除する場合)
# find /var/log/myapp/ -type f -name "*.log" -mtime +30 -delete


# 例3: Debian/Ubuntu系でのAPTパッケージキャッシュのクリア
# これにより、ダウンロードされたパッケージファイルが削除され、inodeが解放されます。
sudo apt clean


# 例4: CentOS/RHEL系でのYUM/DNFパッケージキャッシュのクリア
# これにより、ダウンロードされたパッケージファイルが削除され、inodeが解放されます。
sudo yum clean all
# または
sudo dnf clean all


# 例5: PHPセッションファイルが大量に溜まっている場合の削除 (パスは環境により異なります)
# find /var/lib/php/sessions -type f -mmin +240 -print
# 確認後、実際に削除
# find /var/lib/php/sessions -type f -mmin +240 -delete
# (例: 240分(=4時間)以上更新されていないセッションファイルを削除)

ファイルを削除したら、再度df -iを実行して、inodeの使用率が減少したことを確認してください。
これで一時的にシステムは回復し、新しいファイルが作成できるようになるはずです。

3. No space left on device (inodes) が発生する主要な原因(複数)

一時的な解決策を講じた後、根本的な原因を理解し、再発防止策を立てることが重要です。
このエラーが発生する主な原因は以下の通りです。

  • 大量の小さいファイルの生成:
    Webアプリケーションのセッションファイル、キャッシュファイル、メールスプール、非常に短い間隔で生成されるログファイル、あるいは小さなファイルを扱うシステム(例: 画像処理やIoTデータ処理)などで、数KB以下のファイルが極めて大量に生成されるケースが最も一般的です。
  • 削除されない一時ファイル:
    アプリケーションがクラッシュしたり、適切に終了しなかったりした場合、本来削除されるべき一時ファイルがディスク上に残り続けることがあります。これが長期間蓄積されると、inodeを圧迫します。
    また、システムの一時ディレクトリ(/tmp, /var/tmp)の自動クリーンアップ設定が不十分な場合も同様です。
  • 不適切なアプリケーションの動作:
    開発中のスクリプトやバグのあるアプリケーションが、意図せず無限ループでファイルを作成し続けたり、非常に短時間で大量のファイルを生成・削除・再生成を繰り返したりすることがあります。
  • ファイルシステム設計の不均衡:
    サーバー構築時のパーティション分割が、実際のアプリケーションのファイル生成パターンと合っていない場合があります。例えば、/(ルート)パーティションのinode数が少ないにもかかわらず、多くの小さなファイルを生成するアプリケーションがそのパーティション上にインストールされている、といったケースです。

4. Linuxで恒久的に再発を防ぐには

一度inode不足の問題を解決しても、根本的な対策を講じなければ再発する可能性があります。
以下の対策を検討し、恒久的な解決を目指しましょう。

対策1: 定期的なクリーンアップスクリプトの自動化

  • cronを利用した定期実行:
    上記「解決策1」で実行したfind ... -deleteのようなコマンドを、Linuxのcronジョブとして設定し、自動的に不要なファイルを削除するようにします。
    例えば、/tmpディレクトリの古いファイルを毎日削除する、特定のアプリケーションのキャッシュを毎週クリアするなどです。

    # /etc/cron.daily/clean-tmpfs
    #!/bin/bash
    find /tmp -type f -mtime +7 -delete
    # その他のクリーンアップコマンドも追加
    

    ※スクリプト作成後、実行権限を付与してください (sudo chmod +x /etc/cron.daily/clean-tmpfs)。

対策2: ログローテーションの設定見直し

  • logrotateの活用:
    /var/log以下のログファイルはlogrotateというツールによって自動的にローテーション・圧縮・削除されます。
    この設定(/etc/logrotate.conf/etc/logrotate.d/内のファイル)を見直し、アプリケーションのログファイルが適切にローテーションされ、古いログが削除されるように調整します。
    特に、カスタムアプリケーションのログがlogrotateの管理下にあるか確認し、必要であれば新しい設定ファイルを作成してください。

対策3: アプリケーションの設定見直し

  • キャッシュ・セッション管理の最適化:
    Webアプリケーションが生成するセッションファイルやキャッシュファイルの保存期間、保存場所、生成頻度などをアプリケーションレベルで調整します。
    例えば、PHPのセッションファイルをRedisなどのインメモリデータベースに保存するように変更したり、キャッシュの有効期限を短く設定したりすることで、ディスク上のファイル生成数を削減できます。
  • アプリケーションによる一時ファイルの管理:
    自身で開発・運用しているアプリケーションがある場合、そのアプリケーションが生成する一時ファイルが適切に削除されているか、処理後にクリーンアップルーチンが確実に実行されているかを確認します。

対策4: ファイルシステムの監視

  • 監視ツールの導入:
    Zabbix、Prometheus、Nagiosなどの監視ツールを導入し、inodeの使用率を常時監視します。
    inode使用率が危険なしきい値(例: 80%や90%)を超えた場合にアラートを発生させることで、問題が深刻化する前に早期に検出し、対処できるようになります。

対策5: ファイルシステムの再設計(長期的な検討)

  • パーティション分割の見直し:
    もし特定のパーティション(例: /)でinode枯渇が頻繁に発生し、根本的な原因が「パーティションの inode 数が少ない」ことにある場合は、長期的な解決策としてファイルシステムの再構築やパーティション分割の見直しを検討する必要があるかもしれません。
    特に、大量の小さなファイルを扱うことが分かっている場合は、そのデータを専用のパーティションに配置し、そのパーティション作成時にmkfs.ext4 -i <バイト/inode>オプションを使ってinode密度を調整することを検討できます(ただし、これはデータ移行を伴うため、十分な計画とバックアップが必要です)。
  • 別のファイルシステムの使用:
    非常に特殊なケースですが、ZFSやXFSなど、inodeの概念や管理方法が異なるファイルシステムを検討することも選択肢の一つとなりえます。

「No space left on device (inodes)」エラーは一見すると難解に思えますが、その原因と対処法を理解すれば決して恐れることはありません。
今回ご紹介した解決策と再発防止策を参考に、皆さんのLinuxシステムが安定稼働することを願っています。
落ち着いて、一つずつ確実に実行していきましょう!