admin管理员组文章数量:1660066
文件已经删除,但空间未释放怎么办?**
问题现象
Linux操作系统云服务器根目录空间占用率过高。例如,以图1为例,根目录空间占用率为96%。
图1 根目录空间占用率过高
点击放大
查询当前系统存在一个约42G大小的文件access_log,这个文件是apache产生的访问日志文件,从日志大小判断是很久没有清理的apache日志文件了。
执行以下命令删除access_log。
rm /tmp/access_log
执行以下命令查看文件系统使用率。
df -h
删除该文件后使用df查看文件系统使用率仍是96%。
根因分析
通常不会出现删除文件后空间不释放的情况,特殊情况是文件进程锁定,或有进程一直在向这个文件写数据。
为了分析根因,首先需要了解Linux文件的存储机制和存储结构。
一个文件在文件系统中存放分为两个部分:
指针部分:指针位于文件系统的meta-data中,在将数据删除后,这个指针就从meta-data中清除了。
数据部分:而数据部分存储在磁盘中。
将数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容。出现删除access_log文件后,空间还没有释放的原因,是因为httpd进程还在一直向这个文件写入内容,导致删除了access_log文件后,进程锁定,文件对应的指针部分并未从meta-data中清除,由于指针并未删除,系统内核就默认文件并未被删除,因此查询文件系统使用率时,显示空间并未释放。
处理方法
使用lsof命令查看是否有进程一直在向access_log文件中写入数据。
lsof -n |grep delete
图2 查看写入进程
点击放大
如回显信息所示,/tmp/access_log 文件被进程httpd锁定,而httpd进程还一直向这个文件写入日志数据,最后一列的“deleted”状态说明这个日志文件已经被删除,但是由于进程还在一直向此文件写入数据,因此空间并未释放。
可以选择关闭或者重启httpd进程,或重启操作系统。推荐在线清空access_log。
执行以下命令清空access_log。
echo “”>/access_log
通过这种方法,磁盘空间不但可以马上释放,也可以保证进程继续向文件写入日志,再次执行df -h查看根分区空间已经释放。
图3 查看根目录空间占用率
点击放大
版权声明:本文标题:【linux】文件已经删除,但空间未释放怎么办 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1729844389a1214960.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论