ディスクの空き容量がない(No space left on device)

ファイルの保存やパッケージのインストールをしようとしたときに No space left on device と表示されて止まってしまう——という状況を、実際のコマンドの流れで切り分けていきます。

注意: この記事で紹介する rm などの削除コマンドは元に戻せません。本当に不要なファイルかを確認してから実行してください。判断に迷う場合は、まずファイルを別の場所に退避してから削除するのが安全です。

どんな症状か

新しいファイルを保存しようとした、パッケージをインストールしようとした、ログが急に追記されなくなった、といった場面で No space left on device というエラーに遭遇したときの対応です。似た状況で Disk quota exceeded と表示される場合は、ディスク自体の空き容量ではなく、ユーザーごとの割り当て(クォータ)超過が原因のことがあります。

原因を切り分ける

ステップ1:どのパーティションが埋まっているか確認する

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        20G   20G     0 100% /
tmpfs           2.0G     0  2.0G   0% /dev/shm

Use% が100%に近いパーティションが原因です。上の例では /(ルート)が満杯になっています。マウントポイントが複数ある場合は、書き込めなくなったファイルが実際にどのパーティションに属しているかも合わせて確認します。

ステップ2:inode(ファイル管理領域)が枯渇していないか確認する

$ df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda1      1310720 1310720      0  100% /

df -h では空きがあるように見えるのに書き込めない場合、小さなファイルを大量に作ってinode(ファイルの管理情報の枠)を使い切っているケースがあります。IUse% が100%に近い場合はこちらが原因です。

ステップ3:どのディレクトリが容量を食っているか特定する

$ du -sh /var/* 2>/dev/null | sort -rh | head -5
2.1G    /var/log
340M    /var/cache
120M    /var/lib
 45M    /var/tmp
 12M    /var/spool

du -sh で各ディレクトリの合計サイズを確認し、sort -rh で大きい順に並べ替えると、原因のディレクトリを素早く特定できます。上の例では /var/log(ログ)が突出して大きいことが分かります。

ステップ4:削除したのに容量が戻らない場合を疑う

$ lsof +L1 2>/dev/null | head -5

ファイルを削除しても、そのファイルを開いたままのプロセスがあると、ディスク上の領域はすぐには解放されません。lsof +L1 は「削除済みだがどこかのプロセスに掴まれたまま」のファイルを一覧表示します。該当プロセスを再起動すると領域が解放されます。

解決方法

原因が分かったら、状況に応じて次のような対処を行います。

  • ログの肥大化が原因の場合: journalctl --vacuum-size=200M で journal ログを縮小、または logrotate の設定(保持期間・圧縮)を見直します。
  • パッケージキャッシュが原因の場合: apt clean(Debian系)や dnf clean all(RHEL系)でキャッシュを削除します。
  • 不要なファイルが原因の場合: 内容を確認したうえで削除します。判断に迷うファイルは、削除前に別ディスクへ退避しておくと安心です。
  • 削除しても容量が戻らない場合: 該当ファイルを掴んでいるプロセスを特定し、再起動して領域を解放します。
関連する章: ログの仕組みは中級「システムログと時刻管理」、ファイル操作の基本は初級「ファイル操作」で扱っています。練習用ターミナルの運用保守フェーズの課題でも、似た調査の流れを試せます。