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

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

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

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

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

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

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

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

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

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

说一下上面几个参数的意思:

1
2
3
4
5
6
delete-before 接收者在传输之前进行删除操作
–progress 在传输时显示传输过程
-a 归档模式,表示以递归方式传输文件,并保持所有文件属性
-H 保持硬连接的文件
-v 详细输出模式
-stats 给出某些文件的传输状态

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

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

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------