Linux 服务器磁盘 inode 耗尽:还有空间却写不进文件
线上偶发「磁盘还有几十 GB,touch 却报 No space left on device」。这时先别急着扩容,很大概率是 inode 用完了,而不是块空间不够。把 inode 和块空间当成两套容量来看,排查会快很多。
现象怎么认
典型表现有三类:写文件失败返回 ENOSPC;新建临时文件、日志轮转失败;包管理器或容器层报无法创建文件。用 df -h 看着还有空间,但 df -i 里 Use% 已经到 100%。
建议每次先同时看两行:
df -h /
df -i /
如果块使用率不高、inode 使用率接近满,就按 inode 排查,不要先去加盘或删大文件。只删几个大文件往往降不了 inode,因为 inode 吃的是「文件个数」。
为什么 inode 会耗尽
每个普通文件、目录、符号链接都要占一个 inode。当业务产生海量小文件时,块空间还剩很多,inode 会先见底。ext4 等文件系统在创建分区时就基本固定了 inode 数量,事后很难「只加 inode 不加盘」,所以预防和清理比临时扩容更重要。
定位是谁占了 inode
不要一上来在根目录盲目 find,先缩小到可疑挂载点。可以按目录统计文件数:
sudo find /var -xdev -type f 2>/dev/null | cut -d/ -f1-3 | sort | uniq -c | sort -rn | head
sudo du --inodes -d 1 /var 2>/dev/null | sort -rn | head
安全清理顺序
先动明确可重建的:临时目录、过期会话、缓存。日志优先压缩或截断,不要直接删仍被进程打开的活跃日志而不通知服务。容器环境再清理悬空层与构建缓存。每清理一批就重跑 df -i,并抽测 touch 是否恢复。
治本做法
给高基数目录设应用侧上限或定期归档;用 logrotate 按大小和时间切割并限制保留份数;监控同时采集 df -h 与 df -i,inode 使用率超过 80% 告警;新建小文件密集分区时提高 inode 比例;能用对象存储或集中日志的,不要把海量小文件堆在系统盘。
小结
「还有空间却写不进」优先查 df -i。用按目录的文件数统计定位元凶,按可重建程度清理,再补监控与轮转。把 inode 当成和块空间同等重要的容量指标,这类故障会少很多。
- 点赞
- 收藏
- 关注作者
评论(0)