Linux 磁盘空间排查:df/du 定位大文件与日志清理
磁盘满了是最让人头疼的线上故障之一:服务写不进日志、数据库拒绝写入、应用突然崩溃,而根因往往只是一个被忽略的大文件或者失控增长的日志。本文用一套固定的排查顺序,帮你快速定位问题,再安全地清理空间。
第一步,先看整体:用 df 看哪里满了
遇到磁盘告警,第一反应不要直接删文件,先确认是哪块盘满了。df -h 以人类可读的方式显示每个挂载点的总容量、已用和可用空间,重点看 Use% 接近 100% 的那一行,再看 Mounted on 确认是根分区、数据分区还是日志分区满了。df -i 也值得顺手跑一下,它看的是 inode 使用率:小文件太多时,磁盘明明还有空间,也会因为 inode 耗尽而写不进去。
第二步,再看目录:用 du 逐层下钻
知道哪块盘满了,下一步是找出是哪个目录吃掉了空间。du -sh /* 可以一次性看到根目录下每个一级目录的大小;找到最大的那个,再对它继续下钻,例如 du -sh /var/*。如果想直接看到排序结果,可以用 du -ah /var | sort -rh | head -20,列出 /var 下面最大的前 20 个文件和目录。逐层下钻比上来就全盘扫描快得多,也更容易定位到真正的元凶。
第三步,找大文件:find 帮你点名
目录定位之后,用 find 直接把大文件列出来:find / -type f -size +500M -exec ls -lh {} \; 会找出大于 500M 的文件;把路径换成已经锁定的目录,速度更快。常见的嫌疑对象有:没有轮转的日志文件、堆积的备份包、被遗忘的安装包和镜像文件、应用导出的临时大文件。看到结果先别急着删,先确认文件归属和业务用途。
第四步,日志清理:先止血,再瘦身
日志是最常见的磁盘杀手,清理要分情况处理。对于 systemd 的日志,先用 journalctl --disk-usage 看占用,再用 journalctl --vacuum-size=500M 把总量压到 500M 以内,或者用 journalctl --vacuum-time=7d 只保留最近 7 天。对于文本日志,优先检查 logrotate 是否配置正确、轮转是否生效;临时止血可以用 truncate -s 0 文件名 或者 : > 文件名 把文件截断为空,而不是直接删除。
这里有一个关键细节:正在被进程写的文件不能直接 rm。删除后文件句柄还在,磁盘空间不会释放,进程还会继续往已删除的文件里写。正确做法是先截断,或者重启相关服务释放句柄。删除前最好先确认文件是否还在被使用,可以用 lsof 文件名 检查。
第五步,清理之后:做预防,别再满一次
清理只是救火,预防才能避免重演。第一,给日志配好 logrotate,设置好轮转周期、保留份数和压缩;第二,对备份和临时文件设好保留期限,用定时任务定期清理;第三,把 /var/log 这类容易增长的目录单独分区,避免日志把根分区拖垮;第四,给磁盘使用率设告警阈值,比如 80% 提醒、90% 紧急处理,留出足够的反应时间。
排查清单
最后把流程收成一张清单:df -h 确认满盘,df -i 检查 inode,du -sh 逐层定位目录,du 加 sort 找最大的目录,find 找大于 500M 的文件,journalctl 看日志占用,truncate 截断正在写的日志,logrotate 做好长期轮转。按这个顺序走,大多数磁盘满的问题都能在十分钟内定位,再用安全的方式清理干净。记住原则:先定位再动手,先截断再删除,清理之后补上轮转和告警。
- 点赞
- 收藏
- 关注作者
评论(0)