- Linuxでのiノード枯渇
初めに...
WebサーバをUbuntuで運用しており、apt-getをcronで動かしていたのですが、apt-get upgradeを実行時にある日「ディスクフルで書き込めない」と言うエラーで失敗するようになりました。しばらく気付かずにいたたせいか、パッケージの依存関係も壊れてしまい、dpkg --configure -aを実行するよう言われても、「ディスクフルで書き込めない」と言われて失敗する状況に陥ってしまいました。ただ、ディスク容量を調べると、空き領域は十分にありました。
原因は?
Webを調べてた結果、
iノードが枯渇していることが原因らしいことが分かりました。Linuxのファイルシステムでは1つのファイルに1つのiノードというものを紐づけて管理しており、iノードの数はext3ファイルシステムの場合、ファイルシステム作成時(要するにフォーマットする時)に決めた後には変更できないそうです。そのため、想定以上に小さなファイルを大量に作成するとiノードが枯渇することがあります。
iノードの個数は「df -i」で調べることできます。うちのWebサーバでdf -iを実行したところ、iノードが100%使用状態になっていることが確認できました。
さて、iノードが枯渇した原因は、「想定以上に小さなファイルを大量に作成」がヒントになり、カーネルのヘッダファイルがであることが分かりました。自動でupgradeするようにcronを動かしていたため、古いカーネルが削除されないまま20数個残っていました。このカーネルとヘッダファイルをapt-get autoremoveで削除した結果、iノードの使用率は9%となりました。
具体的な解決手順
今回のケースでは、「apt-get remove kernel-headers-〜」でカーネルヘッダを削除しようとしても、パッケージの依存関係が壊れているため実行できません。依存関係の修復は「dpkg --configure -a」ですが、iノードが枯渇しているため、途中でエラーになってしまいます。そのため、数個のカーネルヘッダを別のドライブに移動し、移動しなかったカーネルヘッダを「apt-get remove kernel-headers-〜」で削除することになります。具体的には次の手順を取りました。
- 5つのカーネルヘッダを/usr/srcから別のドライブに移動
- 移動しなかったカーネルの中から、5つのカーネルとそのヘッダを「apt-get remove カーネル(或いはヘッダ)」で削除。
- 最初に移動したカーネルヘッダを/usr/srcに戻す。
- 「apt-get autoremove」で残りのカーネルやヘッダを一気に削除
FAQページ先頭へ戻る