您好,欢迎来到宝玛科技网。
搜索
您的当前位置:首页Linux系统删除文件后空间并没有释放的处理

Linux系统删除文件后空间并没有释放的处理

来源:宝玛科技网
Linux系统删除⽂件后空间并没有释放的处理

⼀、现象描述

操作系统:CentOS 6.8 x

使⽤ df -h 命令,看见 / 根⽬录下磁盘空间已满(100%),于是⼿动清理⼤⽇志⽂件。

[root@local ~]# df -h

Filesystem Size Used Avail Use% Mounted on/dev/mapper/rootvg-LogVol00 59G 59G 0 100% //dev/sda1 190M 13M 168M 8% /boottmpfs 2.0G 0 2.0G 0% /dev/shm

通过 du -sh 命令,找到占⽤⼤量空间的⽇志⽂件,于是使⽤ rm -rf 删除了它。

[root@local ~]# cd /var/nginx/logs/

[root@local ~]# rm -rf t-access.log t-error.log

然后 查看磁盘空间的使⽤情况,发现 / (根⽬录)的空间并没有发⽣变化。但是可以看到 Used 发⽣了变化。

[root@local ~]# df -h

Filesystem Size Used Avail Use% Mounted on/dev/mapper/rootvg-LogVol00 59G 56G 0 100% //dev/sda1 190M 13M 168M 8% /boottmpfs 2.0G 0 2.0G 0% /dev/shm

这是怎么回事呢?

⼆、原因

未释放磁盘空间的原因:

在Linux或者Unix系统中,通过rm或者⽂件管理器删除⽂件将会从⽂件系统的⽂件夹结构上解除链接(unlink),然⽽假设⽂件是被打开的(有⼀个进程正在使⽤),那么进程将仍然能够读取该⽂件,磁盘空间也⼀直被占⽤。⽽我删除的是nginx的访问⽇志⽂件,在删除的时候该⽂件正在被使⽤。

三、解决办法

⾸先获得⼀个已经被删除的可是仍然被应⽤程序占⽤的⽂件列表。操作如下:

[root@local ~]# lsof |grep deleted

nginx 4399 root 38w REG 253,0 19304448 10835682 /var/nginx/logs/t-access.log (deleted)nginx 4399 root 39w REG 253,0 3502080 10835684 /var/nginx/logs/t-error.log (deleted)

nginx 4401 nobody 38w REG 253,0 19304448 10835682 /var/nginx/logs/t-access.log (deleted)nginx 4401 nobody 39w REG 253,0 3502080 10835684 /var/nginx/logs/t-error.log (deleted)nginx 4402 nobody 38w REG 253,0 19304448 10835682 /var/nginx/logs/t-access.log (deleted)nginx 4402 nobody 39w REG 253,0 3502080 10835684 /var/nginx/logs/t-error.log (deleted)nginx 4403 nobody 38w REG 253,0 19304448 10835682 /var/nginx/logs/t-access.log (deleted)nginx 4403 nobody 39w REG 253,0 3502080 10835684 /var/nginx/logs/t-error.log (deleted)nginx 4404 nobody 38w REG 253,0 19304448 10835682 /var/nginx/logs/t-access.log (deleted)nginx 4404 nobody 39w REG 253,0 3502080 10835684 /var/nginx/logs/t-error.log (deleted)

从输出的结果可以看到 /var/nginx/logs/t-access.log 和 t-error.log 还在被使⽤中,所以导致未释放空间。

那么如何让进程释放呢?

⽅法1:直接 kill 掉相应的进程,或者停掉使⽤这个⽂件的应⽤,让操作系统⾃⼰主动回收磁盘空间。

由于还有其他项⽬正在使⽤该应⽤(nginx服务),所以不能停掉nginx服务,于是使⽤ kill 命令删除相应的进程。

[root@local ~]# kill -9 4399[root@local ~]# kill -9 4401[root@local ~]# kill -9 4402[root@local ~]# kill -9 4403[root@local ~]# kill -9 4404

再次,查看磁盘空间的使⽤情况,发现空间已经被回收了。

[root@local ~]# df -h

Filesystem Size Used Avail Use% Mounted on/dev/mapper/rootvg-LogVol00 59G 56G 0 95% //dev/sda1 190M 13M 168M 8% /boottmpfs 2.0G 0 2.0G 0% /dev/shm

⽅法2:以后清理正在被读写的⼤⽇志⽂件时,直接使⽤ echo \"\" > xxx.log 命令,即直接将⽂件置空,并不影响服务的使⽤,⽂件⼤⼩也被控制下来,磁盘空间也释放了。

说明:

当Linux打开⼀个⽂件的时候,Linux内核会为每个进程在/proc/ 『/proc/nnnn/fd/⽂件夹(nnnn为pid)』建⽴⼀个以其pid为名的⽂件夹⽤来保存进程的相关信息,⽽其⼦⽂件夹fd保存的是该进程打开的全部⽂件的fd(fd:file descriptor)。

kill进程是通过截断proc⽂件系统中的⽂件能够强制要求系统回收分配给正在使⽤的的⽂件。这是⼀项⾼级技术,仅到管理员确定不会对执⾏中的进程造成影响时使⽤。应⽤程序对这样的⽅式⽀持的并不好,当⼀个正在使⽤的⽂件被截断可能会引发不可预知的问题。

四、删除原理

⼀般来说,不会出现删除⽂件后空间不释放的情况,但是也存在例外,⽐如⽂件被进程锁定,或者有进程在使⽤这个⽂件,例如输出⽇志⽂件,

要了解这个问题,就需要知道Linux下⽂件的存储机制和存储结构。

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baomayou.com 版权所有 赣ICP备2024042794号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务