Start typing to search across invoices, services, domains, tickets, and more...
サイトが表示されない、データベースに書き込めない、「No space left on device」と表示される――その多くはディスクの空き容量不足が原因です。本記事では Linux でディスク容量を確認・解放する実用的な方法として、df -h と du による使用状況の把握、ncdu での対話的な分析、find による大きなファイルの検索、システムログ・パッケージキャッシュ・Docker の安全な削除方法を紹介します。Debian/Ubuntu と CentOS/Rocky/AlmaLinux に対応し、root で実行します。
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")
ルート直下のディレクトリごとのサイズを集計して並べ替え、大きいものから順に掘り下げていきます。-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
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 /
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
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
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 を付けると、コンテナで使われていないボリュームがすべて削除され、データベースのデータが含まれる場合もあります。不要であることを必ず確認してから実行してください。大きなファイルを削除しても 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
主な原因は 2 つです。削除済みでもプロセスが開いているファイル(ステップ7 参照)か、後からマウントしたディスクの下にファイルが隠れているケースです。前者はプロセスの再起動、後者はアンマウントして確認します。
日付付きや .gz の古いローテート済みログは基本的に削除して構いません。書き込み中のログは truncate で空にします。根本対策として logrotate で定期的なローテーションと圧縮を設定しましょう。
Web サイトやデータベース、バックアップをデータディスクへ移すか、ディスクをアップグレードして LVM/growpart の手順でパーティションを拡張してください。
上記の手順で解決しない場合は、サポートチケットを送信して IMIDC の 24 時間 365 日テクニカルサポートへお問い合わせください。サーバー IP、OS、実行したコマンド、エラー画面のスクリーンショットを添えていただくと、より迅速に対応できます。