通常报磁盘不足的错误,有两个原因:
•磁盘空间满:可以通过df -h命令查看磁盘的使用情况。
•磁盘inode资源占用完:可以通过df -i命令查看,确认inode节点使用率;
如果是inode资源占用完,是因为使用的小文件过多导致的。但如果是磁盘空间满,我们需要删除文件,挤出空间来,但发现磁盘空间根本没减少。这就需要了解rm删除文件原理。
rm删除文件原理
Linux是link的数量来控制文件删除的。只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来讲,每个文件都有两个link计数器:i_count和i_nlink
•i_count的意义是当前文件使用者(或被调用)的数量
当一个文件被某一个进程引用时,对应的这个值就会增加
•i_nlink的意义是介质连接的数量(硬链接的数量)
当创建文件的硬链接的时候,这个值就会增加
rm操作只是将文件的i_nlink减少了,实际就是将文件名到inode的链接删除了,如果没有其它的链接,i_nlink就为0。但是由于该文件依然被进程引用,因此,此时文件对应的i_count并不为0,所以执行rm操作,系统并没有真正的删除这个文件,只有当i_nlink和i_count都为0的时候,这个文件才会被真正的删除。也就是说,必须要解除该进程对该文件的调用,才能真正的删除。
解决方案
lsof | grep deleted
当发现删除文件后,磁盘的空间还是没有变,库使用使用以上命令,获得一个已经被删除但是仍然被应用程序占用的文件列表,然后可以kill 掉相关进程即可强制要求系统回收分配给正在使用的的文件,这样就可以释放次磁盘资源。
注:系统中,只有已释放的文件数据块被重用其中数据被覆盖时,原文件数据才算删除掉。