# 宝塔面板 Inode 可用空间不足问题排查 > 宝塔面板(BT Panel)提示 Inode 可用不足 10%,导致无法创建新文件的原因分析与清理方案,含小文件查找、日志清理、临时文件清理等完整步骤。 # Inode 可用空间不足 ## 问题现象 在宝塔面板首页磁盘信息区域,看到如下提示: > Inode可用不足10%,请前往文件管理清理不必要文件 ![宝塔面板 Inode 占用 91% 告警](https://docs.bt.cn/img/faq/inode-full.png) 此时尽管磁盘容量(如上图仅用了 16%)仍有大量剩余,但服务器却无法创建新文件、无法写入日志,网站也可能出现 500 错误或 "No space left on device" 报错。 :::info 如有疑问,欢迎扫码联系客服 ![联系客服](https://docs.bt.cn/img/faq/cs-qrcode.png) ::: --- ## 什么是 Inode? **Inode(索引节点,Index Node)** 是 Linux 文件系统中的一种数据结构,用来存储文件的元数据,例如: - 文件大小 - 文件所有者和权限 - 创建/修改/访问时间 - 文件数据块在磁盘上的位置指针 每一个文件或目录都会**独占一个 Inode**。文件系统在格式化时,会根据分区大小预先分配固定数量的 Inode,这个数量上限在创建文件系统时就已确定,**之后无法扩容**(XFS 除外,但扩容也很麻烦)。 你可以把 Inode 理解为图书馆的**书目索引卡**: - 磁盘空间 = 书库的物理空间 - Inode = 书目索引卡的数量 即使书库还有很多空位,一旦索引卡用完,就无法再登记新书入库——哪怕每本"书"只有几字节大小。 --- ## 为什么 Inode 会耗尽? 常见原因: | 原因 | 说明 | |------|------| | 大量小文件 | Session 文件、缓存碎片、日志分片等,每个文件占一个 Inode | | PHP Session 堆积 | 默认存储在 `/tmp` 目录,过期未清理时会积累数十万个文件 | | 邮件队列堆积 | Sendmail/Postfix 的队列目录下每封邮件都是独立文件 | | 容器/Docker 残留层 | Docker 镜像层解压后会产生大量小文件 | | npm / Composer 缓存 | `node_modules` 和依赖包包含海量小文件 | | 系统日志轮转残留 | `/var/log` 下未清理的历史日志文件 | --- ## 如何确认 Inode 使用情况 通过 SSH 登录服务器,执行: ```bash df -i ``` 输出示例: ``` Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda2 4980736 4531208 449528 91% / tmpfs 503974 651 503323 1% /dev/shm ``` `IUse%` 达到 90% 以上即需要关注,达到 100% 则完全无法创建新文件。 --- ## 找出占用 Inode 最多的目录 执行以下命令,统计各目录下的文件数量(从根目录开始,只看第一层,耗时较短): ```bash for dir in /*; do echo "$dir: $(find "$dir" -xdev | wc -l)"; done 2>/dev/null | sort -t: -k2 -rn | head -20 ``` 或者针对可疑目录深入排查: ```bash # 查看 /tmp 下各子目录文件数 find /tmp -maxdepth 1 -type d | while read d; do echo "$d: $(find "$d" | wc -l)" done ``` --- ## 清理方案 ### 1. 清理 PHP Session 文件 ```bash # 查看 session 文件数量 ls /tmp/sess_* 2>/dev/null | wc -l # 删除 7 天前的 session 文件 find /tmp -name "sess_*" -mtime +7 -delete ``` ### 2. 清理系统临时文件 ```bash # 删除 /tmp 下超过 3 天的文件(保留目录结构) find /tmp -type f -mtime +3 -delete ``` ### 3. 清理系统日志 ```bash # 清理 7 天前的日志文件 find /var/log -type f -mtime +7 -name "*.log" -delete find /var/log -type f -mtime +7 -name "*.gz" -delete # 或使用 journalctl 清理 systemd 日志(保留最近 3 天) journalctl --vacuum-time=3d ``` ### 4. 清理 Docker 残留资源 ```bash # 清理未使用的镜像、容器、网络、缓存 docker system prune -f ``` ### 5. 通过宝塔面板文件管理器清理 进入「文件」页面,按**文件数量**排序,找到文件数异常多的目录,批量删除不需要的临时文件。 --- ## 清理后验证 ```bash df -i ``` 确认 `IUse%` 已下降到安全范围(建议低于 80%)。 --- :::tip 预防建议 - 为 PHP 配置定期 Session 清理(`session.gc_maxlifetime`) - 使用计划任务定期清理 `/tmp` 和日志目录 - 监控 Inode 使用率,在达到 80% 时提前处理 :::