inode耗尽是导致日志服务静默失联的常见原因,需用df -i确认、find统计高占用目录、journalctl或logrotate清理,并用lsof +L1释放被占用的已删文件inode。

遇到系统服务无法记录日志,同时报“No space left on device”,但 df -h 显示磁盘空间充足——这基本就是 inode 耗尽的典型信号。日志服务(如 rsyslog、journald、Nginx、Java 应用)依赖持续创建新文件或追加写入,一旦 inode 用光,连一个空日志行都写不进去,服务就“静默失联”。
第一步:确认是不是 inode 耗尽
别猜,直接验证:
- 运行 df -i,重点看根分区(/)以及日志所在挂载点(如 /var、/var/log)的 IUse% 列;
- 只要任意挂载点显示 100%,哪怕只差 1 个 inode,新建文件操作就会失败;
- 注意:/var/log 很可能是独立挂载点,它的 inode 池和 / 是分开的,必须单独检查。
第二步:定位高 inode 占用目录
从日志相关路径开始查起,效率最高:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 统计 /var/log 下各子目录的文件数:
find /var/log -maxdepth 1 -type d | while read d; do echo "$(find "$d" -type f 2>/dev/null | wc -l) $d"; done | sort -nr | head -5 - 常见“重灾区”:
• /var/log/journal(systemd-journald 日志,尤其未配置轮转时)
• /var/log/nginx 或 /var/log/apache2(访问日志每秒生成多个小文件)
• /var/log/audit(审计日志密集写入)
• /var/log/containers(Kubernetes 或 Docker 环境下每个容器日志都是独立小文件)
第三步:清理 + 释放 + 验证
清理后未必立刻恢复,因为已删除但被进程打开的文件仍占 inode:
- 先清日志:
• 用 journalctl --vacuum-size=100M 清理 journald
• 删除过期的 *.gz、*.1 日志包,或用 logrotate -f /etc/logrotate.conf 强制轮转 - 再查残留占用:
运行 lsof +L1,找出状态为 DEL 的文件(即已删但进程仍在写);
常见于:rsyslog 进程没重载、Java 应用未重启、nginx -s reload 未生效 - 最后验证:
执行 touch /var/log/test-ok,成功即说明 inode 已释放;
再检查对应服务日志是否开始滚动写入(如 tail -f /var/log/syslog)
不复杂但容易忽略:inode 耗尽不是“空间不够”,而是“户口本发完了”。盯住 df -i,顺藤摸到 /var/log,再用 lsof +L1 找出那个不肯放手的老进程——问题就解了一大半。

















