Linux 下文件数据储存在块(block)中,文件的元信息(创建者、创建日期、大小等)储存在 inode 中,inode 中文译为”索引节点”。
inode 的基本概念
inode 也占用硬盘空间。格式化时操作系统会把硬盘分成两个区域:数据区(存文件数据)和 inode 区(存 inode 信息)。每个 inode 节点一般是 128 或 256 字节,inode 总数在格式化时就给定,一般是每 1KB 或 2KB 设置一个 inode。
举例:1GB 硬盘、每个 inode 128 字节、每 1KB 一个 inode,则 inode table 达 128MB,占硬盘的 12.8%。
inodes 用尽与存储空间用尽类似,都导致无法创建文件或无法正常执行命令。但 inodes 用尽时存储空间往往还有剩余——这种情况一般是生成了大量小文件、占满了 inode table。而存储空间用尽时 inodes 往往才用了百分之几,因此容易忽视对 inodes 的监控。
用 df -i 查看 inodes 使用情况,加 -h 为 df -hi(磁盘空间则为 df -h)。inodes 大小在格式化分区时确定,与分区大小相关——分区越大 inodes 越多。Linux 根目录分区一般较小,若有定时产生的小文件未及时清理,很容易占满 inodes。
查看文件最多的目录
for i in /*; do echo $i; find $i | wc -l; done
确定目录范围后可把 /* 写具体些。一个典型场景是 /var/spool/postfix/maildrop 目录小文件过多:Linux 执行 cron 时会把脚本的 output 和 warning 以邮件形式发给 cron 所有者,若 sendmail/postfix 未正常运行,邮件发送失败,小文件全部堆积在 maildrop 目录,且缺乏自动清理机制。排查后通常能找到每分钟产生一个小文件的定时任务(如时钟同步)。
删除大量文件
ls | xargs -n 1000 rm -rf
需要用 xargs 分批,否则会删除失败。
预防措施
设置 MAILTO:在 crontab -e 第一行加 MAILTO="",就不再产生邮件文件。
重定向输出:不需要日志输出的定时任务把日志重定向到 /dev/null:
*/10 * * * * /tmp/test.sh >/dev/null 2>&1
定时清理文件
find 目录 -type f -mtime +30 | xargs -n 1000 rm -f
小结
应注意 crontab 的写法,并对产生的文件做定时清理,同时监控 inodes 的使用情况。