df -h 显示根分区 100%,服务器开始出问题。先给结论——清理要按"定位 → 按类型清"两步走:
- 先用
df/du找到空间到底被谁占了;- 再按下面的清单逐类清理(日志、包缓存、journald、docker、临时文件),每清一类就用
df -h确认效果,避免删错。
第 1 步:定位大头
df -h /
du -xhd1 / 2>/dev/null | sort -h | tail -20
从占用最大的目录逐层进入,找到真正的大户再动手。详细定位方法见同系列《找出最占空间的文件》。
第 2 步:按类型清理
1) 日志文件(最常背锅)
先清空正在被写的大日志内容(比 rm 更安全,能即时释放且不影响写进程):
sudo truncate -s 0 /var/log/syslog
sudo truncate -s 0 /var/log/messages # RHEL 系
系统日志轮转配置(控制轮转大小/份数),Debian/Ubuntu 用 logrotate:
# 查看轮转配置与状态
ls /etc/logrotate.d/
# 手动强制执行一次轮转
sudo logrotate -f /etc/logrotate.conf
2) journald 系统日志
journalctl 日志可能占数百 MB 到数 G。设置大小上限(推荐)并清理:
# 查看当前占用
sudo journalctl --disk-usage
# 清理到保留最近 3 天
sudo journalctl --vacuum-time=3d
# 或只保留 100M
sudo journalctl --vacuum-size=100M
要持久限制大小,编辑 /etc/systemd/journald.conf:
SystemMaxUse=200M
然后重启服务生效:
sudo systemctl restart systemd-journald
提示:
journald.conf位置 Debian 与 RHEL 均在/etc/systemd/journald.conf;改完SystemMaxUse记得重启systemd-journald。
3) 软件包缓存
# Debian / Ubuntu:清理 apt 下载缓存
sudo apt clean
# RHEL / CentOS / Rocky:清理 yum/dnf 缓存
sudo yum clean all
4) Docker 残留(装了 Docker 时)
# 查看可回收
docker system df
# 清理悬空镜像、停止的容器、无用网络/构建缓存(会提示确认)
docker system prune
# 更激进(含未使用的镜像,谨慎)
docker system prune -a
5) 临时与缓存目录
# 清空 /tmp(注意是否有进程正在用的文件,生产谨慎)
sudo find /tmp -type f -atime +3 -delete 2>/dev/null
清理有风险,原则:先看再清、逐类确认、只删确定无用。不确定的目录不要
rm -rf。
第 3 步:确认清理效果
df -h /
若空间仍满,可能是被删文件仍被进程占用(lsof +L1,见同系列"删不掉"篇)或 inode 问题(df -i,见 inode 篇)。
一屏速查表
# 一套顺手的检查
df -h / && df -i /
du -xhd1 / | sort -h | tail
sudo journalctl --disk-usage
docker system df # 有 docker 时
lsof +L1 2>/dev/null | grep -i deleted # 被删仍占用
FAQ
问:删了大日志空间为什么没释放?
文件被进程占用未释放,用 > 文件 或 truncate -s 0 文件 清空内容可即时释放;被删未释放的用 lsof +L1 定位进程。
问:journald 日志怎么设上限?
改 /etc/systemd/journald.conf 的 SystemMaxUse,重启 systemd-journald;即时清理用 journalctl --vacuum-size=100M。
问:apt/yum 缓存可以放心清吗?
可以,只是删掉下载过的安装包缓存,不影响已装软件。apt clean / yum clean all 即可。
问:磁盘满了还能正常启动服务吗?
可能无法写入导致服务异常;尽快清出空间。若彻底无法写,先看能否用 journalctl --vacuum 或删临时文件腾出最小空间。
想系统搞懂磁盘空间去哪,可看同系列:df/du 不一致、磁盘满了删不掉、inode 耗尽、找出最占空间的文件。