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

在客户使用我们产品后,发现一个问题:在删除了文件后,磁盘空间却没有释放。是有进程在打开这个文件,还是其他情况?我们一起来看看一下两个场景

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

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

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

【例子】

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

[plain] view plain copy
  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 plain copy
  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 plain copy
  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 plain copy
  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

二. 场景二:文件有硬链接

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

三. 场景三:内核模块Bug

我们一起来看一下内核中关于文件系统的一些关键数据结构的关联,当一个进程打开一个文件后,便会在内核中创建一个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,空闲的磁盘空间才会释放出来。

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

  1. Linux fs清理文件,linux找出已经删除但磁盘空间未释放的大文件并清空

    linux找出已经删除但磁盘空间未释放的大文件并清空 1.找出已经删除但磁盘空间未释放的文件 如果文件已经删除,但实际的磁盘空间未释放,这个时候文件句柄fd相关信息还在内存中,可以通过lsof命令找出 ...

  2. linux找出已经删除但磁盘空间未释放的大文件并清空

    1.找出已经删除但磁盘空间未释放的文件 如果文件已经删除,但实际的磁盘空间未释放,这个时候文件句柄fd相关信息还在内存中,可以通过lsof命令找出,比如打开文件的pid和读写文件的系统fd. lsof ...

  3. Linux删除文件后空间未释放问题处理方法

    前言 当系统空间使用量过大需要清理空间或者清理某个文件时,有时会出现执行了删除命令之后磁盘空间并没有释放,很多人首次遇到该情况时会比较困惑,在考虑是不是像windows系统的回收站一样,删除只是逻辑删 ...

  4. 有时候Mac下删除文件磁盘空间无法释放

    http://vela.diandian.com/post/2012-09-15/40038173334 首先呢,不知道是不是我这里才遇到:删除文件(之后清理掉Trash)或者用rm -rf直接命令行 ...

  5. Linux删除大文件后磁盘空间未释放问题

    前言 工作中经常遇到Linux系统磁盘空间不足,但是删除后较大的日志文件后,发现磁盘空间仍没有被释放,有点摸不着头脑,今天博主带大家解决这个问题. 思路 1.工作发现磁盘空间不足: 2.找到占用磁盘空 ...

  6. 【linux】文件已经删除,但空间未释放怎么办

    文件已经删除,但空间未释放怎么办?** 问题现象 Linux操作系统云服务器根目录空间占用率过高.例如,以图1为例,根目录空间占用率为96%. 图1 根目录空间占用率过高 点击放大 查询当前系统存在一 ...

  7. LINUX文件已删除但磁盘空间不释放

    LINUX文件已删除但磁盘空间不释放 转自:http://www.jb51.net/LINUXjishu/224652.html 1.错误现象 运维的监控系统发来通知,报告一台服务器空间满了,登陆服务 ...

  8. HDFS删除文件之后空间不释放,LINUX删除文件之后空间不释放

    删除文件之后空间不释放在我这遇到的情况主要有两种: 1.hdfs删除文件之后空间不释放 针对此种情况主要是hdfs的回收站功能,为了防止文件误删除,删除的文件会先放到回收站里. 删除的时候也可以直接彻 ...

  9. 解决linux删除文件后空间没有释放问题

    为什么80%的码农都做不了架构师?>>>    inux删除文件后沒有释放空间 今天发现一台服务器的home空间满了,于是要清空没用的文件,当我删除文件后,发现可用空间沒有变化 os ...

  10. linux中删除文件的命令

    在Linux中有很多方法可以删除目录,在图形化界面可以利用文件管理器,或者通过终端删除.本文将介绍在文本界面使用命令删除目录. 在Linux中有很多方法可以删除目录,在图形化界面可以利用文件管理器,或 ...

最新文章

  1. 一个简单json数据提交实例
  2. 【项目管理】工具--数据收集
  3. uibmodal模态框打开另一个模态框_进阶版神笔:只需一句话、一个故事,即可生成画面...
  4. 用计算机完成下表的视距测量计算公式,测量学计算题.doc
  5. 阿里云mysql服务器太贵_阿里云数据库,跟自己在服务器安装的有什么区别?有人说安装很简单,那为什么要花钱买?...
  6. background-size
  7. Jetty 9.1上的Java WebSockets(JSR-356)
  8. springtboot 引用子工程的文件_xmake从入门到精通11:如何组织构建大型工程
  9. java静态链表_静态链表及其创建(C语言实现)
  10. 基于创芯CAN分析仪ControlCAN.dll的C#二次开发库
  11. 如何同时分析顺心捷达多个已签收单号的物流信息
  12. Excel怎么实现表格数据行间随机打乱排序
  13. 【科技论文的写作程序及方法】
  14. redis创建集群,redis-trib.rb命令详解
  15. 5.用转换器抽取特征
  16. uni-app H5中使用wx-open-launch-weapp打开微信小程序
  17. 基于关键链的项目风险管理
  18. SpringCloud疑难杂症
  19. Ansible简介及各模块用法实操
  20. Linux 获取毫秒级时间戳

热门文章

  1. 电子计算机硬件是由哪五个部分构成,计算机硬件系统由哪五个基本部分组成?...
  2. cdr CorelDRAW Graphics Suite 2021 (v23.1.0)
  3. graphs菜单_spss菜单栏中英文对照.ppt
  4. 手动获取我们所感兴趣网站X.509证书的一般方法
  5. glibc-2.23-free
  6. UE4打包工程失败问题记录
  7. 自己制作一个html网页链接,怎么制作自己的网页链接,学生个人网页制作方法...
  8. 阿里面试经历与感受谈
  9. wireshark推荐书籍
  10. ERP系统借贷关系表