当前位置: 首页 > 科技观察

Linux系统常见故障:文件被删除但空间没有释放的原因

时间:2023-03-13 00:23:58 科技观察

1.错误现象的运维监控系统发出通知,报告服务器空间满。登录服务器查看,根分区没有空间。图1显示。图1查看服务器磁盘空间首先,我解释一下服务器的一些删除策略。由于Linux没有回收站功能,在线服务器上所有要删除的文件都会先被移动到系统/tmp目录下,然后会定时清除/tmp目录下的数据。这个策略本身没有问题,但是通过检查发现这个服务器的system分区并没有单独的/tmp分区,所以/tmp下的数据实际上占用了根分区的空间。既然问题找到了,就把/tmp目录下一些占用空间大的数据文件删除,查看/tmp下最大的三个数据文件,如图2所示。图2查看下前三个最大的数据文件/tmp通过命令输出,我们发现/tmp目录下有一个66GB的文件access_log。这个文件应该是Apache生成的访问日志文件。从日志大小来看,应该是很久没有清理Apache日志文件了。基本判断是这个文件导致的根空间满了。确认文件可以删除后,执行如下删除操作:[root@localhost~]#rm/tmp/access_log然后查看系统根分区空间是否释放,如图3所示。图3查看是否磁盘空间被释放从输出中,我们可以看到根分区空间仍然没有被释放。怎么了?2、解决办法一般来说,删除文件后空间不会释放,但也有例外。比如某个文件被进程锁定,或者某个进程一直在向这个文件写入数据等。要理解这个问题,需要了解Linux下文件的存储机制和存储结构。一个文件在文件系统中的存储分为两部分:数据部分和指针部分。该指针位于文件系统的元数据中。数据删除后,指针从元数据中清除,数据部分存入磁盘。从元数据中清除数据对应的指针后,可以覆盖文件数据占用的空间,写入新的内容。删除access_log文件后空间还没有释放的原因是因为httpd进程还在往这个文件里写内容,所以虽然删除了access_log文件,但是由于进程锁,文件对应的指针部分还没有从meta-data中清除,也因为指针还没有被删除删除,系统内核认为文件没有被删除,所以df命令查询到的空间没有释放也就不足为奇了。3.问题排查既然有了解决问题的思路,那么再看看是否有进程一直在向access_log文件写入数据。这里需要用到Linux下的lsof命令。通过这个命令,你可以得到一个仍然被应用程序占用的文件。命令执行的删除文件列表如图4所示。图4查看被应用锁定的删除文件列表从输出中我们可以看到/tmp/access_log文件被进程httpd锁定,httpd进程一直在向这个文件写入日志数据。从第七列可以看出,这个日志文件的大小约为70GB,而系统根分区的总大小只有100GB。由此我们可以看出,这个文件是导致系统根分区空间不足的罪魁祸首。最后一列的“已删除”状态表示日志文件已经被删除,但是空间还没有释放,因为进程还在向文件写入数据。4.解决问题到这里问题基本搞清楚了。有很多方法可以解决这类问题。最简单的方法是关闭或重启httpd进程。当然,你也可以重启操作系统,但这都不是最好的方法。.对付这种不断向文件写入日志的进程,最好的办法就是释放文件占用的磁盘空间,就是在线清除文件,可以通过以下命令来完成:[root@localhost~]#echo"">/tmp/acess.log通过这种方式,不仅可以立即释放磁盘空间,还可以保证进程继续向文件写入日志。该方法常用于在线清理Apache、Tomcat、Nginx等Web服务产生的日志文件。