メインコンテンツへスキップ

ディスク逼迫の対処について

🌱 はじめに

本記事では、BookStackを使っているUbuntuサーバーで、ディスク容量が急に逼迫した際の調査・原因究明・対処までの流れをまとめます。dfdu の差異、lsof を用いた調査方法、そして「削除済みだが解放されないファイル」の扱いについて実例とともに解説します。


📏 ディスク逼迫に気づいたきっかけ

BookStackを使っているときに、df コマンドで / の使用量が 15G / 19G (78%) と表示されていました。しかし、Webアプリやデータベースの保存ディレクトリを調べても数百MB程度しか使っていませんでした。この不一致から、目に見えない部分で容量を使っている可能性に気づきました。


🔍 dfdu の違い

  • df -h / はファイルシステム全体の使用状況を表示します。

  • du -h --max-depth=1 / はファイル・ディレクトリごとのサイズ合計を表示します。

削除されたファイルでも、開いているプロセスがあると df では容量を消費し続け、du には表示されなくなります。


🕵️ 隠れた容量の調査:lsof の活用

以下のコマンドで、「削除されたのに開かれているファイル」を特定できます:

sudo lsof | grep deleted

この出力により、MariaDBやApacheが /tmp に作成し、削除されたファイルを開いたまま保持していることが分かりました。

原因を突き止める鍵は lsof の活用でした!


🛠 実際の解決方法

こうした「削除されたが開いたままのファイル」を完全に消すには、保持しているプロセスを終了させる必要があります。方法は以下の通りです:

  • Apache と MariaDB を個別に再起動:

sudo systemctl restart apache2
sudo systemctl restart mariadb
  • またはサーバーごと再起動:

sudo reboot

🎉 解決後の状況確認

再起動後に df -h を再度確認すると、使用量は以下のように改善されていました:

Filesystem      Size  Used Avail Use% Mounted on
/dev/root        20G  4.2G   16G  22% /

見えなかった約10GB以上の使用領域が無事解放され、空き容量が大幅に回復しました!


🤔 再起動後にも deleted が出る理由

再起動直後に lsof | grep deleted を実行すると、再び deleted 表示が出ることがあります。これは、ApacheやPHPが起動時に一時ファイルを作成してすぐ削除する、という正常な動作によるものです。

サイズが 0B の deleted ファイルは無視して問題ありません。問題なのは、巨大なファイルが deleted のまま開かれっぱなしになっているケースです。


🛡 再発防止のためのポイント

  • 定期的に df -hlsof | grep deleted を確認

  • /tmp の使用状況を意識して監視

  • 長期間サーバを稼働し続けるなら、月に一度程度のサービス再起動がおすすめ


📚 おわりに

Linuxサーバーでは、削除したファイルがすぐには解放されないという仕様により、見えないディスク圧迫が発生することがあります。今回のように dfdu の差を手がかりにし、lsof で原因を調査するという流れを理解しておけば、同様のトラブルにも素早く対応できます。