mcpField
D
disk-cleanup

disk-cleanup

github.com/moonlight-lupin云与 DevOps113147 次安装1 天前更新
代码仓库

关于 disk-cleanup

disk-cleanup 是面向 Linux VM 磁盘清理的技能,适用于磁盘使用率偏高或构建、Docker 数据累积的情况。它会检查各挂载点和空间占用,将安全操作与需确认的操作分开,并核对释放的空间。

主要功能

  1. 01检查挂载点、inode 和已删除但仍打开的文件
  2. 02列出约 50 MB 以上的空间占用项
  3. 03区分安全清理与需确认的操作
  4. 04记录清理前后的占用大小
  5. 05按挂载点核对释放空间

适用场景

  1. 01排查快满的 Linux VM
  2. 02在大型构建或 Git 操作后释放空间
  3. 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 显示有空闲块,但写入时出现 ENOSPCinode 耗尽——存在数百万个小文件。检查 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