首页 > 运维 > linux中df -i 100%解决方案
2016
04-28

linux中df -i 100%解决方案

背景

E138: Can't write viminfo file /root/.viminfo!

Press ENTER or type command to continue

这不科学呀,明明是root,怎么可能无法写入?


后来查看磁盘inodes状态,发现/已经是100%,难怪无法写入。

df -i
Filesystem              Inodes   IUsed     IFree IUse% Mounted on
/dev/mapper/vg_db02-lv_root
                    3276800 3276800         0  100% /

inodes介绍

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使用完与存储空间使用完相似,都是创建不了文件或无法正常执行一些命令。inodes使用完,存储空间可能还有,这种情况一般是生成了大量的小文件,把inode table占满。

一般情况下存储空间使用完,inodes往往才使用百分之几,所以容易忽视对inodes使用情况的监控。

解决方案

通过以下脚本进行检查,查看到底哪个目录下面的文件最多

find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n

通过以下脚本进行检查,查看到底哪个目录下面的文件最多:

for i in /*; do echo $i; find $i | wc -l; done

如果确定是某个目录下面,则/转换为该目录绝对路径,如/var/log


最终发现 /var/spool/postfix/maildrop/这个目录下有大量的文件,

可能是由于该目录有大量的文件导致的inodes满了


在 网上搜索之后明白是mail没有成功的邮件。由于linux在执行cron时,会将cron执行脚本中的output和warning信息,都会以邮件的 形式发送cron所有者, 而我的服务器中关闭了postfix,导致邮件发送不成功,全部小文件堆积在了maildrop目录下面。如果sendmail或者postfix正常运 行,则会在/var/mail目录下也会堆积大量的邮件。


先停止任务计划

/etc/init.d/crond stop

然后我就直接清空目录所有文件

cd /var/spool/postfix/maildrop
rm -rf ./*

提示:-bash: /bin/rm: 参数列表过长

可以用

find . -name "*"|xargs rm -rf "*"

等待20分钟清理完成

再次查看,发现终于好了。


df -i
Filesystem              Inodes   IUsed     IFree IUse% Mounted on
/dev/mapper/vg_db02-lv_root
                       3276800 2496138    780662   77% /


关闭任务计划通知

vi /etc/crontab

MAILTO=root

更改为

MAILTO=""


重启任务计划

/etc/init.d/crond restart

过了几天,发现这个目录居然还有文件

然后我在任务计划第一行添加

crontab -e

#关闭任务计划通知

MAILTO=""


任务计划里面有很多每分钟执行的计划,等待半个小时,发现目录是空的。

Ok,那就说明以后再也不会产生文件了。




本文》有 0 条评论

留下一个回复