文件已经删除,但空间未释放怎么办?

Catalogue
  1. 1. 原因分析
  2. 2. 处理方法
    1. 2.1. 方法一
    2. 2.2. 方法二

原因分析

有程序一直占用这个文件,并向该文件写入东西

通常不会出现删除文件后空间不释放的情况,特殊情况是文件进程锁定,或有进程一直在向这个文件写数据。

为了分析根因,首先需要了解Linux文件的存储机制和存储结构。

一个文件在文件系统中存放分为两个部分:

  • 指针部分:指针位于文件系统的meta-data中,在将数据删除后,这个指针就从meta-data中清除了。
  • 数据部分:而数据部分存储在磁盘中。

将数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容。出现删除access_log文件后,空间还没有释放的原因,是因为httpd进程还在一直向这个文件写入内容,导致删除了access_log文件后,进程锁定,文件对应的指针部分并未从meta-data中清除,由于指针并未删除,系统内核就默认文件并未被删除,因此查询文件系统使用率时,显示空间并未释放。

处理方法

方法一

使用lsof命令查看是否有进程一直在向access_log文件中写入数据。

1
# lsof -n |grep delete

可以选择关闭或者重启 占用该文件 的进程,或重启操作系统。


方法二

在线清空access_log

执行以下命令清空access_log。

1
# echo "">/access_log

通过这种方法,磁盘空间不但可以马上释放,也可以保证进程继续向文件写入日志,再次执行df
-h查看根分区空间已经释放(未验证)

参考:文件已经删除,但空间未释放怎么办?