在删除了文件后,磁盘空间却没有释放

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

    咱们发现剩余磁盘空间比较少时,回去删除一些大的临时文件或者log文件,若是删除以后会发现磁盘空间并未减小,那么能够经过“lsof”命令去查看正在使用该文件的进程,而后再重启该进程或者服务。bash

 

SUSE11X64-001:/test # df -h
Filesystem                       Size  Used Avail Use% Mounted on
/dev/sda2                         29G   27G  522M  99% /
devtmpfs                         972M  116K  972M   1% /dev
tmpfs                            972M     0  972M   0% /dev/shm
找到一个文件"vmcore"占用了接近900M空间,但这个文件不须要再使用了,因而采用“rm”命令删除此文件,但是删除后,发现磁盘空间并无真正的减小。

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

也就是说颇有可能有其余进程正在使用这个文件,使用“lsof”命令去查看正在使用该文件的进程。
数据结构


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

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


  如今咱们删除这个进程,并查看磁盘空间此时占用率下降为95%,剩余空间增长到1.4G。spa

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


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

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

wKiom1RZlISxJLVLAACqw48FNkc082.jpg

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

    此次删除文件后,磁盘空间没有释放,经过"lsof"命令也没有找到正在占用此文件的进程。因而再次怀疑这是因为产品的内核模块早成的。索引

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

相关文章
相关标签/搜索