Linuxディスク使用量の確認と整理|df・du・ログ削除の手順

Linuxディスク使用量の確認と整理|df・du・ログ削除の手順

※本記事にはプロモーション(広告・アフィリエイトリンク)を含みます。

Linux サーバーを運用していると、ある日突然ディスクがいっぱいになってサービスが止まる、という事態が起きる。df -h を実行したことがない人でも、この記事の手順を追えば、どこに容量が消えているかを特定し、安全に整理できるようになる。

df でパーティションの全体像を把握する

まず全ディスクの使用率を確認する。

df -h

-h オプションで GB・MB 単位の人間が読みやすい形式になる。出力例:

Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p2  468G  412G   33G  93% /
/dev/sda1       1.9T  800G  1.1T  42% /mnt/data
tmpfs           7.7G  1.2G  6.5G  16% /dev/shm

Use% が 90% を超えていたら整理が必要かを判断する目安にできる(あくまで目安で、絶対的な閾値ではありません)。どのパーティションが逼迫しているかをこの時点で特定しておく。

特定のパスだけ確認したい場合は引数にパスを渡す:

df -h /home
df -h /var

du で容量を食っているディレクトリを特定する

df でパーティションが特定できたら、du でどのディレクトリが重いかを掘り下げる。

トップレベルから見ていくのが基本:

du -sh /home/*
du -sh /var/*

-s は合計のみ表示、-h は human-readable。ディレクトリが多い場合は sort と組み合わせる:

du -ah /var | sort -rh | head -20
  • -a:ファイルも含めすべて表示
  • sort -rh:サイズの降順でソート(-h は人間が読みやすい単位でソート)
  • head -20:上位 20 件のみ表示

/var/log が数 GB を超えていることが多い。次のセクションでその整理方法を書く。

ncdu を使うとインタラクティブに確認できる

ncdu(NCurses Disk Usage)はカーソルキーで掘り下げられるツールで、du | sort よりも直感的に使える。

# Debian/Ubuntu 系
sudo apt install ncdu

# ルートから確認する場合
sudo ncdu /

d キーでそのディレクトリを削除できるが、root 権限で動かしている場合は誤削除に注意する。削除前に必ず内容を確認すること。

ログを整理する

systemd のジャーナルログを削減する

systemd 環境では journalctl でジャーナルのサイズを管理できる。

# 現在のジャーナルサイズを確認
journalctl --disk-usage

# 500MB を超えた古いものを削除
sudo journalctl --vacuum-size=500M

# 2 週間より古いものを削除
sudo journalctl --vacuum-time=2weeks

--vacuum-size と --vacuum-time は同時に指定できる。両方指定した場合、どちらか一方の条件を満たしたものから削除される。

永続的に上限を設定するには /etc/systemd/journald.conf に書く:

[Journal]
SystemMaxUse=500M

変更後は以下のコマンドで反映する:

sudo systemctl restart systemd-journald

/var/log の古いログファイルを削除する

logrotate が正常に動いていれば自動で圧縮・削除されるが、手動でも確認できる。

# 圧縮済みの古いログを確認
ls -lh /var/log/*.gz | sort -k5 -rh | head -10

30 日以上前の .gz ファイルを削除する例:

# まず対象を確認(-print で一覧表示)
sudo find /var/log -name "*.gz" -mtime +30 -print

# 問題なければ削除
sudo find /var/log -name "*.gz" -mtime +30 -delete

-delete の前に必ず -print で対象を確認するのが安全。

パッケージとキャッシュを整理する

apt(Debian/Ubuntu 系)

# 不要な依存パッケージを削除
sudo apt autoremove

# ダウンロード済みのパッケージキャッシュを削除
sudo apt clean

# 古いバージョンのみ削除(最新は残す)
sudo apt autoclean

apt clean は /var/cache/apt/archives/ を空にする。パッケージの再インストールが必要になった際はネットから再取得されるため、削除して問題ない。

npm キャッシュ

Node.js を使っている環境では npm のキャッシュが膨らむことがある。

# キャッシュのサイズを確認
du -sh ~/.npm

# キャッシュを削除
npm cache clean --force

Node アプリを systemd で常駐させてサーバーとして運用している場合、複数プロジェクトの node_modules が並存していることも多い。稼働していないプロジェクトの node_modules は du -sh でサイズを確認してから削除するとよい。

pip キャッシュ

# キャッシュのパスを確認
pip cache dir

# キャッシュを削除
pip cache purge

Stable Diffusion などの Python 環境を複数持っている場合、~/.cache/pip が GB 単位になることがある(環境によって異なります)。

Docker を使っている場合

# 現在の使用量を確認
docker system df

# 停止中コンテナ・未使用イメージ・キャッシュを一括削除
docker system prune

# ボリュームも含めて削除(データが消えるため慎重に)
docker system prune --volumes

prune の前に必ず docker system df で何が対象になるかを確認してから実行する。

大きなファイルを別ディスクへ移してシンボリックリンクで運用する

ログやキャッシュを整理しても容量が足りない場合、大きなデータを別のディスクへ移して、元のパスにシンボリックリンクを張る方法がある。スクリプトやアプリのパスを変えずに済むのがメリット。

以下は /home/user/models を /mnt/data/models へ移す例:

手順 1:rsync で転送する

sudo rsync -av /home/user/models/ /mnt/data/models/

-a はパーミッション・タイムスタンプを保持、-v は進捗を表示。

手順 2:ファイル数とバイト数を照合する

# 元のディレクトリ
find /home/user/models -type f | wc -l
du -sb /home/user/models

# コピー先
find /mnt/data/models -type f | wc -l
du -sb /mnt/data/models

ファイル数とバイト数が一致したら次へ進む。

手順 3:rsync --checksum で差分ゼロを確認する

rsync -rn --checksum --itemize-changes /home/user/models/ /mnt/data/models/

出力が空(差分ゼロ)であることを確認する。出力が返ってきた場合は差分があるため削除しない。

手順 4:元を削除してシンボリックリンクを張る

rm -rf /home/user/models
ln -s /mnt/data/models /home/user/models

シンボリックリンクを張ることで、既存のスクリプトやアプリがパスを変えずに動き続ける。

まとめ

ディスク整理の基本的な流れを表にまとめる。

ステップ コマンド 目的
1. 全体確認 df -h 逼迫パーティションを特定
2. 詳細確認 du -sh /var/* 重いディレクトリを特定
3. ログ削除 journalctl --vacuum-size=500M ジャーナルを削減
4. キャッシュ削除 apt autoremove && apt clean パッケージキャッシュを削除
5. データ移動 rsync → 照合 → symlink 大ファイルを別ディスクへ

まずは df -h を実行して、Use% が一番高いパーティションを特定するところから始めてほしい。そこが特定できれば、この記事の手順でそのまま掘り下げていける。

この記事で触れたもの

よくある質問

df と du の違いは何ですか?

`df` はパーティション(マウントポイント)単位の空き容量を確認するコマンドで、`du` はディレクトリやファイル単位の使用量を確認するコマンドです。まず `df` で逼迫しているパーティションを特定し、次に `du` で原因のディレクトリを掘り下げる、という順で使います。

journalctl --vacuum-size と --vacuum-time は同時に使えますか?

同時に指定できます。両方指定した場合、どちらか一方の条件を満たしたエントリから削除されます。たとえば `--vacuum-size=500M --vacuum-time=2weeks` と書くと、サイズまたは日数のどちらかの上限に引っかかったものが削除対象になります。

rsync で転送後、元のファイルを削除する前にやるべき確認は?

①`find ... | wc -l` でファイル数を照合、②`du -sb` でバイト数を照合、③`rsync -rn --checksum --itemize-changes` で差分ゼロを確認、の 3 ステップを踏んでから `rm -rf` を実行します。差分ゼロが確認できない場合は削除しないでください。

apt clean と apt autoremove の違いは何ですか?

`apt clean` は `/var/cache/apt/archives/` に溜まったダウンロード済みパッケージファイルを削除します。`apt autoremove` は、他のパッケージが依存しなくなった不要な依存パッケージをアンインストールします。どちらも安全に実行できますが、削除前に何が対象になるか確認する習慣をつけておくと安心です。