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

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


e6143a47a6317998ff12897f6cbc68dd.png


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

a032f07f1691b80baffd5aaee45c81db.png


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

b57d4eaf972a500893d9acd2ee3bbc78.png


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


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


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


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

734903c66c830d89925dc9d7d3e7bee7.png


那么就需要手动删除一些文件,腾出来一部分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%,世界恢复了清静。

3a0e3f473b04b32e24a72af4fadabdc5.png


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

wKioL1l16m3BMYDKAACPHEqd55Q687.jpg


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章