2012年4月3日星期二

Linux inode耗尽导致No space left on device错误


周五客户说有台机器服务一直起不了,叫马上过去帮忙看一下。
到现场查看了一下,发现Oracle linstener无法启动,说linux: No space on device。另一个web服务也无法启动,log也说在尝试创建lock文件的时候No space on device。使用df -h命令查看文件空间,发现都有空间剩余,没满。
网上查了一下,说可能是文件系统的inode满了,使用df -i 查看inode的使用情况。果然,/var目录下inode已经耗尽。使用du –ah  /var > /tmp/1.txt 发现/var/spool/clientmqueue目录下的文件有100多万个,怪不得inode被耗尽。使用命令 find  /var/spool/clientmqueue -type f | xargs rm -f  删除 /var/spool/clientmqueue目录下的文件后,Oracle linstener和web服务成功启动,问题解决。

 关于inode:

Linux/Unix like OS 的文件系统中每个目录树中的节点并不是像 Windows 那样直接包含文件的具体信息,而只包含了文件名和 Inode number 。通过 Inode number 所找到对应于文件名的 Inode 节点中才真正记录了文件的大小/物理地址/所有者 /访问权限/时间戳/被硬链接的次数等实际的 metadata 。因此你可以在 Linux 系统中通过硬链接( hard link ) 的方式给某个文件创建无数个位于不同目录下的文件名,而实际的文件数据只需要一份拷贝。
但也正因为这种文件系统的结构,当你在 Linux 中进行 IO 操作的时候,需要的资源除了磁盘空间以外,还要有剩余的 Inode 才行。缺省情况下, Linux 在系统安装过程中按照1 个 Inode 对应 2k 磁盘空间来计算每个分区的最大 Inode 数。一旦文件系统创建之后,每个分区可用 Inode 数就无法进行动态调整。
正常来说,一般不太会出现某个分区的 Inode 耗尽而磁盘空间尚余的情况,除非像我碰到的这样垃圾小文件疯长而又没进行有效的清理。但如果确实需要的话,可以在创建文件系统(比如用 mke2fs )的时候根据实际需要来调整这个参数(比如分区如果用于存放超大视频文件的话 Inode 的数量可以少一些;如果打算存放的文件是大量小于 2k 的迷你文件的话就要考虑多创建一些 Inode)。

关于/var/spool/clientmqueue目录:

问题现象:linux操作系统中的/var/spool/clientmqueue/目录下存在大量文件。
原因分析:系统中有用户开启了cron,而cron中执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了这些文件;
解决办法: 将crontab里面的命令后面加上> /dev/null 2>&1

关于标准输出、错误输出、/dev/null

find / -size  +5000000c  2> /dev/null
1>/dev/null   表示将命令的标准输出重定向到   /dev/null  
2>/dev/null   表示将命令的错误输出重定向到   /dev/null 

tar zcvfp cvs.tar.gz /repository >/dev/null 2>&1
>/dev/null   将输出重定向到/dev/null,这是个空设备,也就是忽略其输出。    
2>&1     是将错误输出到标准输出,如果在控制台调试,也就是屏幕上,方便调试

没有评论:

发表评论