Inode 可用空间不足
问题现象
在宝塔面板首页磁盘信息区域,看到如下提示:
Inode可用不足10%,请前往文件管理清理不必要文件

此时尽管磁盘容量(如上图仅用了 16%)仍有大量剩余,但服务器却无法创建新文件、无法写入日志,网站也可能出现 500 错误或 "No space left on device" 报错。
如有疑问,欢迎扫码联系客服

什么是 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 登录服务器,执行:
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 最多的目录
执行以下命令,统计各目录下的文件数量(从根目录开始,只看第一层,耗时较短):
for dir in /*; do echo "$dir: $(find "$dir" -xdev | wc -l)"; done 2>/dev/null | sort -t: -k2 -rn | head -20
或者针对可疑目录深入排查:
# 查看 /tmp 下各子目录文件数
find /tmp -maxdepth 1 -type d | while read d; do
echo "$d: $(find "$d" | wc -l)"
done
清理方案
1. 清理 PHP Session 文件
# 查看 session 文件数量
ls /tmp/sess_* 2>/dev/null | wc -l
# 删除 7 天前的 session 文件
find /tmp -name "sess_*" -mtime +7 -delete
2. 清理系统临时文件
# 删除 /tmp 下超过 3 天的文件(保留目录结构)
find /tmp -type f -mtime +3 -delete
3. 清理系统日志
# 清理 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 残留资源
# 清理未使用的镜像、容器、网络、缓存
docker system prune -f
5. 通过宝塔面板文件管理器清理
进入「文件」页面,按文件数量排序,找到文件数异常多的目录,批量删除不需要的临时文件。
清理后验证
df -i
确认 IUse% 已下降到安全范围(建议低于 80%)。
预防建议
- 为 PHP 配置定期 Session 清理(
session.gc_maxlifetime) - 使用计划任务定期清理
/tmp和日志目录 - 监控 Inode 使用率,在达到 80% 时提前处理