當一個文件正在被一個進程使用時,用戶刪除此文件,文件只會從目錄結構中刪除,但並無從磁盤刪除。當使用這個文件的進程結束後,文件纔會真正的從磁盤刪除,釋放佔有的空間。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節點中則包含了實際的文件存儲在磁盤上的信息。對象
當多個進程打開同一個文件時,內核中變會建立相應的file對象,可是他們都公用同一個dentry,只不過每一次打開文件dentry的引用計數d_count加1。而且對於打開的同一個文件而言,inode也是惟一的,inode的引用計數i_count通常爲文件硬連接的數目。blog
此次刪除文件後,磁盤空間沒有釋放,經過"lsof"命令也沒有找到正在佔用此文件的進程。因而再次懷疑這是因爲產品的內核模塊早成的。索引
並且針對以上的問題和分析,若是不能及時給客戶修這個問題,那也只能讓其從新啓動OS,空閒的磁盤空間纔會釋放出來。進程