Linux 磁盘占满排查手册:从 df 到根因的完整路径
磁盘占满是 Linux 运维中最常见、也最容易误判的故障:df 显示 100%,未必是文件真的写满了;删除大文件后空间也未必立即释放。本文给出一条可复现的排查路径,先定位、再定性、最后清理并防复发。
一、先确认是空间满还是 inode 满
执行 df -h 和 df -i,前者看容量,后者看 inode。容量满常见于日志、备份、下载目录;inode 满则常见于海量小文件,例如邮件队列、缓存碎片、未清理的 session 文件。两者处理方法完全不同,先区分再动手。
同时用 df -hT 确认各挂载点:根分区满和数据分区满的影响面不同,/var/log 满可能导致服务写日志失败,/tmp 满可能导致临时文件创建失败,不要只盯着根分区。
二、用 du 逐级下钻,不要直接删
从根目录逐级执行 du -sh /,再对可疑目录继续下钻,例如 du -sh /var/log/ | sort -rh | head -20。排序后先看前几名,避免凭感觉清理。
注意两点:第一,du 统计的是目录实际占用,跨挂载点时要用 -x 限制在同一文件系统,避免把其他挂载点算进来;第二,正在写入的日志文件即使很大,也不要直接 rm,后面会讲原因。
三、已删除但仍被占用的文件
如果 du 统计的总量远小于 df 显示的已用空间,优先怀疑已删除未释放的文件。执行 lsof | grep deleted,找出仍被进程持有的已删除文件。
典型场景:日志文件被 rm 后,写日志的进程仍持有旧文件句柄,空间不会释放。正确做法是先让进程释放句柄,例如重启对应服务,或者对仍在运行的进程执行 echo > /proc/<PID>/fd/<FD> 截断;更稳妥的做法是平时就用日志轮转,而不是手工 rm 正在写的文件。
四、定位大文件与增长源头
用 find / -xdev -type f -size +500M -exec ls -lh {} ; 找大文件;用 find /var/log -type f -mtime -1 -exec ls -lh {} ; 看最近一天内增长的文件。
常见增长源头包括:未轮转的应用日志、数据库慢查询日志、备份脚本重复全量备份、容器日志未限制大小、core dump。找到增长源头后,先止血再清理,例如临时调低日志级别、停掉异常循环写入的任务。
五、安全清理与日志轮转
清理顺序建议:先清可再生的缓存和临时文件,例如 /tmp 下的过期文件、包管理器缓存;再清已轮转的旧日志;最后才处理业务数据,业务数据删除前必须确认备份。
长期治理要靠 logrotate:给应用日志配置按大小或按天轮转、保留份数和压缩,例如 daily、rotate 7、compress、missingok、copytruncate。容器场景则要在日志驱动层面限制单个容器日志大小和文件数,避免一个容器拖垮整台宿主机。
六、根因与预防清单
- 磁盘告警阈值不要只设 90%,应同时设 80% 预警和 inode 告警,给清理留出时间窗口。
- 备份目录、日志目录、数据目录分开挂载,避免一个目录失控影响整个系统。
- 定期执行 du 巡检并记录增长趋势,突发增长往往先于占满出现。
- 删除前先确认文件归属和是否仍被进程使用,删除后用 df 复核空间是否真正释放。
按这条路径走,大多数磁盘占满问题可以在不重启整机、不误删业务数据的前提下定位并解决。
- 点赞
- 收藏
- 关注作者
评论(0)