磁盘满了别急着删:df 与 du 排查的三步法
服务器上最常见的半夜报警之一就是磁盘满了。服务写不进日志、数据库拒绝写入、部署传不上包,表象五花八门,根因往往只有一个:某个地方在悄悄吃空间。慌着删文件之前,先分清“满的是哪块盘、是谁占的、能不能安全删”,三步走比凭感觉清理稳得多。第一步用 df 看全局。df -h 列出每个挂载点的总容量、已用、可用和挂载位置,先确认告警对应的是根分区、数据盘还是某个单独挂载的目录。还要留意一个容易被忽略的数字:inode 用量。df -i 能看到 inode 是否耗尽——小文件成千上万时,磁盘明明还有空间,系统却因为没有 inode 可分配而写不进新文件,这时删大文件完全没用,得清掉海量小文件才行。第二步用 du 往下钻。确定了分区,就从挂载点一层层往下找:du -sh /var/* 看一级目录各占多少,再对最大的那个继续 du -sh /var/log/*,几轮就能定位到吃空间的目录。注意 du 默认会跟随目录但不跨文件系统,跨分区排查时加 -x 限制在同一文件系统内,避免把别的挂载点也算进来。还有一个常见误区:du 看的是文件实际占用的块大小,稀疏文件、硬链接多的目录算出来的数字和直觉会有出入,定位时以相对大小排序为准,不必纠结绝对精确。第三步区分“能删、能挪、不能动”。日志目录通常是头号嫌疑:先看是不是某个服务在疯狂打日志,根因是日志级别开得太高或某个错误在循环刷屏,删日志不改配置等于白删。其次看临时文件和旧备份:下载一半的包、过期的快照、很久没人要的 core dump,这些删了一般无害,但删之前确认没有进程正在用它。最要小心的是“已删除但仍被占用的文件”:文件删了,df 却不见空间释放,往往是有进程还握着已删除文件的句柄,日志文件被 rm 后服务还在往旧句柄里写。这时 lsof | grep deleted 能找到元凶,正确做法是重启对应服务或让它重新打开日志,而不是继续删别的文件凑空间。有三类东西不要凭感觉动。数据库的数据目录、正在运行的服务的可执行文件和配置文件、以及任何你不确定归属的目录,删之前先备份或先确认用途。空间实在紧张时,优先做“挪”而不是“删”:把旧日志、旧备份移到另一块盘或对象存储,既释放了空间,又留了后悔药。长期来看,防满比救火重要:给日志配轮转(logrotate 或应用自带的 retention),给备份定保留期,给关键分区设使用率告警阈值,比如 80% 预警、90% 必须处理,别等到 100% 才动手。一句话总结:磁盘满了先 df 定分区、再 du 定位目录、最后分清能删能挪不能动;已删除文件不释放空间时,先查还握着句柄的进程。按这个顺序排查,既不会误删关键数据,也不会删完发现空间一点没回来。
- 点赞
- 收藏
- 关注作者
评论(0)