ディスク容量に余裕があるのに No space left on device エラーになる
UNIXを使い始めて20年近くたちますが、初めてのエラーに遭遇しました。ディスク容量が十分あるのに、ファイルを作ろうとすると No space left on device エラーが発生するのです。
touch rarara
touch: cannot touch `rarara’: No space left on device
df
Filesystem 1K-blocks Used Available Use% Mounted on /dev/xvda1 8256952 6870384 1302704 85% / tmpfs 848476 0 848476 0% /dev/shm /dev/xvdf 8378368 4902356 3476012 59% /mnt </code>
これは、inode が足りなくなっていたためでした。
df -i
Filesystem Inodes IUsed IFree IUse% Mounted on /dev/xvda1 524288 524288 0 100% / tmpfs 212119 1 212118 1% /dev/shm /dev/xvdf 8388608 75096 8313512 1% /mnt </code>
inodeというのは、ファイルのオーナーやパーミッションなどのメタデータを保持する領域です。ここを使い尽くすと、新たなファイルが作れなくなります。通常のファイルシステムでは、inodeの数はディスクのサイズに応じて有限です。足りなくなったら、既存のファイルを削除するしかありません。
細かいファイルをたくさん作りすぎたのでしょうか。そんなに激しい使い方をしているサーバだという認識はないのですが。df -i の結果を見ると、52万ファイル作られているということですよね。
調べ回っていたら、Capistrano による Rails のデプロイメントが一役買っているであることがわかりました。Capistrano は、標準の設定では過去のバージョンを全部ディスクに残してくれます。デプロイする度に、1万個近くの inode を消費するのです。
古いデプロイメントを削除して inode領域を空け、ひとまず正常運用に戻すことができました。