df -i仅显示当前inode使用快照,无历史数据;需用脚本定时采集+日志存储才能形成走势;定位耗尽根源须结合find扫描具体目录,而非仅依赖df -i汇总值。

df -i 能看到当前 inode 使用率,但看不到历史走势
Linux 自带工具不记录 inode 使用的历史数据,df -i 只返回当前快照。所谓“走势”,必须靠外部手段采集并存储。没有定时采集,就不存在走势可言。
常见误区是以为 df -i 加上 -T 或 --output 就能导出时间序列——其实它压根不带时间戳,每次执行都是独立的一行输出。
-
df -i输出里没有时间字段,无法直接绘图 - 想看“走势”,本质是做监控:需定期运行 + 保存结果 + 后续分析
- 最轻量做法:用
date和df -i拼接,每分钟/每小时写入日志文件
用 shell 脚本+cron 实现基础 inode 走势采集
不需要额外装监控系统,一个简单脚本就能开始积累数据。关键点是字段对齐、时间格式统一、避免覆盖。
示例采集脚本(保存为 /usr/local/bin/record-inode.sh):
#!/bin/bash
echo "$(date '+%Y-%m-%d %H:%M') $(df -i | awk 'NR==2 {print $5,$6,$7}') /" >> /var/log/inode-history.log
说明:
-
NR==2提取第一行挂载点后的实际数据行(跳过表头) -
$5是IUse%,$6是IFree,$7是挂载点,按需调整列号 - 用空格分隔,方便后续用
awk或cut提取特定列 - 务必用
>>追加,不是>覆盖
然后加到 crontab(比如每10分钟一次):
*/10 * * * * /usr/local/bin/record-inode.sh
快速画出 inode 使用率趋势(不用 Grafana)
已有日志文件后,用命令行工具就能生成简易趋势图。核心是把文本日志转成两列:时间 + 百分比。
假设你关注 / 分区,且日志格式为:2026-07-09 14:30 12% 5123456 /:
- 提取时间和 IUse%:
awk '{print $1" "$2, $3}' /var/log/inode-history.log | grep '% /$' | sed 's/%//' > inode-trend.dat - 用
gnuplot快速出图(若未安装,apt install gnuplot或yum install gnuplot):
gnuplot -e "set terminal png; set output 'inode-trend.png'; set xdata time; set timefmt '%Y-%m-%d %H:%M'; plot 'inode-trend.dat' using 1:2 with lines"
注意:set xdata time 要求第一列是严格按格式的时间字符串,否则绘图会错位。
为什么不能只看 df -i 就判断问题根源
df -i 显示的是整个分区的汇总值,但 inode 耗尽往往集中在某个子目录(比如 /var/spool/postfix/maildrop),而该分区其他路径可能非常空闲。
真正要定位“谁在吃 inode”,必须结合 find 扫描:
- 查单个目录下文件总数:
find /var -xdev -type f | wc -l - 查各二级目录文件数排名:
find /var -xdev -mindepth 1 -maxdepth 1 -type d -exec sh -c 'echo {} $(find {} -maxdepth 1 -type f | wc -l)' \; | sort -k2nr | head -10 - 注意
-xdev:防止跨分区扫描,避免统计到其他挂载点
忽略 -xdev 可能导致结果包含 NFS 或 tmpfs 等非目标分区,数值失真。
inode 走势本身不解决占用问题,它只是帮你确认增长是否异常;真正要动手清理,还得回到具体路径和文件类型。临时暴增往往意味着服务异常(如日志轮转失败、邮件队列堆积、临时文件未清理),而不是容量规划问题。











