“no space left on device”实为inode耗尽,需用df -i确认iuse%达100%,再定位/var、/data等高占用目录清理小文件;df -h仅显示磁盘块使用率,二者须配合排查。

当挂载点显示磁盘空间(df -h)还有大量剩余,但系统却提示“No space left on device”,而 df -i 显示 Inode 使用率已达 100%,这就是典型的“小文件过多导致 Inode 耗尽”软故障。此时 df -h 本身不直接显示 Inode 信息,但它和 df -i 配合使用,是定位问题的第一步。
用 df -h 快速识别“空间有余但写入失败”的矛盾现象
df -h 展示的是块(block)级别的磁盘使用情况,单位是 GiB/GB。如果它显示某挂载点(如 /data)还有 40% 空间,但你无法创建新文件、日志报错“No space left on device”,就说明问题大概率不在磁盘容量,而在 Inode 资源。这是触发进一步检查 df -i 的关键信号。
- 执行
df -h /data,确认空间未满(例如Use% = 62%) - 同步执行
df -i /data,重点看IUse%列 —— 若为100%或接近(如99%),即锁定 Inode 耗尽 - 注意:某些旧版系统或容器环境可能默认不显示
IUse%,可加-T参数辅助判断文件系统类型(如 ext4 默认 Inode 数固定,xfs 动态分配但仍有上限)
定位高 Inode 占用目录:从根往下逐层筛查
Inode 是按目录分配的,一个空文件也占用一个 Inode。小文件密集的目录(如日志缓存、临时上传、微服务临时目录)最可疑。配合 df -h 确认挂载点后,用以下命令逐级下钻:
特色介绍: 1、ASP+XML+XSLT开发,代码、界面、样式全分离,可快速开发 2、支持语言包,支持多模板,ASP文件中无任何HTML or 中文 3、无限级分类,无限级菜单,自由排序 4、自定义版头(用于不规则页面) 5、自动查找无用的上传文件与空目录,并有回收站,可删除、还原、永久删除 6、增强的Cache管理,可单独管理单个Cache 7、以内存和XML做为Cache,兼顾性能与消耗 8、
- 先查挂载点顶层目录的子目录 Inode 占用:
find /data -maxdepth 1 -type d | xargs -I{} sh -c 'echo {}; find {} -maxdepth 1 -type f | wc -l' | sort -k2 -nr | head -10 - 更高效方式(推荐):
du --inodes -s /data/*/ | sort -k1 -nr | head -10(--inodes统计子目录内文件数量,近似 Inode 消耗量) - 常见重灾区:
/data/logs/(未轮转的 debug 日志)、/data/tmp/(应用未清理的临时文件)、/data/cache/(如 yum/apt 缓存、Node.jsnode_modules解压残留)
清理与预防:删文件 ≠ 释放 Inode,要理解“硬链接”和“rm”的行为
删除文件后 Inode 不立即释放?通常是因为文件仍被进程打开(lsof 可查)。另外,rm 命令只是解除链接,真正释放需所有引用消失。
- 查被进程占用的已删除文件:
lsof +L1 /data(显示 link count=0 但仍在使用的文件) - 安全清理建议:
• 优先清空日志:truncate -s 0 /data/logs/app.log(比rm + touch更稳妥)
• 批量删除小文件:find /data/tmp -name "*.tmp" -mtime +7 -delete(避免rm -rf误伤)
• 清理 yum 缓存:yum clean all && rm -rf /var/cache/yum(注意路径是否挂载到 /data) - 长期预防:
• 设置日志轮转(logrotate)并启用maxsize和rotate
• 应用层限制上传/缓存单目录文件数(如 Nginxclient_max_body_size、Redismaxmemory-policy)
• 新建文件系统时预留足够 Inode:mke2fs -i 8192 /dev/sdb1(每 8192 字节配 1 个 Inode,小文件多时调小该值)
验证修复效果:df -h 和 df -i 必须一起看
清理后不能只看 df -h 空间变化——Inode 是否释放,必须靠 df -i 确认。有时清理了文件但 Inode 未降,说明有进程仍 hold 着句柄,需重启对应服务或 kill 进程。
- 执行:
df -h /data && df -i /data(合并查看,对比前后 IUse%) - 若
IUse%未下降,再跑一次lsof +L1 /data,找到 PID 后:kill -HUP $PID(优雅重启)或kill -9 $PID(强制) - 验证写入能力:
touch /data/test_inode_ok && echo "OK" || echo "Still blocked"










