Linux 服务器磁盘明明没满,却怎么都写不进文件,一查是 inode 耗尽,这种看不见的占满怎么排查清理?

直接给结论:磁盘有两个口径的「满」,一个是块空间(df -h 看到的),一个是 inode(文件数量配额,df -i 看)。块空间还有余量但写不进文件,基本就是 inode 耗尽——海量小文件把文件数量的名额用光了。这类占满在 df -h 里完全隐形,必须换口径看。

两步确认

df -h          # 块空间,可能只用了三四成
df -i          # inode 名额,IUse% 已到顶

两行命令一对比就定案。inode 在格式化时按容量比例分配,存储大量几 KB 的小文件(会话文件、邮件队列、缓存碎片、缩略图)时,空间没吃多少,名额先耗光。

顺带补一句原理:inode 总量在格式化那一刻就定了,和块空间一样是「库存」,只是日常工具很少显示它。常见文件系统上每十几 KB 空间大约对应一个名额,常规业务够用,遇到天生小文件的场景(物联网数据落库、代码仓库、邮件归档)就可能提前耗尽。看到 inode 使用率的增速明显快于块空间增速,就是预警信号,别等写不进才反应。

定位小文件藏在哪

找到 inode 用满的分区挂载点后,逐层数文件数量:

cd /挂载点
for d in */ .*/; do echo "$(find "$d" -xdev 2>/dev/null | wc -l) $d"; done | sort -rn | head

数字最大的目录继续往里走,两三层就能锁定源头。常见的几个窝点:应用的 session 目录(网站会话文件按毫秒堆积)、邮件系统的队列目录、crontab 输出没重定向堆积的邮件、程序异常狂生成的临时碎片、容器运行时留下的悬空层和没清理的构建缓存,数据库临时表与 Web 上传缓存也时不时榜上有名。

清理手法

确认目录性质后按时间清,别一上来全删:

find /源头目录 -type f -mtime +7 -delete

先删一周前的,观察 inode 余量恢复情况,再决定是否收紧时间。数量太大时 find 直接删会拖垮 IO,可以分批配合 xargs 处理。清理前务必确认这些文件真的可弃——session 文件删了只是用户重新登录,邮件队列删了就是真丢信,性质不同,下手轻重不同。

治本与预防

清理只是还账,堵源头才算完:应用侧把 session 存到缓存服务而不是本地磁盘;crontab 任务输出统一重定向到日志文件并做轮转;程序日志按天切割压缩。若是业务本身就是海量小文件场景,格式化时调整 inode 密度参数,或把这类应用挪去名额更宽裕的分区、换用对小文件更友好的存储方案——反复在同一种病上花时间的分区,值得动一次结构。巡检清单里把 df -i 和 df -h 并排放进去,让这类隐形占满在监控里现形,而不是等业务写不进文件才被发现。

贵州诚鑫致达科技做贵阳 IT 外包运维这些年,早已把 inode 余量纳入服务器例行体检项,这种看不见的占满交给固定巡检动作处理,比出了事再翻手册从容得多。

企业存储选型参考|贵州诚鑫致达

做核心业务 SAN 存储与高可靠应用,群晖机型参考:UC3400 · UC3200 · SA3600。需要选型建议或上门评估,搜「诚鑫致达」即可找到我们。

服务区域|贵州诚鑫致达

贵州群晖NAS、贵阳存储、数据备份、信创云盘或 IT 集成服务,可联系贵州诚鑫致达科技,服务范围覆盖贵州全省各市州。四川成都群晖存储部署、机房建设与数据安全集成服务。