mcpField
D
disk-cleanup

disk-cleanup

github.com/moonlight-lupinクラウド・DevOps113147 回インストール1 日前に更新
リポジトリ

disk-cleanup について

disk-cleanup は、ディスク使用量が増えた Linux VM を対象とするクリーンアップスキルです。マウントや容量の消費先を調査し、安全な操作と確認が必要な操作を分けて実行した後、空き容量を検証します。

主な機能

  1. 01マウント、inode、削除済みのオープンファイルを調査
  2. 02約 50 MB を超える容量消費先を列挙
  3. 03安全な削除と確認が必要な操作を分類
  4. 04クリーンアップ前後のサイズを記録
  5. 05マウントごとに空き容量を検証

活用シーン

  1. 01容量不足に近い Linux VM の調査
  2. 02大規模ビルドや Git 操作後の空き容量確保
  3. 03Docker とキャッシュの削除候補の確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/moonlight-lupin/agent-skills --skill disk-cleanup

インストール後、Claude Code で/disk-cleanupを入力して読み込まれたか確認します。

同梱ファイルevals/routing-fixtures.json

詳細

ディスクのクリーンアップ

Linux VM のディスク容量を確保します。このスキルではトリアージを実行し、容量を消費している対象をすべて調査し、安全なものと確認が必要なものに分け、承認された対象を実行してから、容量の変化を確認します。

使用するタイミング

  • ユーザーが「ディスクのクリーンアップ」「空き容量を増やす」「VM をクリーンアップして」と言ったとき
  • ディスク使用率が 80% を超えているとき
  • 大規模なビルド、git 操作、または Docker イメージの蓄積の後

手順

1. クリーンアップ前の記録
df -h

完了条件: クリーンアップ前後の比較用に、すべてのマウントポイントの使用量と空き容量を記録していること。

2. 調査

apt、journalctl、/var/log の操作にはroot 権限が必要です。root 以外のユーザーも調査できますが、システムパスはクリーンアップできません。

容量を約 50M 以上消費している対象をすべて、サイズの大きい順に並べます。/ だけでなく、すべてのマウントポイントを調査します。

# All mounts (not just /)
df -h
df -i                           # inode exhaustion — "No space left on device" with free blocks

# Deleted-but-open files (canonical "df says full, du says empty" case)
lsof +L1 2>/dev/null | head -20

# Hermes data + user caches + tmp (stay on one filesystem, don't cross mounts)
du -xsh ~/.hermes/*/ 2>/dev/null | sort -rh | head -20
du -xsh ~/.hermes/projects/*/ 2>/dev/null | sort -rh | head -20
du -xsh ~/.cache/*/ 2>/dev/null | sort -rh | head -15
du -xsh /tmp/* 2>/dev/null | sort -rh | head -15

# Memory store (if Mnemosyne is installed)
du -xsh ~/.hermes/mnemosyne/data/* 2>/dev/null | sort -rh

# Session checkpoints (if present)
du -xsh ~/.hermes/checkpoints/store/ 2>/dev/null

# Docker
docker system df                # shows build cache separately from images
docker images --format "{{.Size}}\t{{.Repository}}:{{.Tag}}" | sort -rh | head -25
docker ps -a --filter "status=exited" --format "{{.Image}}" | sort -u

# System
du -xsh /var/cache/apt /var/log ~/.cache/pip ~/.cache/uv 2>/dev/null
journalctl --disk-usage
find /var/log \( -name "*.gz" -o -name "*.1" -o -name "*.old" \) 2>/dev/null

# Bloated git repos (orphaned tmp_pack files from interrupted operations)
find ~/.hermes/projects -name ".git" -type d -exec sh -c 'du -sh "$1" 2>/dev/null' _ {} \; | sort -rh | head -10

完了条件: 50M 以上を消費している対象とそのサイズをすべて特定していること。すべてのマウントポイントを調査していること。inode の枯渇と、削除済みだが開いたままのファイルを確認していること。

3. トリアージ

見つかった対象をすべて 2 つのグループに分けます。実行前にユーザーに表を提示します。

安全 — 確認せずに実行:

対象コマンド確保できる容量
uv キャッシュuv cache pruneキャッシュ全体の容量まで
pip キャッシュpip cache purgeキャッシュ全体の容量まで
apt キャッシュapt autoclean通常約 100M
ジャーナルログjournalctl --vacuum-size=50M50M まで
ローテーション済みログfind /var/log \( -name "*.gz" -o -name "*.1" -o -name "*.old" \) -delete通常約 20M
ブラウザー自動化キャッシュrm -rf ~/.cache/puppeteer ~/.cache/ms-playwright約 650M。必要に応じて再ダウンロードされます
未使用の Docker イメージdocker image prune -f変動します
Docker ビルドキャッシュdocker builder prune -f --filter until=168h --reserved-space 10GB数 GB になることもあります。7 日以内のキャッシュは削除せず、常に 10GB を保持します

事前に確認 — ユーザーの承認が必要:

対象リスクコマンド
git gc の積極的な実行復元可能なオブジェクト(削除された stash、不適切なリセット後の孤立コミット)が失われます。積極的な再パック中は、一時的にディスク使用量が増加します。cd /repo && git gc --aggressive --prune=now
apt autoremove必要なパッケージが削除される場合があります。承認する前に一覧を確認してください。apt autoremove(-y を付けない)
古い DB バックアップ先に現在の DB が正常であることを確認してください。ワイルドカードではなく、明示的なパスを指定します。rm /path/to/specific-backup.bak
古い /tmp ディレクトリディレクトリの mtime では内部のアクティビティを判断できません。削除前に一覧を確認してください。find /tmp -maxdepth 1 -mtime +3 -type d -name "*_*" | xargs ls -ld を実行してから確認
停止中のコンテナーが使用する Docker イメージ後でコンテナーを再起動する場合がありますdocker rmi <image>
セッションのチェックポイント保存領域復元可能な状態が含まれている場合があります—
大容量のスキルリファレンス(PDF、マップ、RAG インデックス)ユーザーデータです—
大容量のプロジェクトアップロードユーザーデータです—
実行中のサービスが使用する Docker イメージサービスに支障が出ます—

完了条件: 安全な対象のみの合計と、確認が必要な対象を含めた合計を記載した表を提示していること。ユーザーが対象を承認していること。

4. 実行

承認された各対象について、安全な対象の表にあるコマンドを実行します。それぞれの実行前後のサイズを記録します。

停止中の Docker コンテナーとイメージについては、2 つの手順が必要です。

docker rm $(docker ps -a --filter "status=exited" --filter "ancestor=IMAGE" -q)
docker rmi IMAGE

完了条件: 承認されたすべての対象をクリーンアップしていること。それぞれの実行前後のサイズを記録していること。

5. 確認
df -h

手順 1 のクリーンアップ前の記録と、マウントポイントごとに比較します。

完了条件: マウントポイントごとに確保できた合計容量を報告していること。使用量と空き容量をクリーンアップ前の記録と比較していること。

注意点

問題原因対処方法
df では空きブロックが表示されるのに、ENOSPC で書き込みに失敗するinode の枯渇です。数百万個の小さなファイルが原因です。df -i で確認してください。ディレクトリごとに find <mount> -xdev -type f | head -100000 | wc -l を実行して場所を特定し、問題のあるキャッシュやスプールを削除します。ディスク容量のクリーンアップでは解決しません。
df では満杯なのに、du では何も表示されないプロセスが削除済みのファイルを開いたままにしています。lsof +L1 で確認してください。lsof +L1 でファイルを保持しているプロセスを特定し、再起動します(または cat /dev/null > /proc/<pid>/fd/<n> で切り詰めます)。ファイルを削除しても容量は解放されません。
git gc を実行しても何も解放されない孤立オブジェクトがなく、単に履歴が大きいだけですサイズを許容するか、圧縮効果はわずかですが git repack -ad を実行します
gc 後も tmp_pack ファイルが残るGit プロセスがまだ実行中であるか、ロックファイルがありますfuser .git/objects/pack/*.pack でプロセスを特定し、終了後に再試行します
Docker rmi が「image is in use」で失敗する停止したコンテナがそのイメージを参照しています先にコンテナで docker rm を実行し、その後 docker rmi を実行します
apt autoremove に必要なパッケージが表示される自動削除可能な依存パッケージとして誤って判定されています確定する前に一覧を確認し、除外するには apt-mark manual <pkg> を実行します
journalctl --vacuum-size が失敗するJournald サービスの問題ですsystemctl restart systemd-journald を実行してから再試行します
uv cache prune が失敗するuv が PATH にありませんpython -m uv cache prune を使用します

コメント