Linux 系统下文件数据储存在“块”中,文件的元信息,例如文件的创建者、文件的创建日期、文件的大小等。这种储存文件元信息的区域就叫做 inode,中文译名为“索引节点”。
inode 也占用硬盘空间,硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是 inode 区(inode table),存放 inode 所包含的信息。
每个 inode 节点的大小,一般是 128 字节或 256 字节。inode 节点的总数,在格式化时就给定,一般是每 1KB 或每 2KB 就设置一个 inode。假定在一块 1GB 的硬盘中,每个 inode 节点的大小为 128 字节,每 1KB 就设置一个 inode,那么 inode table 的大小就会达到 128MB,占整块硬盘的 12.8%。
inodes 使用完与存储空间使用完相似,都是创建不了文件或无法正常执行一些命令。inodes 使用完,存储空间可能还有,这种情况一般是生成了大量的小文件,把 inode table 占满。一般情况下存储空间使用完,inodes 往往才使用百分之几,所以容易忽视对 inodes 使用情况的监控。
借用网图来说明 inodes 用尽,而磁盘空间还未用完的情况:查看磁盘空间使用情况,使用 df 命令。
查看 inodes 使用情况,使用 df -i 命令。
上述两个命令可以使用 -h 参数,命令为 df -h 和 df -hi。从图中看见磁盘空间使用 71%,但是 inodes 使用 100%。
inodes 的大小在磁盘格式化分区时确定,跟分区的大小相关,分区越大,inodes 越大,反之亦然。
linux 操作系统根目录一般分区比较小,如果有定时性的小文件产生而又未及时清理,则很容易造成 inodes 占满。
inodes 占满解决步骤:
查看文件最多的目录
for i in /*; do echo $i; find $i | wc -l; done
如果确定目录范围,把 /* 写的具体点。
最终发现是 /var/spool/postfix/maildrop 目录下小文件过多,原因如下:由于 linux 在执行 cron 时,会将 cron 执行脚本中的 output 和 warning 信息,都会以邮件的形式发送给 cron 所有者。由于客户环境中的 sendmail 和 postfix 没有正常运行,邮件发送不成功,导致全部小文件都堆积在 maildrop 目录下,另由于缺乏自动清理的机制,故此目录下堆积了大量的文件。
经过排查 root 用户下发现有个每分钟进行一次时钟同步的定时任务,该定时任务每分钟产生一个小文件。
删除大量文件
ls | xargs -n 1000 rm -rf
需要使用 xargs 命令,不然会删除失败。
设置方面
在 crontab -e 第一行增加 MAILTO="",就没有文件产生啦。
重定向
对定时任务设置定向输出文件,不需要日志输出的定时任务可以将日志重定向到 /dev/null,如下:
*/10 * * * * /tmp/test.sh >/dev/null 2>&1
定时清理文件
find 目录 -type f -mtime +30 | xargs -n 1000 rm -f
监控 inodes 的使用
备注:应注意 crontab 的写法和产生的文件的定时清理