背景
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,那就说明以后再也不会产生文件了。