searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

linux文件已删除但是实际空间未释放解决方法

2023-07-25 06:33:44
392
0

现象:

在linux使用过程中,可能会出现这种现象:明明已经把占用空间很大的文件使用rm命令删除,但是在后续的使用中仍然报告磁盘空间不足,分析确定磁盘空间不足仍旧由已删除的文件造成。

以下图为例,使用“df -h”命令显示/dev/data1空间使用835G,使用率100%,空间耗尽;但是在该目录下使用“du -sh *”命令显示各子目录空间占用合计不过200G。这意味着超过600G的空间仍然被已经删除的文件占用着,并未得到真正的释放。(下图场景中,刚使用rm命令删除了一个超过500G的大文件)

问题分析:

产生该问题的根本原因是,通过rm命令删除文件只是从文件系统的文件夹结构上解除链接,如果此时假设文件是被打开的(有一个进程正在使用),那么进程将仍然能够读取该文件,磁盘空间也一直被占用。

一般来说,不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件被进程锁定,或者有进程在使用这个文件,例如输出日志文件,要了解这个问题,就需要知道Linux下文件的存储机制和存储结构。

一个文件在文件系统中由两个部分构成:数据和指针。指针位于文件系统的meta-data中,数据被删除后,指针被清除,而数部分还是存储在磁盘中,只不过数据对应的指针被清除后,文件数据部分占用的空间就可以被覆盖了。之所以出现删除大文件后,空间还没有释放,就是因为有进程一直在使用这个文件的指针,日志文件的服务还在运行,导致虽然删除了日志大文件,但文件对应的指针部分由于被进程锁定,并未从meta-data中清除,而由于指针并未被删除,那么系统就认为文件并未被删除,所以使用 df 命令查看还是 100%。

解决方法:

可以通过lsof命令来获取所有进程目录,找到其中被删除的文件。以图示为例,进程857065仍然占用已经被删除的文件。

针对此现象,一共有两种解决方式。

第一种:

既然根因是rm删除文件被进程打开了,那么可以通过结束该进程,进程结束,进程所占用的磁盘空间被彻底释放。

使用命令“kill -9 进程号“,以上图来说,就是“kill -9 857065”即可。

该方法的好处是,归属于这个进程下所有的文件都会得到释放。缺点也是十分明显的,就是进程结束,正在执行的操作也结束了。可能我需要的只是减少其中某个文件的空间,释放掉其中冗余的内容,进程还需要继续执行。那么这种方法就不合适。

第二种:

找到该进程下该文件,通过将该文件写空来释放它占用的空间。

还是以上面所说的进程857065为例,进入该进程所打开的所有文件目录,“cd /proc/857065/fd”。找到其中需要释放空间的文件如tr_db.log,然后对其进行写空,“echo “” > tr_db.log”。

 

0条评论
0 / 1000
余泊江
3文章数
1粉丝数
余泊江
3 文章 | 1 粉丝
原创

linux文件已删除但是实际空间未释放解决方法

2023-07-25 06:33:44
392
0

现象:

在linux使用过程中,可能会出现这种现象:明明已经把占用空间很大的文件使用rm命令删除,但是在后续的使用中仍然报告磁盘空间不足,分析确定磁盘空间不足仍旧由已删除的文件造成。

以下图为例,使用“df -h”命令显示/dev/data1空间使用835G,使用率100%,空间耗尽;但是在该目录下使用“du -sh *”命令显示各子目录空间占用合计不过200G。这意味着超过600G的空间仍然被已经删除的文件占用着,并未得到真正的释放。(下图场景中,刚使用rm命令删除了一个超过500G的大文件)

问题分析:

产生该问题的根本原因是,通过rm命令删除文件只是从文件系统的文件夹结构上解除链接,如果此时假设文件是被打开的(有一个进程正在使用),那么进程将仍然能够读取该文件,磁盘空间也一直被占用。

一般来说,不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件被进程锁定,或者有进程在使用这个文件,例如输出日志文件,要了解这个问题,就需要知道Linux下文件的存储机制和存储结构。

一个文件在文件系统中由两个部分构成:数据和指针。指针位于文件系统的meta-data中,数据被删除后,指针被清除,而数部分还是存储在磁盘中,只不过数据对应的指针被清除后,文件数据部分占用的空间就可以被覆盖了。之所以出现删除大文件后,空间还没有释放,就是因为有进程一直在使用这个文件的指针,日志文件的服务还在运行,导致虽然删除了日志大文件,但文件对应的指针部分由于被进程锁定,并未从meta-data中清除,而由于指针并未被删除,那么系统就认为文件并未被删除,所以使用 df 命令查看还是 100%。

解决方法:

可以通过lsof命令来获取所有进程目录,找到其中被删除的文件。以图示为例,进程857065仍然占用已经被删除的文件。

针对此现象,一共有两种解决方式。

第一种:

既然根因是rm删除文件被进程打开了,那么可以通过结束该进程,进程结束,进程所占用的磁盘空间被彻底释放。

使用命令“kill -9 进程号“,以上图来说,就是“kill -9 857065”即可。

该方法的好处是,归属于这个进程下所有的文件都会得到释放。缺点也是十分明显的,就是进程结束,正在执行的操作也结束了。可能我需要的只是减少其中某个文件的空间,释放掉其中冗余的内容,进程还需要继续执行。那么这种方法就不合适。

第二种:

找到该进程下该文件,通过将该文件写空来释放它占用的空间。

还是以上面所说的进程857065为例,进入该进程所打开的所有文件目录,“cd /proc/857065/fd”。找到其中需要释放空间的文件如tr_db.log,然后对其进行写空,“echo “” > tr_db.log”。

 

文章来自个人专栏
UVM
3 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0