ESC

Start typing to search across invoices, services, domains, tickets, and more...

Search... Ctrl+K
Linuxサーバー

Linux のディスク容量不足を解消する方法:使用量の確認・大きなファイルの検索・クリーンアップ

7 ステップ 8 分で読めます 1598 回閲覧 52
目次

サイトが表示されない、データベースに書き込めない、「No space left on device」と表示される――その多くはディスクの空き容量不足が原因です。本記事では Linux でディスク容量を確認・解放する実用的な方法として、df -h と du による使用状況の把握、ncdu での対話的な分析、find による大きなファイルの検索、システムログ・パッケージキャッシュ・Docker の安全な削除方法を紹介します。Debian/Ubuntu と CentOS/Rocky/AlmaLinux に対応し、root で実行します。

ステップ1:df -h でディスク使用量を確認する

df -hT で各ファイルシステムの容量・使用量・使用率を表示し、100% に近いマウントポイントを特定します。あわせて df -i で inode も確認しましょう。キャッシュやセッションなど小さなファイルが大量にあると、容量に余裕があっても inode が枯渇して「ディスクがいっぱい」と判定されます。

df -hT          # space usage per filesystem
df -i           # inode usage (100% also means "No space left on device")

ステップ2:du で容量を使っているディレクトリを特定する

ルート直下のディレクトリごとのサイズを集計して並べ替え、大きいものから順に掘り下げていきます。-x を付けると現在のファイルシステムのみを対象にし、マウントされたデータディスクを含めません。/var/log、/var/lib/docker、/var/lib/mysql、Web サイトやバックアップのディレクトリが大きくなりがちです。

# Size of each top-level directory on the root filesystem, largest last
du -xh --max-depth=1 / 2>/dev/null | sort -h

# Drill down, e.g. into /var
du -xh --max-depth=1 /var 2>/dev/null | sort -h

ステップ3:ncdu で対話的にディスクを分析する

ncdu はターミナルで使えるディスク分析ツールです。スキャン後は矢印キーでディレクトリを移動し、d キーで削除でき、du を何度も実行するよりずっと効率的です。

# Debian / Ubuntu
apt install -y ncdu

# CentOS / Rocky / AlmaLinux (ncdu is in EPEL)
dnf install -y epel-release && dnf install -y ncdu

ncdu -x /

ステップ4:find で Linux の大きなファイルを探す

500 MB を超えるファイルを一覧表示すると、忘れていたバックアップ、データベースのダンプ、肥大化したログなどがすぐに見つかります。削除前に用途を確認し、判断がつかないものは別ディスクへ移動しておくと安全です。

# Files larger than 500 MB on the root filesystem
find / -xdev -type f -size +500M -exec ls -lh {} \; 2>/dev/null | sort -k5 -h

ステップ5:システムログとパッケージキャッシュを削除する

systemd のジャーナルは長期間で数 GB になることがあるため、journalctl でサイズや期間を指定して削減します。書き込み中の大きなログは rm せず truncate で空にしてください。rm すると容量が解放されません。パッケージキャッシュは安全に削除できます。

journalctl --disk-usage
journalctl --vacuum-size=200M
journalctl --vacuum-time=7d

# Empty a large log file that a running program still writes to (do not rm it)
truncate -s 0 /var/log/nginx/access.log

# Package manager caches
apt clean                 # Debian / Ubuntu
dnf clean all             # CentOS / Rocky / AlmaLinux

ジャーナルの再肥大化を防ぐには、上限を設定します。

# Permanently cap the journal size
mkdir -p /etc/systemd/journald.conf.d
printf '[Journal]\nSystemMaxUse=500M\n' > /etc/systemd/journald.conf.d/size.conf
systemctl restart systemd-journald

ステップ6:Docker のディスク容量を整理する

Docker を使うサーバーでは、停止したコンテナや未使用イメージ、ビルドキャッシュが /var/lib/docker に溜まり続けます。docker system df で使用量を確認し、不要なものを削除します。

docker system df
docker container prune -f
docker image prune -a -f
docker builder prune -f
# Removes everything unused, including volumes - check first!
docker system prune -a --volumes
--volumes を付けると、コンテナで使われていないボリュームがすべて削除され、データベースのデータが含まれる場合もあります。不要であることを必ず確認してから実行してください。

ステップ7:削除済みなのに解放されないファイルを処理する

大きなファイルを削除しても df の値が変わらない場合、プロセスがまだそのファイルを開いています。lsof で該当プロセスを見つけ、サービスを再起動すると容量が解放されます。

# Deleted files still held open by a process
lsof +L1 2>/dev/null | head -n 20
# Restart the process that holds them, e.g.
systemctl restart nginx

よくある質問

du の合計と df の使用量が一致しません。

主な原因は 2 つです。削除済みでもプロセスが開いているファイル(ステップ7 参照)か、後からマウントしたディスクの下にファイルが隠れているケースです。前者はプロセスの再起動、後者はアンマウントして確認します。

/var/log のどのログを削除してよいですか?

日付付きや .gz の古いローテート済みログは基本的に削除して構いません。書き込み中のログは truncate で空にします。根本対策として logrotate で定期的なローテーションと圧縮を設定しましょう。

整理しても容量が足りません。

Web サイトやデータベース、バックアップをデータディスクへ移すか、ディスクをアップグレードして LVM/growpart の手順でパーティションを拡張してください。

上記の手順で解決しない場合は、サポートチケットを送信して IMIDC の 24 時間 365 日テクニカルサポートへお問い合わせください。サーバー IP、OS、実行したコマンド、エラー画面のスクリーンショットを添えていただくと、より迅速に対応できます。

この回答はお役に立ちましたか?

関連チュートリアル