Linux 目录结构清理:依据 inode 的文件清理策略

作者:袖梨 2026-07-08
答案是:Linux inode耗尽时需用df -i确认IUse%≥95%或100%,再通过du --inodes或find逐级定位/var等高占用目录,最后安全清理小文件并建立日志轮转、定时清理等长效防护机制。

Linux 目录结构清理不能只看磁盘空间,更要盯住 inode。当 df -i 显示某个挂载点 IUse% 接近或达到 100%,哪怕 df -h 还剩大量空间,系统也会拒绝新建文件、写日志、甚至启动新进程。根本原因不是“没地方放数据”,而是“没索引卡登记新文件”。清理的关键,是精准定位并安全移除那些不被业务依赖的海量小文件。

快速诊断:确认是不是 inode 真的满了

先别急着删,先验证问题根源:

  • 运行 df -i,重点看根分区(/)和其他关键挂载点(如 /var/home)的 IUse%。超过 90% 就该介入,100% 表示已完全阻塞。
  • 对比 df -h 输出:如果磁盘使用率远低于 inode 使用率(比如 40% vs 98%),基本可锁定为 inode 耗尽。
  • 注意 /dev/shm/run 这类 tmpfs 文件系统,它们的 inode 是动态分配的,极少成为瓶颈,但若异常进程在内存中疯狂创建 socket 或临时文件,也需排查。

精准定位:找到真正吃掉 inode 的目录

盲目遍历整个系统效率低且风险高。推荐分层、聚焦的排查方式:

  • 从高频风险区入手: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,看是 journalnginx 还是 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/dirlsof /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 -f
    find /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 -deletefind /var/tmp -type f -mtime +7 -delete
  • 关键服务单独分区:对 postfix、squid、监控 agent 等易产小文件的服务,将其 spool 或 cache 目录挂载到独立的小分区(如 /var/spool/postfix 单独挂载),避免殃及根分区。

相关文章

精彩推荐