AWS EC2实例inode自动增长致设备无空间问题求助
Hey there, let's work through fixing this inode exhaustion issue you're facing on your EC2 t2.micro instance—this is a super common pitfall, so we'll get it sorted out step by step.
第一步:确认inode使用情况
先搞清楚inode到底被哪里占用了:
- 运行
df -i查看所有挂载卷的inode整体使用情况,找IUse%列显示100%的文件系统,这就是问题根源。 - 要定位具体是哪个目录产生了大量小文件,用这条命令(按文件数量排序显示目录):
find / -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n - 如果想精确统计某个可疑目录的文件数,用:
find /path/to/suspected/dir -type f | wc -l
第二步:找出耗尽inode的元凶
inode耗尽几乎都是大量小文件导致的,而非大文件。常见的“罪魁祸首”包括:
- 未轮转的日志:
/var/log/下的应用调试日志、系统日志,长期没做切割和清理。 - 未清理的临时文件:
/tmp/或应用专属缓存目录里的会话数据、临时缓存,没定期删除。 - Docker/容器遗留文件:如果在用容器,未使用的镜像、停止的容器、孤立的卷层会快速占用inode。
- 堆积的邮件队列:
/var/spool/mail/或postfix队列里的大量未投递邮件。
比如如果发现/var/log/下有几万份小日志文件,那就是日志轮转没配置好的问题。
第三步:临时救急+长期预防
快速恢复服务
- 删除无用临时文件:可以安全清理
/tmp/下的旧文件,命令是rm -rf /tmp/*(先确认没有关键文件再执行)。 - 清理过期日志:用
find删除7天前的日志归档:find /var/log -name "*.log.*" -mtime +7 -delete - 如果是Docker的问题:清理未使用的容器资源:
docker image prune -a # 删除未使用的镜像 docker container prune # 删除已停止的容器 docker volume prune # 删除未使用的卷
长期避免复发的方案
配置日志轮转:用
logrotate工具自动切割、归档日志。在/etc/logrotate.d/下为你的应用创建配置文件,比如/etc/logrotate.d/your-app:/var/log/your-app/*.log { daily rotate 7 compress missingok notifempty copytruncate }这个配置会每天轮转日志,保留7天的归档,压缩旧日志,并且跳过空文件。
用定时任务清理临时文件:添加每日cron任务,删除
/tmp/下超过7天的文件:0 0 * * * find /tmp -type f -mtime +7 -delete用
crontab -e编辑你的定时任务列表,把这条命令加进去。格式化新卷时调整inode数量:如果你的应用确实需要大量小文件,可以在格式化EBS卷时指定更多inode。比如格式化
/dev/xvdb时:mkfs.ext4 -i 16384 /dev/xvdb-i参数设置每多少字节分配一个inode,数值越小inode数量越多。注意:已格式化的卷无法修改inode数量,必须重新格式化(会清空数据,记得先备份)。用CloudWatch监控inode使用:设置自定义CloudWatch指标跟踪inode使用率。可以写个脚本定期把
df -i的数据推送到CloudWatch,然后设置告警阈值(比如使用率达80%时触发),这样能在问题爆发前及时发现。
第四步:确认附加的EBS卷已正确使用
你添加了8GB卷,但要确保它挂载到了正确的目录。如果是根文件系统(/)的inode耗尽,应该把产生大量小文件的目录(比如/var/log)迁移到新卷并挂载。用mount命令查看当前挂载情况,同时修改/etc/fstab确保卷在开机时自动挂载。
内容的提问来源于stack exchange,提问作者Shakti Sisodiya

