Linux 磁盘满了别急着删:df、du 三步定位空间去向

举报
yd_223785715 发表于 2026/11/14 00:31:13 2026/11/14
【摘要】 服务器报磁盘空间不足,第一反应往往是到处删日志。删错了可能把正在写的日志文件删成“幽灵文件”——空间不释放、服务还报错。先定位,再动手。 第一步:df 看哪块盘满了df -h 看的是文件系统的整体使用情况:df -h重点看 Use% 和 Mounted on。根分区满了和 /data 满了,处理方式完全不同。注意看 Avail 列,df 显示的可用空间是普通用户可用的,root 预留的 5%...

服务器报磁盘空间不足,第一反应往往是到处删日志。删错了可能把正在写的日志文件删成“幽灵文件”——空间不释放、服务还报错。先定位,再动手。

第一步:df 看哪块盘满了

df -h 看的是文件系统的整体使用情况:

df -h

重点看 Use% 和 Mounted on。根分区满了和 /data 满了,处理方式完全不同。注意看 Avail 列,df 显示的可用空间是普通用户可用的,root 预留的 5% 不算在内,别被数字骗了。

一个常见坑:df 显示已用 100%,但 du 加起来却远小于磁盘容量。这通常是有进程还拿着已删除的文件不放(见第三步),或者是挂载点被文件“盖住”了——先 umount 再看。

第二步:du 顺着目录树往下找

确认是哪个分区满了之后,用 du 找出最大的子目录:

du -h --max-depth=1 / | sort -rh | head -n 10

从根目录开始,一层层往下钻:哪一级目录最大就进哪一级,直到找到罪魁祸首。日志目录 /var/log、应用数据目录、Docker 的 /var/lib/docker 是重灾区。

两个实用参数:-x 只统计当前文件系统,不会顺着挂载点跑到别的盘上去;--max-depth=1 只看一层,输出才看得清。别直接对根目录跑不加限制的 du -sh /*,大目录会卡很久。

第三步:删之前先确认文件有没有被进程占用

找到大文件后别急着 rm。先用 lsof 看看它是不是正被进程写着:

lsof | grep deleted

如果一个已删除的文件还出现在列表里,它的空间就不会释放。正确做法是找到占用它的进程,重启服务或让进程重新打开日志文件;直接删正在写的大日志,空间通常不会回来。

更稳妥的做法是清空而不是删除:

: > /var/log/app/app.log

echo -n 也行。清空保留了文件句柄,进程继续往同一个文件里写,空间立刻释放,服务不用重启。删日志之前,先确认日志轮转(logrotate)配好了,否则下次还会满。

三个常见坑

坑一:只删 /var/log,不管 Docker。 Docker 镜像、容器日志、匿名卷经常悄悄吃掉几十 GB。docker system df 看一眼,再用 docker system prune 清理,注意 prune 会删停掉的容器,生产环境先确认。

坑二:定时任务里写 rm -rf。 删错路径就是事故。清理脚本里先 ls、先 dry-run,路径用变量拼出来之前先 echo 打印一遍。

坑三:扩容了磁盘却没扩文件系统。 云服务器扩盘后要 resize2fs(ext4)或 xfs_growfs(xfs),只扩盘不扩文件系统,df 还是满的。

结语

磁盘满了的标准动作就三步:df 定分区、du 找目录、lsof 确认占用再清。先定位再动手,删之前问一句“这个文件谁在用”,比事后恢复数据便宜得多。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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