Linux のディスク容量不足:VPS で空き容量を調べて解放する方法

11 分で読めます 7 回閲覧 0
目次

「No space left on device」が出ると、サーバー上のほぼすべてが動かなくなります。データベースは書き込めず、Web サイトはエラーを返し、パッケージ更新は失敗し、ログインすら不安定になることがあります。このガイドでは Linux のディスク容量不足を段階的に調べる方法を説明します。ブロックと inode のどちらが尽きたかを確認し、du と ncdu で原因を特定したうえで、systemd ジャーナル、apt/dnf のキャッシュ、Docker、巨大なログ、削除済みなのに開かれたままのファイルからディスク容量を解放します。コマンドは Debian、Ubuntu、CentOS 7、Rocky Linux / AlmaLinux 8・9 に対応しています。

ステップ1:df -hT と df -i でディスク使用量を確認

まずどのファイルシステムがいっぱいかを確認します。容量に余裕があっても inode が尽きれば「満杯」になります。アプリケーションが小さなファイルを大量に作ると起こります。

df -hT          # space per file system, with type
df -i           # inodes: IUse% at 100% also means "No space left on device"

Use% が 100% ならステップ2 へ、IUse% だけが高い場合はステップ9 へ進んでください。

ステップ2:du で大きなディレクトリとファイルを探す

du は各ディレクトリの合計サイズを表示します。-x を付けると同じファイルシステム内だけを数えるため、マウントされたディスクや仮想ファイルシステムに惑わされません。1 階層ずつ掘り下げていきます。

# Largest top-level directories on the root file system
du -xh --max-depth=1 / 2>/dev/null | sort -h | tail -n 15
# Drill down into the biggest one, for example /var
du -xh --max-depth=1 /var 2>/dev/null | sort -h | tail -n 15

# Single files larger than 200 MB
find / -xdev -type f -size +200M -exec ls -lh {} + 2>/dev/null | sort -k5 -h

ステップ3:ncdu で対話的にディスク使用量を確認

ncdu は一度スキャンすれば矢印キーでツリーを移動でき、du を繰り返すよりずっと速く調べられます。ディスクが完全に満杯でインストールできない場合は、先にステップ4 か 5 で少し空けてください。

# Debian / Ubuntu
apt install -y ncdu
# Rocky Linux / AlmaLinux / CentOS (from EPEL)
dnf install -y epel-release && dnf install -y ncdu

ncdu -x /       # arrows to browse, d = delete, q = quit

ステップ4:systemd ジャーナルを縮小(journalctl --vacuum)

永続ジャーナルが有効なシステムでは、/var/log/journal が数 GB に膨らむことがあります。vacuum で古いアーカイブを安全に削除し、上限を設定して再発を防ぎます。

journalctl --disk-usage
journalctl --vacuum-size=200M      # or: journalctl --vacuum-time=14d

# Cap the journal permanently
mkdir -p /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/size.conf <<'EOF'
[Journal]
SystemMaxUse=200M
EOF
systemctl restart systemd-journald

ステップ5:apt / dnf のキャッシュと古いカーネルを削除

ダウンロード済みパッケージと古いカーネルは、特に小容量のクラウドディスクですぐ効果が出る掃除対象です。

# Debian / Ubuntu
apt clean
apt autoremove --purge

# Rocky Linux / AlmaLinux 8, 9
dnf clean all
dnf remove $(dnf repoquery --installonly --latest-limit=-2 -q)   # keep 2 newest kernels

# CentOS 7
yum clean all
yum install -y yum-utils && package-cleanup --oldkernels --count=2

ステップ6:巨大なログファイルを安全に処理

/var/log や Web サイトのディレクトリにあるアプリケーションログは、ディスク満杯のよくある原因です。サービスが書き込み中のログを rm しても容量は戻りません(ステップ8 参照)。truncate で空にし、ローテーション設定を見直しましょう。

# Log files larger than 100 MB
find /var/log -type f -size +100M -exec ls -lh {} +

# Empty a live log WITHOUT deleting it (the service keeps writing)
truncate -s 0 /var/log/nginx/access.log

# Remove compressed rotated logs older than 14 days
find /var/log -type f -name '*.gz' -mtime +14 -delete

# Dry-run logrotate to see why a log is not rotating
logrotate -d /etc/logrotate.conf

ステップ7:Docker の容量を回収(docker system prune)

古いイメージや停止したコンテナ、ビルドキャッシュは /var/lib/docker にすぐ溜まります。確認してから削除します。

docker system df                   # what Docker is using
docker system prune                 # stopped containers, unused networks,
                                    # dangling images and build cache
docker system prune -a              # also ALL images not used by a container

# Container logs live here and can grow without limit
du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail
確信がない限り --volumes は付けないでください。未使用の Docker ボリュームが完全に削除され、その中にデータベースのデータが入っていることがよくあります。

コンテナのログで再びディスクが埋まらないよう、サイズ上限を設定します。

# /etc/docker/daemon.json - limit future container logs
{
  "log-driver": "json-file",
  "log-opts": { "max-size": "50m", "max-file": "3" }
}
# then: systemctl restart docker  (applies to newly created containers)

ステップ8:lsof +L1 で削除済みなのに開かれているファイルを探す

df では満杯なのに du で容量が見つからない場合、多くは削除されたファイルをプロセスがまだ開いています。そのプロセスがファイルを閉じるまで容量は戻りません。

# Debian / Ubuntu: apt install -y lsof   |   Rocky / AlmaLinux: dnf install -y lsof
lsof +L1
# COMMAND  PID  ...  SIZE/OFF  NLINK  NAME
# php-fpm  1234 ...  4.2G      0      /var/log/app/debug.log (deleted)

# Fix 1: restart the service holding the file
systemctl restart php-fpm
# Fix 2: truncate it through /proc (PID 1234, file descriptor 7 from "ls -l /proc/1234/fd")
: > /proc/1234/fd/7

ステップ9:inode 枯渇による「No space left」を解消

df -i が 100% のときは、小さなファイルが大量にあるディレクトリを探します。PHP のセッションフォルダ、メールキュー、キャッシュ、一時アップロードなどが典型です。

# Directories that contain the most files
find / -xdev -type f 2>/dev/null | cut -d/ -f2-4 | sort | uniq -c | sort -n | tail -n 10

原因のディレクトリを掃除し、アプリケーション側で古いファイルが自動的に削除されるよう設定してください。

よくある質問

df と du の数字が違うのはなぜですか?

多くは削除済みで開かれたままのファイルが原因です(ステップ8)。マウントポイントの下に隠れたファイルや、ext4 が root 用に予約している領域(通常 5%)も差の原因になります。

/var/log の中身を全部消しても大丈夫ですか?

いいえ。古い .gz ローテーションファイルの削除と、大きな使用中ログの truncate にとどめ、ディレクトリ構成は残してください。ログディレクトリがないと起動しないサービスもあります。

ディスクがすぐ埋まります。容量を増やせますか?

まず上記の手順で根本原因を突き止めてください。本当に容量が必要な場合、JUSTG のクラウドサーバーは SSD 容量を追加できます。クライアントエリアのアップグレードオプションを確認するか、チケットでお問い合わせください。

Linux サーバーのディスク容量不足が解決しない場合は、https://www.justg.com/submitticket.php からチケットを送信してください。JUSTG テクニカルサポートが対応いたします。

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

関連チュートリアル

root@vps: ~ $ ssh-keygen -t ed25519 -C "laptop-2026"$ ssh-copy-id -i ~/.ssh/id_ed25519.pub root@203…$ ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 … Linuxサーバー Linux SSH 鍵認証の設定方法:ed25519 鍵でログインしパスワード認証を無効化 ed25519 鍵で Linux VPS に SSH 鍵認証を設定し、authorized_keys の権限を整えてパスワード認証を安全に無効化する手順。 10 分で読めます 7 チュートリアルを読む root@vps: ~ $ openssl rand -base64 18$ passwd root$ ss -tlnp | grep ':2222' || echo "port 2222 is… Linuxサーバー Linux VPS で SSH ポート番号と root パスワードを安全に変更する方法 Linux の SSH ポート変更と root パスワード変更を、SELinux・ファイアウォール・Ubuntu ssh.socket・VNC 復旧まで解説。 12 分で読めます 6 チュートリアルを読む root@vps: ~ $ ss -tulpn$ sshd -T | grep -i '^port'$ nohup sh -c 'sleep 600; ufw disable' >/dev/nu… Linuxサーバー Linux ファイアウォール設定:VPS で UFW と firewalld を使う方法(IPv6 対応) UFW / firewalld で Linux ファイアウォールを設定。SSH 優先許可、Web ポート、送信元 IP 制限、IPv6、締め出し時の復旧まで。 12 分で読めます 7 チュートリアルを読む root@vps: ~ $ free -h$ swapon --show$ df -h / Linuxサーバー Linux VPS にスワップ領域を追加する方法(512MB・1GB の小容量プラン向け) 小容量 Linux VPS にスワップを追加。fallocate / dd でスワップファイル作成、fstab 登録、swappiness 調整まで。 8 分で読めます 2 チュートリアルを読む