Linux 磁盘满了别急着删:df、du 三步定位空间去向
服务器报磁盘空间不足,第一反应往往是到处删日志。删错了可能把正在写的日志文件删成“幽灵文件”——空间不释放、服务还报错。先定位,再动手。
第一步: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 确认占用再清。先定位再动手,删之前问一句“这个文件谁在用”,比事后恢复数据便宜得多。
- 点赞
- 收藏
- 关注作者
评论(0)