文件写不进去,先别怪磁盘满:查查 inode 和只读挂载
部署或跑脚本时遇到过这种报错吗:No space left on device,可 df -h 一看,磁盘明明还剩一半。别急着删文件,先把下面几处查清楚,十有八九不是容量的问题。
第一种:inode 用完了
文件系统能放多少个文件,不只看总容量,还看 inode 总数,每个文件、目录都要占一个 inode。小文件特别多的场景——日志按秒切分、缓存目录、邮件队列、一次解压出来几万个小文件的包——很容易把 inode 吃光,空间却还剩很多。
查的方法:
df -i
看 IUse% 那一列,如果到了 100%,就是它了。再用下面的命令找出哪个目录小文件最多:
du --inodes -d 2 /var 2>/dev/null | sort -nr | head
定位到目录后,该归档的归档、该清理的清理。预防上,日志要配好轮转和保留天数,别让它无限切分下去。
第二种:文件系统被只读重挂载
磁盘出现坏块、控制器报错时,内核为了保护数据,可能把文件系统以只读方式重新挂载。这时候写文件会报 Read-only file system,而 df -h 看起来一切正常。
排查:
mount | grep ' / '
dmesg | grep -i error | tail
如果根分区挂载参数里带 ro,或者 dmesg 里刷出 I/O error,先处理硬盘或云盘层面的问题,再考虑用 mount -o remount,rw / 恢复写。数据重要的话,先备份再动手。
第三种:删掉的文件还被进程占着
日志文件用 rm 删掉了,但写它的进程还握着文件句柄,空间不会释放,于是 df 说满、du 却怎么都对不上。用下面这条能找到这类"已删除但未释放"的文件:
lsof | grep deleted
找到后,重启或者 reload 对应进程,空间就回收了。
小结
写不进去的时候按这个顺序查:df -h 看容量,df -i 看 inode,mount 和 dmesg 看是不是只读,lsof 看已删未释放。先分清是哪一类问题,再对症处理,比一上来就删文件快得多。
- 点赞
- 收藏
- 关注作者
评论(0)