宝塔面板博客官方技术博客
宝塔面板

宝塔面板提示 Inode 不足 10% 怎么办?先分清磁盘满还是 Inode 满

宝塔面板首页磁盘信息区域弹出「Inode 可用不足 10%,请前往文件管理清理不必要文件」时,很多人第一反应是「磁盘满了,删点东西」。但问题往往不是磁盘满,而是 Inode 满——这是两种现象相似、成因和清理方式完全不同的「满」。

核心判断只有一个:磁盘空间用尽 ≠ 索引节点用尽。 磁盘满要删大文件腾空间;Inode 满要清海量小文件。搞反了,删再多文件也可能白费。下面先讲怎么分清,再讲怎么清。

宝塔面板 Inode 占用 91% 告警

磁盘满和 Inode 满有什么不一样?

这是本文最关键的一点,先分清两种「满」。

磁盘空间满,指的是磁盘容量用尽——文件太大、太多,把物理空间塞满了。此时 df -h 看到的使用率(Use%)会接近 100%,表现是「写不进新数据、上传文件失败、日志写不进去」。

Inode 满,指的是索引节点用尽——文件数量超限,但容量可能还剩很多。此时 df -i 看到的 Inode 使用率(IUse%)接近 100%,而 df -h 的使用率可能只有 16%。官方文档里给出的典型场景正是这样:磁盘容量仅用了 16%,服务器却无法创建新文件、无法写入日志,网站出现 500 错误或 “No space left on device” 报错。

打个比方:磁盘空间是书库的物理空间,Inode 是书目索引卡的数量。即使书库还有大量空位,一旦索引卡用完,就无法再登记新书入库——哪怕每本「书」只有几字节大小。这就是为什么「磁盘才用了 16%」却「传不上文件」。

对比项 磁盘满 Inode 满
用尽的额度 磁盘容量 文件数量(索引节点)
查看命令 df -h 看 Use% df -i 看 IUse%
典型现象 Use% 接近 100% IUse% 接近 100%,Use% 可能很低
清理方向 删大文件释放空间 清理海量小文件

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% 则完全无法创建新文件。 若此时 df -h 看 Use% 还很低,就确认了是 Inode 满而非磁盘满。

找出占用 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

定位到文件数异常多的目录后,再决定删什么。

怎么清理?两种方式

方式一:面板「日志清理工具」一键清日志

如果根因是日志类文件,用宝塔免费插件日志清理工具最省事。它主要用于一键清理指定日志和系统垃圾,涵盖回收站、面板日志、数据库日志等内容。

日志清理工具主界面

点击【立即清理】后,系统会扫描并列出所有可清理的日志文件,默认包含:系统日志、邮箱日志、网站日志、防入侵日志、Docker 容器日志、面板安装日志、面板计划任务日志、防爆破日志。勾选对应类型点击清理即可;还支持【自定义配置】添加要清理的目录、文件或查找目录。

日志清理工具主要清日志类文件。如果 Inode 被 PHP Session、缓存碎片等小文件占满,还需结合下面的 SSH 命令或面板文件管理器处理。

方式二:SSH 命令清理小文件

根据定位结果,官方文档给出以下几类清理命令。

清理 PHP Session 文件:

# 查看 session 文件数量
ls /tmp/sess_* 2>/dev/null | wc -l

# 删除 7 天前的 session 文件
find /tmp -name "sess_*" -mtime +7 -delete

清理系统临时文件:

# 删除 /tmp 下超过 3 天的文件(保留目录结构)
find /tmp -type f -mtime +3 -delete

清理系统日志:

# 清理 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

清理 Docker 残留资源:

docker system prune -f

也可以在面板「文件」页按文件数量排序,找到文件数异常多的目录,批量删除不需要的临时文件。

清理后验证与预防

清理后再次执行 df -i,确认 IUse% 已下降到安全范围。官方建议降到 80% 以下。

预防比事后清理更省心,三点建议:

  • 为 PHP 配置定期 Session 清理(session.gc_maxlifetime)
  • 用计划任务定期清理 /tmp 和日志目录
  • 监控 Inode 使用率,达到 80% 时提前处理,而不是等不足 10% 的告警弹出

信息来源

本文事实以宝塔官方文档为准:《Inode 可用空间不足》、《日志清理工具》、《概览&状态》。

常见问题

面板提示 Inode 可用不足 10%,但磁盘明明还有空间,这是怎么回事?

磁盘空间和 Inode 是两套独立的额度。磁盘空间是能装多少数据,Inode 是能登记多少个文件;每个文件或目录都独占一个 Inode。当海量小文件(Session、日志分片、缓存)把 Inode 用光时,即使磁盘容量还剩很多,也无法再创建新文件。

怎么确认到底是磁盘满还是 Inode 满?

看两个不同的使用率:df -h 看磁盘空间使用率(Use%),df -i 看 Inode 使用率(IUse%)。磁盘满表现为 Use% 接近 100%,要删大文件释放空间;Inode 满表现为 IUse% 接近 100% 而 Use% 还很低,要清理海量小文件。

为什么 Inode 会被耗尽?

最常见原因是大量小文件堆积,每个文件占一个 Inode:PHP Session 堆积在 /tmp、邮件队列每封一个文件、Docker 镜像层残留、node_modules / Composer 依赖包,以及 /var/log 下未清理的历史日志分片,都可能把 Inode 占满。

用面板的日志清理工具能解决 Inode 满吗?

能清掉日志类文件,但要看小文件的类型。日志清理工具可一键清理系统日志、网站日志、Docker 容器日志等;如果根因是 PHP Session 或缓存碎片,还需要用 SSH 命令或面板文件管理器按文件数量排序定位并删除。

清理完怎么确认已经恢复?

再次执行 df -i,确认 IUse% 已下降到安全范围。官方建议降到 80% 以下;达到 100% 时服务器完全无法创建新文件,90% 以上就需要关注处理。

怎么预防 Inode 再次耗尽?

三件事:为 PHP 配置定期 Session 清理(session.gc_maxlifetime);用计划任务定期清理 /tmp 和日志目录;监控 Inode 使用率,在达到 80% 时提前处理,而不是等面板弹出不足 10% 的告警。