df で空き容量があるのに書き込みエラーになる原因(inode不足など)

  • URLをコピーしました!

Linux でファイルを書き込もうとした際に、

No space left on device

というエラーが出ることがあります。

しかし df -h を実行すると、空き容量がまだ十分にあるように見えることがあります。
「空きがあるのになぜ書き込めないのか?」と戸惑うケースです。

この記事では、この現象の原因と確認方法、解決策を解説します。

目次

主な原因

1. inode の枯渇

Linux のファイルシステム(ext4 など)は「ファイルの中身」を保存する領域とは別に、ファイルの管理情報(inode) を保存する領域を持っています。

  • ファイル数が非常に多い(小さなファイルを大量に作った場合など)
  • inode 数の上限に達すると、空き容量があっても新しいファイルを作れない

この場合、df -h では空き容量が見えるのに、実際には「No space left on device」となるのです。

2. 特定ディレクトリの容量制限(クォータ)

システムによってはユーザーやディレクトリごとに ディスククォータ が設定されており、
空き容量があってもその範囲を超えると書き込みできなくなります。

3. tmpfs などメモリベースのファイルシステム

/tmp/dev/shmtmpfs(メモリを利用するファイルシステム)の場合、
ディスク容量には余裕があっても、メモリ上の制限に引っかかって書き込めなくなることがあります。

確認方法

inode の使用状況を確認する

df -i
  • IUse% が 100% なら inode が枯渇しています。
  • 特にログファイルやキャッシュで小さなファイルが大量に作られたときに発生します。

クォータの確認

クォータが有効になっている場合は以下のコマンドで確認できます。

quota -v

または管理者が設定している場合、対象ディレクトリのクォータ状況を repquota で確認します。

tmpfs の容量確認

df -h /tmp

mount | grep tmpfs

で tmpfs のサイズを確認できます。

解決方法

1. inode 不足の場合

  • 不要な小さいファイルを削除する find /path/to/dir -type f -size 0 -delete で空ファイルを削除するのも効果的です。
  • ログローテーション設定を見直し、不要なファイルが溜まらないようにする

2. クォータ制限の場合

  • 管理者にクォータの拡張を依頼する
  • 不要なファイルを削除してクォータの範囲内に収める

3. tmpfs の場合

  • /etc/fstab の設定を変更して tmpfs のサイズを増やす
  • 一時ファイルを /var/tmp(通常ディスク領域)に書き込むよう変更する

まとめ

df -h で空きがあるのに「書き込めない」場合は、inode 不足が最も多い原因です。

  • df -i で inode の使用率を確認する
  • クォータや tmpfs など特殊な制限も考慮する
  • 不要ファイル削除や設定変更で対応する

こうした切り分けを覚えておくと、エラーの原因を素早く特定できます。


💡 補足:
システム運用では、容量監視とあわせて inode 使用率の監視も設定しておくと、トラブルを未然に防げます。

目次