0%

磁盘满了,删了文件空间却不回来

df 说分区已经 100%,du 把目录加起来却少了一截。常见原因是文件已经从目录里删掉,进程还开着它。空间要等最后一个句柄关掉才还回来。

先确认是空间满了,不是 inode 用尽:

1
2
df -hT /
df -ih /

IUse% 到 100%、空间还剩不少,是小文件太多,和这篇不是一回事。下面只处理空间满、删了大文件却没释放的情况。

du 不要跨到别的磁盘:

1
sudo du -xh --max-depth=1 / | sort -h

加出来明显小于 df 里的已用空间时,查还被打开的已删除文件:

1
sudo lsof +L1

+L1 表示链接数小于 1,也就是目录项已经没了。输出里 NAME 以 (deleted) 结尾的就是。看 PID 和 COMMAND,以及 SIZE/OFF。数值大的那个句柄就是还占着空间的文件。

空间会在这个进程关掉文件或退出时释放。对应的是 systemd 服务时,重启那个单元:

1
sudo systemctl restart 单元名.service

数据库、消息队列这类进程,重启前按它自己的方式停,不要为了腾磁盘直接 kill -9。重启之后再跑一次 df -h,已用空间应下来。

同一条 lsof 里如果是 Docker 的 json 日志,按 容器日志写满磁盘 截断那个还在的文件。文件还在目录里时,lsof +L1 不会列出它,du 也能看到。