答案是:Linux inode耗尽时需用df -i确认IUse%≥95%或100%,再通过du --inodes或find逐级定位/var等高占用目录,最后安全清理小文件并建立日志轮转、定时清理等长效防护机制。
Linux 目录结构清理不能只看磁盘空间,更要盯住 inode。当 df -i 显示某个挂载点 IUse% 接近或达到 100%,哪怕 df -h 还剩大量空间,系统也会拒绝新建文件、写日志、甚至启动新进程。根本原因不是“没地方放数据”,而是“没索引卡登记新文件”。清理的关键,是精准定位并安全移除那些不被业务依赖的海量小文件。
先别急着删,先验证问题根源:
df -i,重点看根分区(/)和其他关键挂载点(如 /var、/home)的 IUse%。超过 90% 就该介入,100% 表示已完全阻塞。df -h 输出:如果磁盘使用率远低于 inode 使用率(比如 40% vs 98%),基本可锁定为 inode 耗尽。/dev/shm 和 /run 这类 tmpfs 文件系统,它们的 inode 是动态分配的,极少成为瓶颈,但若异常进程在内存中疯狂创建 socket 或临时文件,也需排查。盲目遍历整个系统效率低且风险高。推荐分层、聚焦的排查方式:
sudo du --inodes -s /var/* 2>/dev/null | sort -n —— 快速列出 /var 下各子目录的 inode 占用排序,/var/log、/var/spool、/var/cache 往往排在前列。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@ %pn' | sort -n | head -20 查最老的文件,判断是否可批量清理。删除操作本身简单,但误删正在被进程打开的文件、PID 文件、锁文件或配置模板,会直接导致服务中断。务必按顺序执行:
lsof +D /path/to/dir 或 lsof /path/to/file。如果输出显示 deleted 字样,说明文件已被删但句柄未释放,需重启对应服务。rm -rf /var/spool/postfix/maildrop。先 ls -la /var/spool/postfix/maildrop 看文件名规律和时间戳,确认是 cron 邮件队列残留而非待发邮件;查 postconf -d | grep queue 确认当前队列路径是否一致。rm * 导致参数过长报错或误删隐藏文件。推荐:find /var/log/nginx -name "*.log" -mtime +7 -print0 | xargs -0 rm -ffind /tmp -type f -mmin +1440 -delete(删 24 小时前的临时文件)清理只是救火,建立机制才能治本:
/etc/logrotate.d/ 下服务配置,确保每项含 maxage(如 30 天)、rotate(保留份数)和 create(轮转后重建权限)。对 systemd 日志,定期运行 journalctl --vacuum-size=100M。/etc/cron.daily/ 下建脚本,用 find /tmp -type f -mmin +1440 -delete 和 find /var/tmp -type f -mtime +7 -delete。/var/spool/postfix 单独挂载),避免殃及根分区。