从“No space left on device”到删除海量文件


开发发现某个云服务器无法启动进程,提示“No space left on device”,但是使用#df -h查看容量的时候,明明还有很多的空间。于是使用#df -i,发现inode节点已经全部用光了,所以现在不能建立任何新的文件。


从“No space left on device”到删除海量文件


既然如此就要查出来是哪个文件夹里会有如此多的文件来占用这些inode,使用一个小脚本:#for i in /*; do echo $i; find $i | wc -l; done,获取到/mnt下有一个文件占用了绝大多数的inode,如图:

从“No space left on device”到删除海量文件


于是就进入到mnt这个文件夹里,慢慢找寻到底是哪个文件夹,用上面那个语句一点一点缩小范围,最后确定文件夹原来就是data文件夹,如图:

从“No space left on device”到删除海量文件


现在如果要#rm -rf data/*的话,是没有效果的,有效果的话也很慢。而且很有可能报“-bash: /bin/rm: Argument list too long”的错,因为这个文件夹里面的小文件实在太多了,有足足两百五十多万个,那么怎么样处理这样的情况?


用find搭配-type f -exec rm {} \;可能会引起内存溢出,用文件夹重置命令搭配"--reference" 也没什么效果。


这时最好的方法就是使用rsync!


#yum install rsync,当然了现在inode是饱和的状态,yum install是会报错的:

从“No space left on device”到删除海量文件


那么就需要手动删除一些文件,腾出来一部分inode供yum使用,安装完毕rsync之后,找到一个空文件夹,如果没有空文件夹,就手动建立一个。 


使用命令:#rsync --delete-before -a -H -v --progress --stats /空文件夹的路径/ /海量小文件的路径/


    –delete-before 接收者在传输之前进行删除操作

    –progress 在传输时显示传输过程

    -a 归档模式,表示以递归方式传输文件,并保持所有文件属性

    -H 保持硬连接的文件

    -v 详细输出模式

    -stats 给出某些文件的传输状态


如果你开了这个服务器的两个窗口,一个是执行上面的命令,另一个是在海量文件夹里执行#ls,这个时候ls命令是卡死的,过了大约2分钟,就会看到ls展示的文件喷涌而出,整个电脑屏幕好比黑客帝国一样,异常壮观。


静等大约20分钟,整个文件夹删除干净,inode也释放了97%,世界恢复了清静。

从“No space left on device”到删除海量文件


最后的最后,如果您觉得本文对您升职加薪有帮助,那么请不吝赞助之手,刷一下下面的二维码,赞助本人继续写更多的博文!

从“No space left on device”到删除海量文件


 本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/1978429


上一篇:Table Store(原OTS) 如何支持大cell写入


下一篇:SAP与阿里云达成战略合作 将融合双方生态系统