“No space left on device”实为inode耗尽而非磁盘空间不足;df -i可确认IUse%达100%,需用du --inodes定位高inode目录并清理残留文件或重启占用进程。

磁盘空间明明还有几十GB,却突然报“No space left on device”,新建文件、写日志、甚至MySQL插入都失败——这不是磁盘满了,而是inode耗尽。df -i 就是专治这种“假性空间不足”的核心命令。
为什么 df -i 才是定位 inode 问题的第一步
df -h 只看数据块(实际内容存储),而 df -i 看的是索引节点(每个文件一个,存权限、时间、位置等元数据)。当小文件数量极大(如日志碎片、缓存、临时文件),inode 很快用光,但数据块还剩很多。此时 df -h 显示“50% 使用”,df -i 却可能显示“100% IUse%”——这就是故障根源。
执行以下命令快速筛查:
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- df -i:查看所有挂载点的 inode 使用率,重点关注 IUse% 列
- df -i / 或 df -i /var/lib/mysql:针对具体挂载点精准排查
- 若某行 IUse% 达到 95% 以上,尤其接近 100%,且对应 Use%(空间使用率)远低于该值,即可确认为 inode 瓶颈
用 df -i 定位高 inode 占用目录
确认 inode 耗尽后,下一步是找出“谁在疯狂吃 inode”。不能靠猜,要用 find + wc 配合层级扫描:
- 查根下一级目录的文件总数:
for i in /*; do echo "$i:"; find "$i" | wc -l; done | sort -k2 -nr - 进入嫌疑目录(如 /var/log、/tmp、/data/cache)继续下钻:
for i in /var/log/*; do echo "$i:"; find "$i" | wc -l; done | sort -k2 -nr - 常见高 inode 目录:
• Nginx/Apache 的 access.log.* 和 error.log.*(未轮转)
• MySQL 的 binlog、slow log、临时表文件
• 应用生成的 session、cache、upload 临时子目录(每个小文件占一个 inode)
安全清理与应急释放 inode
找到目标目录后,清理要兼顾效果与安全:
- 优先轮转或清空日志:
logrotate -f /etc/logrotate.d/myapp 或 truncate -s 0 /var/log/app/*.log - 删除确定无用的小文件集合:
find /tmp/session -name "*.sess" -mtime +7 -delete - 大批量文件删除防报错(Argument list too long):
find /data/cache -type f -name "*.tmp" -print0 | xargs -0 rm -f - 慎用 rm -rf 整目录;如必须,先 tar 打包备份再删:
tar -cf /tmp/cache_backup.tar /data/cache && rm -rf /data/cache
长期预防:从格式化到监控闭环
只救火不行,得防复发。关键在三件事:
-
新建文件系统时预留足够 inode:
ext4 下用 mkfs.ext4 -i 4096 /dev/sdb1(每 4KB 一个 inode,比默认 16KB 提升约 4 倍总量)
XFS 下用 mkfs.xfs -i maxpct=30 /dev/sdb1(提升 inode 区占比) -
加入监控告警:
Zabbix 或 Prometheus 中配置规则,当 df -i | awk '$5 ~ /%/ {sub(/%/,"",$5); if($5 > 90) print $1}' 有输出即触发通知 -
强制日志轮转与清理策略:
在 logrotate 配置中加 maxsize 100M 和 rotate 10,避免单个日志无限膨胀

















