文件写不进去,先别怪磁盘满:查查 inode 和只读挂载

举报
yd_272823509 发表于 2026/11/10 10:08:43 2026/11/10
【摘要】 部署或跑脚本时遇到过这种报错吗:No space left on device,可 df -h 一看,磁盘明明还剩一半。别急着删文件,先把下面几处查清楚,十有八九不是容量的问题。 第一种:inode 用完了文件系统能放多少个文件,不只看总容量,还看 inode 总数,每个文件、目录都要占一个 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 看已删未释放。先分清是哪一类问题,再对症处理,比一上来就删文件快得多。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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