MENU

ディスク使用量の多いディレクトリを素早く特定して空き容量を確保する方法

ディスク使用率が90%を超えた深夜に警報が鳴り響き、ログが止まって監視が沈黙する——そんな事態を経験した運用現場は少なくありません。犯人ディレクトリを特定するのに1時間かかったという話も珍しくありませんが、正しい手順を知っていれば5分以内に片付きます。

目次

まずファイルシステム全体の状況を把握する

いきなりディレクトリを掘り始める前に、dfでどのパーティションが逼迫しているかを確認します。見当違いのパーティションを延々と調べていた、という失敗を防ぐための最初の一手です。

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   47G  3.0G  94% /
/dev/sda2       100G   20G   80G  20% /data
tmpfs           2.0G  1.2M  2.0G   1% /tmp

Use%が高いファイルシステムを確認します。上記の例なら/が94%と逼迫しています。/data/tmpなど別パーティションが原因であれば、以降の手順でその直下から掘り下げます。パーティションが特定できたら次のステップに進みます。

使用量上位のディレクトリを一発で絞り込む

対象パーティションが決まったら、以下のコマンドでトップレベルのディレクトリを使用量の多い順に並べます。/が対象の場合の例です。

sudo du -h --max-depth=1 / 2>/dev/null | sort -rh | head -20
47G    /
18G    /var
12G    /usr
 8G    /home
 5G    /opt

この例では/varが18GBと最大です。次はここを掘り下げます。2>/dev/nullはアクセス権エラーのメッセージを捨てるためのもので、sudoを付けて実行すると集計精度が上がります。

本番サーバーで実行する場合の注意:du /はルートから再帰的に全ファイルを走査するため、ファイル数が多いシステムでは数分かかることがあります。I/Oへの影響を抑えたい場合はionice -c3を前置きして優先度を下げてから実行します。

sudo ionice -c3 du -h --max-depth=1 / 2>/dev/null | sort -rh | head -20

階層を指定してさらに掘り下げる

ボリュームの大きいディレクトリが判明したら、そのディレクトリ内で同じコマンドを繰り返します。/varが怪しい場合の例です。

sudo du -h --max-depth=2 /var 2>/dev/null | sort -rh | head -20

--max-depth=2にすると1階層分多く見えるため、/var/log/nginxのような深い場所もまとめて比較できます。あとは同じコマンドを対象を絞りながら繰り返すだけで、原因ファイルのある場所まで数分で辿り着けます。

頻出の肥大化ポイントと素早い確認方法

実務上、以下の3箇所が原因になるケースが大半を占めます。それぞれ専用のコマンドで素早く確認できます。

journaldのログ肥大化

systemd環境では/var/log/journal/配下にバイナリログが蓄積します。以下で現在の使用量を確認できます。

journalctl --disk-usage

一定量まで削減したい場合は--vacuum-sizeを使います。以下は500MB以下に切り詰める例です。実行前にバックアップが必要なログがないか確認してください。

sudo journalctl --vacuum-size=500M

恒久的な上限を設定するには/etc/systemd/journald.confSystemMaxUse=を編集してsudo systemctl restart systemd-journaldを実行します。

古いログファイルの蓄積

logrotateが設定されていても、ローテーションされずに放置された古いファイルが残っていることがあります。100MB超のログファイルを探すには次のコマンドが便利です。

sudo find /var/log -type f -size +100M -ls 2>/dev/null

コアダンプファイルの蓄積

プロセスがクラッシュした際に生成されるコアダンプが溜まっているケースもよくあります。systemdが管理する環境では/var/lib/systemd/coredump/を確認します。

# コアダンプの一覧と容量確認
coredumpctl list
sudo du -sh /var/lib/systemd/coredump/

# 不要なコアダンプをまとめて削除
sudo coredumpctl clean

対話的なツールで視覚的に確認する

コマンド操作に慣れた担当者でも、ディレクトリ構造が複雑な場合は対話的なツールを使うほうが作業が速くなります。ncdu(NCurses Disk Usage)はターミナル上で階層をナビゲートしながら使用量を確認できるツールで、大半のディストリビューションでパッケージが用意されています。

# Debian / Ubuntu
sudo apt install ncdu

# RHEL / AlmaLinux / Rocky Linux(EPELが必要)
sudo dnf install epel-release && sudo dnf install ncdu

インストール後、調べたいパスを引数に渡して起動します。

sudo ncdu /

起動するとカーソルキーで階層を移動しながら、大きいディレクトリを上から順に確認できます。dキーでその場でファイルを削除する機能もありますが、誤削除には十分注意してください。スキャンに時間がかかる場合は対象ディレクトリに絞って起動するか、--excludeで除外パスを指定します。

マウントポイントをまたぐ落とし穴

duはデフォルトでマウントポイントを越えて再帰します。/proc/sys、NFSマウントなどを巻き込むと出力が膨大になったり、コマンドがフリーズに近い状態になることがあります。--one-file-system(短縮形は-x)を付けると、同一ファイルシステム内だけを対象にできます。

sudo du -h --max-depth=1 -x / 2>/dev/null | sort -rh | head -20

NFS・CIFS・tmpfsなど別ファイルシステムのマウントポイントが/配下にある環境では、この-xオプションを常に付けることを習慣にすると無用なトラブルを避けられます。ただし、-xを付けると他パーティションは集計対象外になるため、冒頭のdf -hで全体像を把握してから個別に掘り下げる手順が前提になります。

<PR>この記事に関連するおすすめ書籍

[試して理解]Linuxのしくみ 増補改訂版

プロセス・ファイルシステム・権限などLinuxの内部構造を図解で理解できる一冊。運用判断の勘所が腑に落ちます。

「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。

ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。

>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)

※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次