Linux 磁盘空间排查实战:df、du 与 ncdu 快速定位大文件

举报
yd_282444815 发表于 2026/11/10 01:06:42 2026/11/10
【摘要】 磁盘满了别急着删文件。本文按 df 定范围、du 找大头、ncdu 交互定位的顺序,教你十分钟锁定磁盘占用元凶,并讲清 deleted 句柄、日志失控等常见坑与预防方法。

服务器磁盘满了是最常见的线上故障之一:日志写不进去、数据库拒绝写入、应用莫名其妙变慢。很多人第一反应是到处删文件,结果越删越慌。其实排查磁盘空间有一套固定套路,顺着 df、du、ncdu 三个命令走,十分钟就能锁定元凶。

第一步:df -h,看整体

先看哪个挂载点满了:

df -h

重点看 Use% 和挂载点。根分区满和数据盘满,处理方式完全不同;/tmp 满一般是临时文件堆积,/var 满多半是日志或数据库文件。顺带看一眼 inode:

df -i

如果 inode 耗尽而空间还很多,说明有海量小文件,通常是日志按行切分或缓存碎片造成的。

第二步:du 排序,定位大目录

确认挂载点后,用 du 逐层下钻:

du -sh /var/* | sort -rh | head -10
du -sh /var/log/* | sort -rh | head -10

也可以用一条命令直接找出最大的前 20 个目录:

du -ah / --exclude=/proc --exclude=/sys 2>/dev/null | sort -rh | head -20

注意 du 看的是目录汇总,配合 sort -rh 才能一眼看到大头。排查时常见的大户有三类:日志目录、数据库数据目录,以及各类备份和安装包残留。

第三步:ncdu 交互式排查

如果系统里装了 ncdu,就不用一层层敲命令了:

ncdu /

ncdu 会扫描并按大小排序,用方向键逐层展开,按 d 可以直接删除。没有 ncdu 时,也可以用 du -d 2 -h /var | sort -rh 做两层下钻,效果类似。图形化工具适合“不知道从哪下手”的场景,而 du 更适合写进巡检脚本做定期检查。

容易踩坑的“幽灵占用”

有一种情况特别容易误导人:df 显示磁盘满了,du 却算不出那么多空间。最常见的原因是文件被删除了,但进程还拿着句柄,空间没有释放:

lsof | grep deleted

看到这类进程后,重启对应服务或用 : > /var/log/xxx.log 的方式截断日志,空间会立刻释放。直接 rm 正在写入的日志文件,反而可能让空间一直不释放,这也是新手最常犯的错误。

另外两个容易被忽视的大户是 systemd 日志和容器层。journal 日志默认不封顶,可以用 journalctl --disk-usage 查看,并用 journalctl --vacuum-size=500M 清理。容器环境里 docker system df 能看到镜像、容器和构建缓存各占多少,清理前务必确认没有正在运行的构建任务。

清理之前,先想清楚三件事

第一,删之前先确认文件归属和业务影响,生产库的数据文件和正在运行的服务日志不能直接删;第二,能截断就不删除,能归档就不丢弃,重要日志先压缩备份再清理;第三,清理后立刻复查 df -h,确认空间确实释放,避免“删了文件空间却没回来”的尴尬。

预防比救火更重要

建议把磁盘使用率纳入日常告警,80% 预警、90% 紧急处理。对日志目录做好 logrotate 轮转,限制单文件大小和保留份数;对备份任务加 retention 策略,避免备份越攒越多;定期跑一次磁盘巡检脚本,把最大的十个目录输出到巡检报告里。很多磁盘告警不是突然发生的,而是每天涨一点、没人看导致的。

小结

磁盘排查记住一个顺序:先 df 定范围,再 du 找大头,有条件上 ncdu 交互定位;遇到 df 和 du 对不上账就查 deleted 句柄。清理时先截断日志、清理缓存类数据,再动业务文件。把这套流程写成巡检脚本或检查清单,下次磁盘报警时,你就不用再凭感觉删文件了。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。