Linux系统下提示磁盘空间满,但实际占用却很小问题解决

转载:http://blog.youkuaiyun.com/xx123er/article/details/51656218

现象:删除log后df看空间未释放

解决方案:1.rm删除文件后,用lsof | grep XXX 查找使用该文件的进程,kill进程即可立即释放空间。

                  2.更好的方法是使用echo " ">file命令在线清空该文件。

具体原因分析和具体命令使用请详细阅读如下内容:

复现现象:1.写一个python程序,从public.log不停的复制内容写文件abc.txt

                    
 

                 2. 运行程序后,看当前路径下文件

                  

                3,查看空间和df占用,删除正在被写的文件abc.txt,再次查看空间占用

                  

               可以看到删除了文件,空间并没有释放,反而还在增加。

               4.查看是什么进程占用了该文件,有两个python进程占用了该文件,后面的(deleted)表示该文件是已删除的

                  

              5.杀掉进程后,空间立即释放

             

更好的解决办法:

        上面复现的过程已经有最基础的解决方案,就是找到占用文件的进程,杀进程,删文件,此解决方案太过粗暴,有以下理由

              理由一:服务器中某些打log的进程是不能随意删除。

              理由二:某个文件可能被多个进程占用,或者几十个进程占用,想释放空间就得杀掉所以进程。

        解决方案二:采用将该文件置空的办法,执行echo " " >abc.txt

             该方案可以在线清空log,但亲测执行时间过长,可能是我每秒写600m的进程太特殊导致。需要权衡,若可以等或者进程不能停,就采用此方法,否则就采用kill进程的方法。

          

             

原因探索:        

Linux下文件的存储机制和存储结构:

            一个文件在文件系统中的存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,数据被删除后,这个指针就从meta-data中清除了,而数据部分存储在磁盘中,数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以出现删除abc.txt文件后,空间还没释放,就是因为python进程还在一直向这个文件写入内容,导致虽然删除了abc.txt文件,但文件对应的指针部分由于进程锁定,并未从meta-data中清除,而由于指针并未被删除,那么系统内核就认为文件并未被删除,因此通过df命令查询空间并未释放也就不足为奇了。          

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

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


           当多个进程打开同一个文件时,内核中变会创建相应的file对象,但是他们都公用同一个dentry,只不过每一次打开文件dentry的引用计数d_count加1。并且对于打开的同一个文件而言,inode也是唯一的,inode的引用计数i_count一般为文件硬链接的数目。

验证上述说明:

1.后台往abc.txt写的脚本没停,继续写,将文件重命名为abc.log


2.删除重命名后的文件


3.删除后用df命令发现所占空间没有减小,查看占用进程发现abc.txt没有进程占用,重命名后的abc.log有进程占用,说明重命名该文件,但inode并没有改变,linux通过inode来查找对应文件,所以继续往重命名后的文件写入。

         Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

<think>嗯,用户问的是如何在Linux中使用df -h命令查看磁盘空间。首先,我需要确认df命令的基本用法,以及-h参数的作用。根据提供的引用资料,引用[1]和[2]都提到df -h是以人类可读的格式显示磁盘使用情况,比如用GB、MB而不是字节。引用[3]还解释了设备名的含义,比如/dev/sda10的分区信息。 接下来,我应该分步骤说明使用方法。首先介绍命令的基本格式,然后解释各个参数,比如-h、-a、--total等。需要确保用户知道如何执行命令,以及输出中各列的含义,比如文件系统、容量、已用、可用等。可能还需要提到挂载点的重要性,这样用户知道哪个分区对应哪个目录。 另外,用户可能不知道其他有用的参数,比如--total显示总和,或者-i显示inode信息。这些可以作为高级用法补充,帮助用户更全面地管理磁盘空间。还要注意示例的准确性,比如示例中的输出是否合理,是否包含关键信息。 用户的实际需求可能不仅仅是运行命令,还可能包括如何解读结果,比如识别哪个分区快了,或者如何定位问题所在。因此,解释输出结果的部分很重要,需要详细说明每一列的意义,并给出实际例子,比如当可用空间不足时应该如何处理。 最后,生成的相关问题需要考虑用户可能的后续疑问,比如其他查看磁盘的命令,如du,或者如何清理空间。这些问题可以帮助用户进一步解决问题,提升他们的使用体验。</think>### Linux查看磁盘空间命令`df -h`使用详解 #### 一、命令基本格式 在Linux系统中,使用`df -h`命令可以快速查看文件系统磁盘空间占用情况,并以**人类可读格式**(如GB、MB)显示结果。命令格式为: ```bash df [选项] [文件或目录] ``` #### 二、参数解析与常用场景 1. **基础用法** ```bash df -h ``` - **输出列说明**: - `文件系统`:磁盘分区或存储设备名称(如`/dev/sda1`)[^3] - `容量`:分区总大小(如`50G`) - `已用`:已占用的空间 - `可用`:剩余可用空间 - `已用%`:使用百分比 - `挂载点`:分区在系统中的访问路径(如`/home`) **示例输出**: ``` Filesystem Size Used Avail Use% Mounted on /dev/sda1 50G 30G 18G 63% / tmpfs 3.9G 0 3.9G 0% /dev/shm ``` 2. **扩展参数** - `-a`:显示所有文件系统(包括伪文件系统如`tmpfs`) - `--total`:在末尾添加汇总行 - `-T`:显示文件系统类型(如ext4、xfs) - `-i`:查看inode使用情况(适用于文件数量监控) #### 三、典型应用场景 1. **快速定位磁盘问题** 当服务器出现磁盘空间不足时,执行: ```bash df -h | grep -E "(90%|95%|100%)" # 筛选使用率超过90%的分区 ``` 2. **结合目录路径分析** 若需查看**特定目录所在分区的空间**: ```bash df -h /var/log # 显示/var/log目录所在分区的使用情况 ``` #### 四、注意事项 - 若遇到`/dev/sda`等设备名,`sda`表示第一块SATA硬盘,`sda1`是其第一个分区 - 使用`df -Th`可同时查看**文件系统类型**(如ext4、xfs)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值