运行 `rm -rf` 磁盘空间未成功释放
最近在日常维护服务器的时候,收到了硬盘剩余空间不足的警告。简单的排查了一下,网站运a行时产生的日志文件占了不少的空间。于是用 rm -rf
命令对过期的日志进行了删除,但是发现磁盘的空间并没有释放出来。查阅资料发现:
Linux 系统中是通过 link 的数量来控制文件删除的,只有当一个文件不存在任何 link 的时候,这个文件才会被删除。一般来说,每个文件都有 2 个 link 计数器: i_count
和 i_nlink
,也就是说:Linux 系统中只有 i_nlink
及 i_count
都为 0 的时候,这个文件才会真正被删除。
- i_count 表示当前文件使用者(或被调用)的数量
- i_nlink 表示介质连接的数量(硬链接的数量)
可以理解为 i_count
是内存引用计数器,i_nlink
是磁盘的引用计数器。 当一个文件被某一个进程引用时,对应 i_count
数就会增加,当创建文件的硬链接的时候,对应 i_nlink
数就会增加。在 Linux 或者 Unix 系统中,通过 rm
或者 文件管理器 删除文件,只是将它会从文件系统的目录结构上解除链接,即 unlink
,实际上就是减少磁盘引用计数 i_nlink
,但是并不会减少 i_count
数。
如果一个文件正在被某个进程调用,用户使用rm
命令把文件「删除」了,这时候通过 ls
或 文件管理命令 就无法找到这个文件了,但是并不意味着这个文件真正的从磁盘上删除了。因为还有进程在正常的执行,在向文件中读取或写入,也就是说文件其实并没有被真正的「删除」,所以磁盘空间也就会一直被占用。
当服务进程停止(文件句柄的引用计数会变为0)或者重启后,占用的存储空间才被释放。如果不知道具体进程或文件名的话:lsof | grep deleted
,这样会查找所有被删除的但是文件句柄没有释放的文件和相应的进程,然后再 kill
掉进程或者重启进程即可。