服务器磁盘满了别慌:用 df 和 du 一步步定位大文件
服务器突然报磁盘空间不足,服务写不进日志、数据库起不来,第一反应往往是“赶紧删点东西”。但在动手删之前,先搞清楚空间到底被谁占了,否则删错文件可能比磁盘满更麻烦。Linux 自带的两条命令 df 和 du,配合起来就能快速定位问题,而且不需要装任何额外工具。
第一步:用 df 看整体。先执行 df -h,-h 是让人读得懂的单位(GB、MB)。重点看 Use% 那一列:哪个挂载点接近 100%,问题就在那里。根分区满和数据盘满的处理完全不同,先定方向再动手。如果是 /var 满,大概率是日志;如果是 /home 满,多半是用户数据或下载文件;如果是 Docker 所在的分区满,则要优先查镜像和容器日志。
第二步:用 du 找大目录。确定了满的分区,再一层层往下钻:执行 du -sh /var/* | sort -rh | head -20。du -sh 算出每个子目录的总大小,sort -rh 按大小倒序排,head 取前 20 名。看到最大的目录,再对它重复同样的命令,一层层缩小范围,直到找到真正的大户。这个过程很像二分查找,比凭感觉翻目录快得多,也不会漏掉藏得很深的大文件。
第三步:重点查三类常见“空间杀手”。一是日志。服务日志如果没有轮转,会无声无息地长到几十 GB。先看 /var/log 下最大的几个文件,确认是历史日志后才能删,正在被程序写着的文件不要直接删——删了文件,程序还握着旧句柄,空间并不会释放,正确做法是清空内容:: > /var/log/xxx.log。二是 Docker。镜像、停止的容器、无用的卷都会吃空间,执行 docker system df 能看到各类占用。清理前先确认哪些容器和卷还在用,再用 docker system prune 做清理,不要上来就全量删除。三是缓存和临时文件。包管理器的缓存、旧内核、下载目录里的安装包,都是可以安全清理的对象。但系统目录下的文件不要凭猜测删,不确定用途时先用 du 确认大小,再查一下这个目录是哪个软件的。
第四步:删完要验证。删完文件不要立刻以为完事,再跑一次 df -h,确认 Use% 确实降下来了。如果删了文件空间却没释放,说明有进程还握着已删除文件的句柄,用 lsof | grep deleted 就能找到是哪个进程,重启对应服务后空间才会真正回来。这一步很多人会漏掉,结果以为清理无效,又去删更多文件。
最后给日常运维留两个习惯:一是给磁盘使用率设个告警,超过 80% 就提醒,别等到 100% 才救火;二是给日志配好轮转,限制单个日志文件的大小和保留份数。磁盘满很少是一夜之间发生的,多数是每天涨一点、没人看,最后在某个凌晨集中爆发。养成定期 df 看一眼的习惯,十分钟的检查能省下一夜的抢修。
- 点赞
- 收藏
- 关注作者
评论(0)