inode耗尽是“no space left on device”的常见真因:运行df -i确认iuse%≥95%(尤其/var、/tmp等挂载点),再用du --inodes -s /var/* | sort -n定位小文件堆积目录,最后安全清理日志、孤儿包和残留句柄。

Linux 文件系统 inode 耗尽或磁盘空间爆满,常表现为 No space left on device,即使 df -h 显示还有空间。真正瓶颈往往不是数据块(block),而是 inode——每个文件、目录、符号链接都独占一个 inode。当大量小文件堆积(如日志、邮件队列、会话缓存、卸载残留配置),inode 很快被占满。清理必须分两步:先精准定位,再安全释放,不能盲目 rm -rf。
确认是不是 inode 真的满了
别跳过这一步,误判会导致错误操作:
- 运行
df -i,重点看根分区/和/var、/tmp等挂载点的IUse%。≥95% 就需干预,100% 表示已完全阻塞。 - 对比
df -h:若磁盘使用率远低于 inode 使用率(例如 35% vs 99%),基本可锁定为 inode 耗尽。 - 注意
/dev/shm、/run是内存文件系统,inode 动态分配,极少成为主因;但若发现异常高占用,需排查是否进程在疯狂创建 socket 或临时文件。
逐层定位 inode 消耗大户
从风险最高区域切入,避免全盘扫描:
- 快速筛查
/var:运行sudo du --inodes -s /var/* 2>/dev/null | sort -n,重点关注/var/log、/var/spool、/var/cache、/var/lib/dpkg/info。 - 向下钻取:对高占用子目录继续细分,例如
sudo du --inodes -s /var/log/* 2>/dev/null | sort -n,看是journal、nginx还是audit在撑爆 inode。 - 查海量小文件:对可疑路径执行
find /path -xdev -type f | wc -l。若数量超 50 万,再用find /path -xdev -type f -printf '%T@ %p\n' | sort -n | head -20查最老文件,辅助判断是否可批量清理。
安全清理孤儿 inode 和残留文件
清理的核心是“不伤服务、不丢配置、不误删”:
-
清已卸载但配置残留的包:执行
dpkg -l | grep '^rc' | awk '{print $2}' | xargs -r sudo dpkg -P,彻底清除标记为rc(removed, config remains)的孤儿配置,这是释放大量小文件 inode 的关键一步。 -
删日志与临时文件:用
find /var/log -name "*.log" -mtime +7 -delete清理旧日志;对 journald,用journalctl --vacuum-time=7d;对/tmp,用find /tmp -type f -mtime +7 -delete。 -
处理孤儿文件句柄:运行
lsof +L1或find /proc/[0-9]*/fd -lname "* (deleted)" 2>/dev/null找出已被删除但仍被打开的文件。关联到filebeat、rsyslog等日志进程后,优先用systemctl restart filebeat优雅重启释放,而非直接 kill。 -
清理 /etc 下碎片:执行
sudo find /etc -maxdepth 2 -type d -empty -delete清空浅层空目录;再运行sudo find /etc \( -name "*.bak" -o -name "*.old" -o -name "*-dist" \) -delete,清理常见备份后缀文件(操作前建议先find /etc -name "*.bak" | head -5抽样确认)。
长效防护机制
清理只是治标,建立防护才能避免反复爆发:
- 为日志启用轮转:确保
/etc/logrotate.conf及其包含的规则中设置了rotate、maxage和maxsize。 - 限制容器日志:Docker 启动时加
--log-opt max-size=10m --log-opt max-file=3,或全局配置/etc/docker/daemon.json。 - 禁用无意义邮件:在
crontab -e开头添加MAILTO="",保存后sudo systemctl restart cron,防止/var/spool/mail或/var/spool/postfix/maildrop积压。 - 定期检查:将
df -i和du --inodes -s /var/* 2>/dev/null | sort -n | tail -5加入监控脚本,阈值告警。











