“Linux 磁盘满了怎么清理内存”这句话里其实混了两个问题:磁盘满属于存储空间问题,内存紧张属于 RAM 和 swap 问题。多数情况下,需要先确认到底是 df 显示分区写满,还是 free 显示可用内存见底。因为磁盘满之后,日志写入、临时文件、数据库 WAL 都可能失败,表现会很像“内存不足”。动手前先用一条命令把两类指标都看清楚,不要急着删文件或重启服务。
磁盘满和内存不足要先分开判断:先跑df -hT和df -i看空间与 inode,再跑free -h和ps aux --sort=-rss | head看内存占用。若df的 Use% 接近 100%,处理对象是磁盘;若free的 available 很低但磁盘还有余量,才轮到查内存和 swap。清理顺序通常是先删可再生的日志与缓存,再考虑迁移大文件;不要用清空 swap 或清缓存当作长期方案,这类动作只缓解当下压力。删任何文件前,先用lsof确认没有进程占用,否则空间不会立刻释放。
Linux磁盘满先定位在哪一层
磁盘满通常不是单一环节的问题,按层排查能避免把“应用写不进去”误判成“内存不够”。可以先从下面三层依次确认,找到第一层异常就停下来处理,不要跳步。
- 文件系统层:用
df -hT看每个挂载点的 Use% 和文件系统类型,用df -i看 inode 使用率。Use% 高说明块空间耗尽;IUse% 高说明小文件太多,此时即使df -h显示还有空间也会报 No space left on device。 - 目录与文件层:在确认异常挂载点后,用
du -xhd1 /path逐层下钻,定位占用最大的目录;再用find /path -xdev -type f -size +500M -exec ls -lh {} \;找大文件。-xdev能避免跨挂载点统计。 - 进程层:文件已被删除但空间没释放,通常是仍有进程持有句柄。用
lsof +L1或lsof | grep deleted查被删除但仍被打开的文件,对应进程重启或让它重新打开文件后空间才会回收。
如果 df 显示空间正常、但应用报内存分配失败,再去看 free -h 的 available 列和 /proc/meminfo 中的 MemAvailable。内存问题的排查和磁盘清理是两条线,不要用删日志的方式去“解决内存不足”。
Linux磁盘满:先看这四个位置
下面四个位置分别对应命令输出、日志、配置项和面板字段,按顺序看一遍基本能判断问题范围。每条都给出可直接执行的命令或路径。
1. 命令输出:空间和 inode
df -hT
df -i
findmnt -o TARGET,SOURCE,FSTYPE,OPTIONS
先看 df -hT 哪个挂载点 Use% 最高,再看 df -i 对应挂载点的 IUse%。两个指标要一起看,只看其中一个容易误判。

2. 日志:/var/log 与 journald
du -xhd1 /var/log | sort -h
journalctl --disk-usage
日志通常位于 /var/log,du -xhd1 能列出各子目录大小。使用 systemd-journald 的系统,日志还可能占用 /var/log/journal,用 journalctl --disk-usage 查看当前占用,而不是只盯着 messages 或 syslog。
3. 配置项:日志轮转和保留策略
cat /etc/logrotate.conf
ls /etc/logrotate.d/
grep -E '^(SystemMaxUse|SystemKeepFree|MaxRetentionSec)' /etc/systemd/journald.conf
清理只能解决当下,真正防止再次写满要看轮转配置。logrotate 的 rotate、size、maxsize 决定保留多少份历史日志;journald 的 SystemMaxUse 决定日志总容量上限。修改这些配置需要结合业务日志保留要求确认,不要直接套用别人的数值。
4. 面板字段:监控里的磁盘与内存指标
如果服务器接了监控面板(如 Prometheus + Grafana、云厂商控制台),分别查看磁盘使用率(filesystem usage)和内存可用量(MemAvailable)两个指标曲线。看变化趋势比看单点数值更有用:磁盘是缓慢增长还是短时间暴涨,内存是持续高位还是周期性波动,处理方向不同。具体字段名各面板不一致,以实际面板的指标说明为准。
Linux磁盘满:按可能性从高到低排除
下面按常见程度排序,每条给出确认动作。确认某条成立后再处理,不要在没定位的情况下批量删文件。

- 日志暴涨:确认
du -xhd1 /var/log | sort -h和journalctl --disk-usage。处理时优先用journalctl --vacuum-size=500M或journalctl --vacuum-time=7d收缩 journald 日志;普通日志文件用truncate -s 0 /var/log/xxx.log截断,而不是直接rm,因为进程仍持有句柄时删除不会释放空间。 - 被删除但仍被打开的文件:确认
lsof +L1。输出里SIZE/OFF较大的行就是占用者,处理方式是重启对应服务或让它轮转日志,之后空间才回收。 - 应用缓存或临时文件:确认
du -xhd1 /tmp /var/tmp /var/cache。处理前确认目录用途,/tmp下可能有正在运行的服务使用的临时文件,建议先停相关服务或确认无占用再清理。 - 容器与镜像:确认
docker system df(若使用 Docker)或du -xhd1 /var/lib/docker。清理可用docker system prune,但会删除未使用镜像和停止的容器,需要结合环境确认是否有依赖。 - 数据库与业务数据增长:确认
du -xhd1 /var/lib/mysql或对应数据目录。这类文件不能直接删,需要走归档、清理历史分区或扩容,属于业务决策,不是运维单方面能处理的动作。 - inode 耗尽:确认
df -i。常见于大量小文件目录(如 session、邮件队列、缓存碎片)。处理方式是找到文件数最多的目录:find /path -xdev -type f | wc -l逐层统计,再按业务规则清理。
Linux磁盘满:改完怎么确认真的解决了
清理动作执行后,用下面的命令确认空间确实回收,并观察一段时间再判断是否稳定。
df -hT
df -i
lsof +L1 | head
journalctl --disk-usage
free -h
判断标准建议这样看:df -hT 对应挂载点 Use% 明显下降,df -i 的 IUse% 同步下降;lsof +L1 不再有大量残留句柄;journalctl --disk-usage 落到设定上限以内。观察时间上,建议至少跨过一个业务高峰或一个日志轮转周期(例如一天),确认 Use% 没有快速回升。如果只是把日志删掉但没改轮转策略,回升是大概率事件。
回滚办法要提前想好:改动 logrotate 或 journald 配置前,先备份原文件:
cp /etc/logrotate.conf /etc/logrotate.conf.bak
cp /etc/systemd/journald.conf /etc/systemd/journald.conf.bak
若调整后日志量不足影响排查,用 cp /etc/logrotate.conf.bak /etc/logrotate.conf 恢复,再执行 systemctl restart systemd-journald 让 journald 配置生效。对于用 truncate 截断的日志,已删内容无法恢复,所以截断前要确认该日志不是唯一排障依据。内存相关的临时缓解(如 sync; echo 3 > /proc/sys/vm/drop_caches)只清理可回收缓存,不代表内存问题解决,不建议当作常规手段写入脚本。