答案是inode耗尽:df -h显示磁盘空间充足但“no space left on device”,本质是索引节点资源枯竭;需用df -i确认iuse%=100%,再定位/var/log/journal等高inode目录清理小文件。

当 inode 耗尽时,系统报“No space left on device”,但 df -h 显示磁盘仍有大量空闲空间——这说明问题不在数据块,而在索引节点资源枯竭。恢复写入能力的关键是立即释放已占用的 inode,而非清理大文件。以下是直接有效的操作路径:
快速定位并清理高 inode 占用目录
先确认哪个挂载点 inode 已满:
- 运行
df -i,找出 IUse% = 100% 的分区(如/var、/tmp或/) - 对高危目录逐个统计文件数量:
find /var/log -type f | wc -lfind /tmp -type f | wc -lfind /var/cache -type f | wc -l - 重点排查:
•/var/log/journal(systemd-journald 日志,常堆积百万级小文件)
•/var/spool/postfix/maildrop(邮件队列)
•/tmp和/var/tmp下残留的临时文件
• Docker 容器日志(/var/lib/docker/containers/*/logs)
安全删除无用小文件的常用命令
避免误删正在使用的文件,优先用 -mmin 或 -name 加限定:
根据 package.json 中的 engines 字段自动检测 Node.js 版本需求,未安装 nvm 时自动安装并切换至对应版本。支持 Windows、macOS、Linux。适用于 Node.js 项目开发、版本切换和环境配置。
- 清空过期 journal 日志(保留最近 3 天):
journalctl --vacuum-time=3d - 删除
/tmp下 7 天未访问的普通文件:find /tmp -type f -atime +7 -delete - 批量清理 0 字节文件(常见于异常中断后残留):
find /var/log -type f -size 0 -delete - 按扩展名清理缓存:
find /var/cache -name "*.tmp" -o -name "*.cache" -delete
验证恢复与临时规避措施
每执行一轮清理后,立刻验证:
- 运行
df -i确认 IFree > 0 且 IUse% 下降 - 测试写入:
touch /tmp/test_inode_ok && rm /tmp/test_inode_ok - 若仍失败,检查是否有进程持续创建文件(
lsof +D /path查看哪些程序在往热点目录写) - 紧急情况下可重启相关服务(如 rsyslog、docker)以释放被打开但已删除的 inode(即“unlinked but held”状态)
长期预防:调整文件系统或优化策略
仅靠清理治标不治本。需根据场景选择加固方式:
- 新部署磁盘时,格式化指定更高 inode 密度:
mkfs.ext4 -T small /dev/sdX1(适合海量小文件)
或手动指定总数:mkfs.ext4 -N 20000000 /dev/sdX1 - 对现有生产分区,无法在线扩容 inode;但可通过迁移+重建实现(需停机或切换流量)
- 配置日志轮转(logrotate)限制单个日志文件数和总保留量
- 为临时目录挂载 tmpfs(内存虚拟文件系统),避免 inode 污染主磁盘:
mount -t tmpfs -o size=512M tmpfs /tmp










