df -h 显示根分区 100%,服务器开始出问题。先给结论——清理要按"定位 → 按类型清"两步走

  1. 先用 df/du 找到空间到底被谁占了;
  2. 再按下面的清单逐类清理(日志、包缓存、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.confSystemMaxUse,重启 systemd-journald;即时清理用 journalctl --vacuum-size=100M

问:apt/yum 缓存可以放心清吗? 可以,只是删掉下载过的安装包缓存,不影响已装软件。apt clean / yum clean all 即可。

问:磁盘满了还能正常启动服务吗? 可能无法写入导致服务异常;尽快清出空间。若彻底无法写,先看能否用 journalctl --vacuum 或删临时文件腾出最小空间。

想系统搞懂磁盘空间去哪,可看同系列:df/du 不一致、磁盘满了删不掉、inode 耗尽、找出最占空间的文件。