释放磁盘空间:解决文件删除但空间未释放的困扰
引言:当看到磁盘空间的红线警告
在管理Linux系统的日常中,最令人头疼的时刻之一
就是发现尽管已删除了巨大的文件,但是磁盘空间的占用率仍然没有任何下降。这种情况不仅让我怀疑自己的操作是否正确,同时也给操作系统的运行带来了隐患
。
究竟问题出在哪,又该如何解决?本次记录,将演示释放磁盘空间:解决文件删除但空间未释放的困扰。
问题描述:庞大的日志文件与不降的空间占用率
例如,根据下图显示,根目录的空间占用率达到了96%。
经查,系统中存在一个约42G大小的文件access_log
,这是由apache
产生的访问日志文件。从日志的大小来看,这个日志文件似乎已经很久没有被清理了。
通过执行以下命令,先行删除access_log
文件。
rm /tmp/access_log
然后,执行以下命令查看文件系统的使用率。
df -h
即使删除了该文件,使用df
查看的文件系统使用率仍然为96%。
原因分析:删除不等于立即释放
在Linux系统中,仅仅删除文件并不意味着磁盘空间会立即得到释放。通常,只有当文件不再被任何进程使用时,空间才会真正被释放。
文件在文件系统中的存储分为两部分:
- 指针部分:位于文件系统的元数据中,当数据被删除后,相应的指针会从元数据中移除。
- 数据部分:存储在磁盘上。
当数据对应的指针从元数据中移除后,文件的数据部分占用的空间就可以被覆盖并写入新的内容。因此,如果删除了access_log文件后,空间仍未释放,可能是因为httpd进程还在持续向此文件写入内容,导致文件被锁定,相应的指针并未从元数据中移除。由于指针未被删除,系统内核默认文件未被删除,因此在查询文件系统使用率时,空间显示为未释放。
解决步骤:找到并关闭消耗空间的真凶
使用lsof
命令查看是否有进程持续向access_log
文件写入数据。
lsof -n | grep delete
如返回的信息所示,/tmp/access_log
文件被httpd
进程锁定,而httpd
进程还在持续向此文件写入日志数据。最后一列的“deleted”状态
说明这个日志文件已被删除,但由于进程还在向此文件写入数据,因此空间未释放。
可以选择关闭或重启httpd进程
,或者重启操作系统。这里我推荐的是清空access_log
。
执行以下命令清空access_log。
echo ""> /access_log
通过这种方式,不仅可以立即释放磁盘空间,还能确保进程继续向文件写入日志。再次执行df -h
查看,根分区的空间已得到释放。
最后:预防问题建议
通过上述操作,解决了当前的空间不释放问题,还总结到如何避免将来类似的情况。
后续要定期检查日志文件的大小和访问情况,以及设置合理的日志转储策略,是保证系统稳定的关键。此外,理解文件系统的工作方式也有助于更有效地管理系统资源。
最后~欢迎关注我! @Linux学习的那些事儿
我的个人资源整理,满满都是干货: 无任何套路,有需要可以访问领取
如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!