使用 df -h 查看 Use% 超过 90% 的真实物理分区(如 /、/var、/home),排除 tmpfs/devtmpfs 和 /dev/loop;再用 du -sh 2>/dev/null | sort -hr | head -20 定位大目录;优先清理 journal、Docker volumes、日志文件,用 journalctl --vacuum-size 或 truncate 安全释放空间。

查哪个分区满了:df -h 要加 -h,不然数字看不清
直接运行 df -h,重点关注 Use% 列超过 90% 的行。注意不是看 Available 最小的那个——有些分区挂载了 tmpfs 或 devtmpfs,df 会显示但和磁盘空间无关。重点盯 /、/var、/home 这类真实物理挂载点。如果看到 /dev/loop* 占满,大概率是 snap 包缓存膨胀,不是硬盘真满。
快速定位大文件:du -sh * | sort -hr | head -20 在可疑目录下执行
进到 df 显示快满的挂载点根目录(比如 /var),运行:
du -sh * 2>/dev/null | sort -hr | head -20。关键点:加
2>/dev/null 屏蔽权限拒绝报错,否则输出乱;sort -hr 按人类可读大小逆序排,head -20 只看前 20 行。常见元凶:/var/log 下的 journal 或 nginx/access.log;/var/cache/apt/archives(Debian/Ubuntu);/var/lib/docker/overlay2(Docker 宿主机)。
清日志别直接 rm:journalctl --disk-usage 和 truncate 更安全
系统日志(尤其是 journald)直接删 /var/log/journal/* 可能导致服务异常。先看占用:journalctl --disk-usage;再清理:journalctl --vacuum-size=200M(保留最近 200MB)或 journalctl --vacuum-time=2weeks。对滚动日志文件(如 app.log.1),用 truncate -s 0 /path/to/app.log 清空内容而不删文件,避免应用因文件丢失报错。不推荐 echo "" > app.log,某些程序会因 inode 变化中断写入。
Docker 磁盘爆满时:docker system prune 默认不删 volumes,得加 -v
运行 docker system df 看镜像、容器、卷各自占多少。默认 docker system prune 只清停止容器、悬空镜像、构建缓存,不会动 volumes——而真正吃空间的往往是 volumes。确认无用后,加 -v: docker system prune -a -v(-a 清所有未使用镜像)。注意:-v 会删除所有未被容器引用的卷,数据不可逆。如果只怀疑某个容器日志过大,查 /var/lib/docker/containers/*/*-json.log,用 truncate 清空。
最常被忽略的是:软链接指向的路径可能跨分区,du 统计时会误算;还有已删除但仍被进程占用的文件(lsof +L1 能扫出来),这类文件释放空间必须重启对应进程。动手前先 ps aux --forest 看有没有长期运行的日志收集进程在 hold 文件句柄。









