关于 disk-cleanup
disk-cleanup 是面向 Linux VM 磁盘清理的技能,适用于磁盘使用率偏高或构建、Docker 数据累积的情况。它会检查各挂载点和空间占用,将安全操作与需确认的操作分开,并核对释放的空间。
主要功能
- 01检查挂载点、inode 和已删除但仍打开的文件
- 02列出约 50 MB 以上的空间占用项
- 03区分安全清理与需确认的操作
- 04记录清理前后的占用大小
- 05按挂载点核对释放空间
适用场景
- 01排查快满的 Linux VM
- 02在大型构建或 Git 操作后释放空间
- 03审核 Docker 和缓存清理选项
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ moonlight-lupin/ agent-skills --skill disk-cleanup安装后在 Claude Code 中输入/disk-cleanup确认已加载。
附带文件evals/routing-fixtures.json
详细介绍
磁盘清理
释放 Linux 虚拟机上的磁盘空间。该技能会执行一次排查——检查所有空间占用项,将目标分为安全和需确认两类,执行已批准的项目,然后验证空间变化。
适用场景
- 用户提出“磁盘清理”“释放空间”“清理虚拟机”
- 磁盘使用率超过 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. 分类
将找到的所有目标分为两类。执行前先向用户展示表格。
安全——无需询问即可执行:
| 目标 | 命令 | 可释放空间 |
|---|---|---|
| uv 缓存 | uv cache prune | 最多释放全部缓存空间 |
| pip 缓存 | pip cache purge | 最多释放全部缓存空间 |
| apt 缓存 | apt autoclean | 通常约 100M |
| Journal 日志 | 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 | 会销毁可恢复对象(已删除的暂存内容、错误重置后遗留的孤立提交)。激进重新打包会暂时增加磁盘占用。 | cd /repo && git gc --aggressive --prune=now |
| apt autoremove | 可能会移除需要的软件包。确认前先检查列表。 | apt autoremove(不带 -y) |
| 旧数据库备份 | 先确认当前数据库运行正常。使用明确路径,不要使用通配符。 | rm /path/to/specific-backup.bak |
| 过期的 /tmp 目录 | 目录的修改时间无法反映其内部活动。删除前先列出目录。 | find /tmp -maxdepth 1 -mtime +3 -type d -name "*_*" | xargs ls -ld 然后确认 |
| 已停止容器所用的 Docker 镜像 | 之后可能还要重新启动 | docker rmi <image> |
| 会话检查点存储 | 可能包含可恢复状态 | — |
| 大型技能参考资料(PDF、地图、RAG 索引) | 用户数据 | — |
| 大型项目上传文件 | 用户数据 | — |
| 运行中服务所用的 Docker 镜像 | 会造成服务中断 | — |
**完成标准:**已展示表格,并列出仅含安全项目的总量和包含需确认项目的总量。用户已批准一组项目。
4. 执行
对每个已批准的目标,执行安全列表中的命令。记录每项清理前后的大小。
对于Docker 已停止的容器及其镜像(需要两个步骤):
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 查找,然后清理问题缓存或 spool。清理磁盘占用无济于事。 |
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 |
评论
支持 Markdown