Linux 磁盘还有空间却写不进文件:inode 耗尽的排查与处置
现象:df 还有空间,写入却报 No space left on device
值班时经常遇到这种矛盾:df -h 显示根分区还剩几 GB,但 touch 新文件、应用写日志直接报 No space left on device。块空间充足、权限也正常,这时应优先怀疑 inode 用尽——每个文件、目录甚至一些特殊文件都占用一个 inode,文件数量先触顶时,剩余块再多也建不出新文件。
第一步:用 df -i 确认是不是 inode 问题
df -i
df -i /var
关注 IUse% 列。如果接近 100%,而 df -h 的 Use% 还很宽裕,基本可以确诊。只查某一目录对应的挂载点更快,避免被一堆 tmpfs 干扰。
第二步:定位哪个目录的文件最多
du --inodes -x --max-depth=1 /var | sort -n
find /var -xdev -type f | wc -l
du --inodes 按目录统计 inode 数,比 du -sh 更适合找小文件海。-xdev 保证不跨挂载点,否则会把别的分区算进来。常见高发位置包括邮件的 /var/spool/postfix、容器运行时的 /var/lib/docker/overlay2、应用按会话写的小文件和长期未清理的临时目录。
第三步:确认哪些文件可以删
lsof +L1 | head -50
+L1 列出已被删除但仍被进程占用的文件。这类文件会同时占着 inode 和块,只有重启或让进程关闭句柄才真正释放。清理前先判断来源:过期缓存、按天分桶的旧日志、失效会话可以删;数据库文件、运行中服务的数据目录不要动。
第四步:清理与验证
find /var/cache/myapp -type f -mtime +7 -delete
df -i
删除后重新看 IUse%,再让应用重试写入。ext4 的 inode 数量在格式化时固定,事后不能直接扩;xfs 动态分配 inode,通常不会遇到固定上限。若预估文件数长期偏大,应在建分区时调高 inode 数量,或把海量小文件迁到对象存储。
预防:把 inode 纳入日常监控
只监控磁盘使用率不够,IUse% 同样要设阈值告警;缓存目录配置定期清理,日志用 logrotate 设置 maxage;避免在单一目录堆放百万级文件,按日期或哈希分桶,删除和统计都会轻松很多。
- 点赞
- 收藏
- 关注作者
评论(0)