Linux 磁盘满了别急着删:df、du 一套组合拳先找到元凶
一、先看全貌:df -h
磁盘满了,第一反应往往是到处删文件。其实第一步应该是先看全貌:哪个分区满了,满到什么程度。
df -h
-h 是把字节换算成人类可读的 G、M。重点看 Use% 这一列,根分区到了 90% 以上就要动手了,100% 则很多服务会直接写不进文件、开始报错。还要注意:df 看到的是文件系统层面,如果某个目录被挂载点盖住了,下面原来的文件是看不见的,这时候 du 和 df 对不上,往往就是挂载点遮挡的老文件在作怪。
二、再定位:du 顺着大目录往下钻
知道哪个分区满了,下一步是找大目录:
du -h --max-depth=1 / | sort -rh | head -20
这条命令列出根目录下一级各自占了多少,从大到小排。看到最大的目录就 cd 进去,再跑一次,一层一层往下钻,直到找到吃空间的大户。注意 du 默认会跟随到子目录,跑根分区时可能比较慢,耐心等它跑完;也可以先用 -x 把它限制在同一个文件系统内,避免钻进别的挂载分区。
三、常见元凶:日志、缓存和旧备份
实战里最常见的几类:/var/log 下滚雪球的日志,某个服务没配轮转,几个月下来能吃掉几十个 G;包管理器的缓存;还有遗忘在角落的手工备份 tar 包。处理日志之前先看一眼是不是还在被写入,正在疯狂增长的日志光删文件没用,得先找到对应的服务,把日志级别或轮转配好,不然删完第二天又满了。
四、删之前先查 lsof:删了文件空间却没回来
有一种经典场面:文件明明删了,df 一看空间一点没回来。原因通常是文件还被某个进程拿着句柄,内核要等进程释放才真正回收。用 lsof 能看到这类 deleted 状态的文件:
lsof | grep deleted
确认之后,重启对应的服务或者让进程重开日志句柄,空间才会真正释放。所以删日志文件之前,先想想它是不是还被服务打开着。
五、日常预防比救火便宜
救一次火很累,不如把预防做在前面:给日志配 logrotate,按时间和大小自动轮转压缩;/tmp 和缓存目录定期清理;磁盘用量设个 80% 的告警线,到了就提醒,别等到 100% 服务报错才发现。df 和 du 这两个老命令看着不起眼,但配合起来就是一套完整的排查流程:df 定分区,du 定位目录,lsof 确认句柄,最后再动手删。
- 点赞
- 收藏
- 关注作者
评论(0)