df 显示还有空间,文件却写不进去:Linux 磁盘排查三板斧
新手运维最容易懵的一刻:往服务器传文件,系统报 “No space left on device”,可 df -h 一看,磁盘明明还有几十个 G。这时候别急着删文件,先搞清楚 Linux 的磁盘空间到底是怎么算的。
第一板斧:看 inode。Linux 里每个文件除了占数据块,还要占一个 inode(索引节点)来记录元信息。df -h 看的是数据块,df -i 看的是 inode。用 df -i 如果看到某分区 IUse% 到了 100%,那就是 inode 耗尽——典型场景是某个目录下堆了几百万个小文件,比如没轮转的日志碎片、PHP session 目录、邮件队列。删几个大文件没用,得找到小文件堆积的目录:for d in /*; do echo $d; find $d -xdev -type f | wc -l; done 按目录数文件,揪出元凶后再针对性清理。
第二板斧:查"已删除但还在占用"的文件。Linux 里一个文件被 rm 删掉文件名,但如果还有进程拿着它的句柄,磁盘空间不会释放。日志文件最常见:rm /var/log/app.log 之后,写日志的进程还在往旧句柄里写,df 显示的空间纹丝不动。用 lsof | grep deleted 就能看到这些"幽灵文件",以及它们各自占了多少。正确姿势是不要直接 rm 正在被写的日志,要么 echo > /var/log/app.log 截断,要么先停服务再删、重启服务。顺手配上 logrotate 做轮转,才是长久之计。
第三板斧:确认"空间"到底被谁吃了。du -sh /* 从根目录一级级往下钻,找到最大的目录;如果 du 统计的已用和 df 显示的已用差很多,差值大概率就是第二斧说的 deleted 文件,或者是挂载点"盖住"了旧数据——比如 /data 本来有文件,后来又在 /data 上挂了一个新盘,旧文件被盖在挂载点下面,du 看不见、df 照算。卸载挂载点检查一下就能确认。
三板斧走完,99% 的"假满盘"都能定位。记住顺序:先 df -i 看 inode,再 lsof | grep deleted 找幽灵文件,最后 du 钻目录。比上来就删文件靠谱得多,也少一次半夜被报警叫醒的锅。
- 点赞
- 收藏
- 关注作者
评论(0)