liunx删除文件后磁盘未减小

一. 场景一:进程打开此文件

当一个文件正在被一个进程使用时,用户删除此文件,文件只会从目录结构中删除,但并没有从磁盘删除。当使用这个文件的进程结束后,文件才会真正的从磁盘删除,释放占有的空间。

我们发现剩余磁盘空间比较少时,回去删除一些大的临时文件或者log文件,如果删除之后会发现磁盘空间并未减少,那么可以通过“lsof”命令去查看正在使用该文件的进程,然后再重启该进程或者服务。

【例子】

现在发现磁盘空间的占用了99%,剩余空间只剩下522M。

[plain] view plaincopy

  1. SUSE11X64-001:/test # df -h
  2. Filesystem                       Size  Used Avail Use% Mounted on
  3. /dev/sda2                         29G   27G  522M  99% /
  4. devtmpfs                         972M  116K  972M   1% /dev
  5. tmpfs                            972M     0  972M   0% /dev/shm

找到一个文件"vmcore"占用了接近900M空间,但这个文件不需要再使用了,于是采用“rm”命令删除此文件,可是删除后,发现磁盘空间并没有真正的减少。

[plain] view plaincopy

  1. SUSE11X64-001:/test # rm vmcore
  2. SUSE11X64-001:/test # df -h
  3. Filesystem                       Size  Used Avail Use% Mounted on
  4. /dev/sda2                         29G   27G  522M  99% /
  5. devtmpfs                         972M  116K  972M   1% /dev
  6. tmpfs                            972M     0  972M   0% /dev/shm
  7. //10.204.16.2/home/splx/iceking  6.3T  1.6T  4.7T  25% /mnt/iceking

也就是说很有可能有其他进程正在使用这个文件,使用“lsof”命令去查看正在使用该文件的进程。

[plain] view plaincopy

  1. SUSE11X64-001:/test # lsof | grep vmcore
  2. a.out      2610       root    3r      REG                8,2 941331144    1643779 /test/vmcore (deleted)

进程号为2610(进程名为"a.out")的进程,正在使用vmcore文件,也可以看到其后有“deleted”:其表示正在使用的文件被删除,但并没有真正从磁盘上移除。

现在我们删除这个进程,并查看磁盘空间此时占用率降低为95%,剩余空间增加到1.4G。

[plain] view plaincopy

  1. SUSE11X64-001:/test # df -h
  2. Filesystem                       Size  Used Avail Use% Mounted on
  3. /dev/sda2                         29G   26G  1.4G  95% /
  4. devtmpfs                         972M  116K  972M   1% /dev
  5. tmpfs                            972M     0  972M   0% /dev/shm

二. 场景二:内核模块Bug

在文件系统处理文件需要的信息都存放在索引节点(inode)中,如果在删除文件的时候索引节点的引用计数不为0(表示文件正在被使用),则不会在磁盘中真正的删除文件,从而保证正在使用此文件的进程能够正常的处理文件。

首先我们一起来看一下内核中关于文件系统的一些关键数据结构的关联,当一个进程打开一个文件后,便会在内核中创建一个file对象,这个对象主要描述了进程如何与文件进行交互。file对象中将指向一个dentry结构(目录项),目录项中描述了目录项名称,父目录项信息,子目录项信息等。而dentry中的d_inode所指向的inode节点中则包含了实际的文件存储在磁盘上的信息。

当多个进程打开同一个文件时,内核中变会创建相应的file对象,但是他们都公用同一个dentry,只不过每一次打开文件dentry的引用计数d_count加1。并且对于打开的同一个文件而言,inode也是唯一的,inode的引用计数i_count一般为文件硬链接的数目。看过一些中文博客,说“同一个文件,每打开一次,则inode中引用计数i_count则加1”,这种说法通过我的验证结果是错误的。实验结果是:对于同一个文件,每打开一次,则inode中的引用计数不变,但相应的dentry引用计数加1.

这次客户在删除文件后,磁盘空间没有释放,通过"lsof"命令也没有找到正在占用此文件的进程。于是再次怀疑这是由于产品的内核模块早成的。后经分析得到:在上一篇博文《Linux Kernel模块内存泄露查找 (2)》中解释过由于在产品内核模块中,对dentry引用,并使用完之后并没有对其引用计数减1,从而造成内存泄露。在这种情况下,dentry不会被释放,则inode也就一直被引用着,从而也导致了即使删除文件,也不会从磁盘删除。

而且针对以上的问题和分析,如果不能及时给客户修这个问题,那也只能让其重新启动OS,空闲的磁盘空间才会释放出来。

来自:

http://blog.csdn.net/cjf_iceking/article/details/37593963

时间: 2024-11-03 16:00:43

liunx删除文件后磁盘未减小的相关文章

linux删除文件后磁盘空间未释放的问题

很可能是该文件还被其它进程使用. 使用: lsof | grep deleted | grep $FILE_NAME 可以看到正使用该文件的进程,将之kill即可.也可以查看进程来验证: ls -l /proc/3446  

rm -rf 删除文件后磁盘空间不释放

当一个服务器的磁盘空间满了后,执行rm -rf命令以后,磁盘空间没有被释放可以使用lsof | grep delete命令来查看删除进程,然后kill掉相关的进程以后就可以释放空间了 原文地址:http://blog.51cto.com/11742478/2091817

Linux中删除文件,磁盘空间未释放问题追踪

在客户使用我们产品后,发现一个问题:在删除了文件后,磁盘空间却没有释放.是有进程在打开这个文件,还是其他情况?我们一起来看看一下两个场景 一. 场景一:进程打开此文件 当一个文件正在被一个进程使用时,用户删除此文件,文件只会从目录结构中删除,但并没有从磁盘删除.当使用这个文件的进程结束后,文件才会真正的从磁盘删除,释放占有的空间. 我们发现剩余磁盘空间比较少时,回去删除一些大的临时文件或者log文件,如果删除之后会发现磁盘空间并未减少,那么可以通过"lsof"命令去查看正在使用该文件的

解决磁盘满了,删除文件后仍然饱满问题

df -hT  查看磁盘使用率为100% du -sh * 查看目录下所有文件夹大小 删除大文件后磁盘依然为100%,用 /usr/sbin/lsof|grep deleted 查看哪些进程占用 然后kill 掉找出的文件句柄 OK 原文地址:http://blog.51cto.com/xiaorenwutest/2133765

删除文件后,磁盘空间没有释放的处理记录

问题说明: IDC里的一台服务器的/分区使用率爆满了!已达到100%!经查看发现有个文件过大(80G),于是在跟有关同事确认后rm -f果断删除该文件.但是发现删除该文件后,/分区的磁盘空间压根没有释放出来,使用率还是100%!这是为什么呢?? [[email protected] ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup00-LogVol00 58G 7.8G 47G 100% / tmp

linux 删除文件后空间没有释放的解决办法

清空没用的文件,当我删除文件后,发现可用空间沒有变化 os:centos4.7 现象: 发现当前磁盘空间使用情况: [[email protected] ~]# df -hFilesystem            Size  Used Avail Use% Mounted on/dev/sda1             981M  203M  729M  22% /none                   16G     0   16G   0% /dev/shm/dev/sda9    

Xcode4删除文件后missing file警告

1.运行终端,执行命令行进入missing file目录,然后运行 svn delete nameOfMissingFile或git rm nameOfMissingFile 2.删除隐藏的.svn文件.命令行运行defaults write com.apple.finder AppleShowAllFiles TRUE?killall Finder开启显示隐藏文件,然后到工程目录下删除.svn文件,然后再恢复defaults write com.apple.finder AppleShowAl

RHEL6删除文件后未释放空间

早上一个网站页面打开空白,后来查看是磁盘空间满了,查看是nginx的access.log占用了170多个G,于是通过rm将其删除,后重启nginx问题依然,此时再查看磁盘发现空间并未释放 [[email protected] logs]# du -h * 176G access.log 0 error.log 4.0K nginx.pid [[email protected] logs]# du -sh  176G . [[email protected] logs]# rm access.lo

linux 磁盘删除文件后无法释放空间

预上线环境测试人员发现磁盘空间沾满,于是使用df -h 和 du -sh * 找到了大文件,并删除. 但并未释放空间,df -h 还是显示占用率为100%,此时du -sh * 显示占用只有7G,与df -h 查看到的内容不符. 在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接.然而如果文件是被程序占用的,则无法真正的清理磁盘空间,文件还是物理存在的. 此时使用lsof | grep deleted 查看 [[email protected] /]