disk-cleanup について
disk-cleanup は、ディスク使用量が増えた Linux VM を対象とするクリーンアップスキルです。マウントや容量の消費先を調査し、安全な操作と確認が必要な操作を分けて実行した後、空き容量を検証します。
主な機能
- 01マウント、inode、削除済みのオープンファイルを調査
- 02約 50 MB を超える容量消費先を列挙
- 03安全な削除と確認が必要な操作を分類
- 04クリーンアップ前後のサイズを記録
- 05マウントごとに空き容量を検証
活用シーン
- 01容量不足に近い Linux VM の調査
- 02大規模ビルドや Git 操作後の空き容量確保
- 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=50M | 50M まで |
| ローテーション済みログ | 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 を使用します |