刪除檔案後,磁碟空間沒有釋放的處理記錄

散盡浮華發表於2017-03-06

 

問題說明:IDC裡的一臺伺服器的/分割槽使用率爆滿了!已達到100%!經檢視發現有個檔案過大(80G),於是在跟有關同事確認後rm -f果斷刪除該檔案。但是發現刪除該檔案後,/分割槽的磁碟空間壓根沒有釋放出來,使用率還是100%!這是為什麼呢??

[root@linux-node1 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                       58G  7.8G   47G  100% /
tmpfs                 1.9G     0  1.9G   0% /dev/shm
/dev/vda1             190M   72M  108M  40% /boot

原因分析:
在Linux或者Unix系統中,通過rm或者檔案管理器刪除檔案,只是將它會從檔案系統的目錄結構上解除連結(unlink),也就是說只是刪除了檔案和系統目錄結構的連結;如果檔案在刪除時是被開啟的(有一個程式正在使用該檔案,檔案被程式鎖定或者有程式一直在向這個檔案寫資料等)狀態,那麼程式將仍然可以讀取該檔案,也就是說沒有刪除掉檔案在讀取的狀態,所以磁碟空間也就會一直被佔用。

一個檔案在檔案系統中的存放分為兩個部分:資料部分和指標部分,指標位於檔案系統的meta-data中,資料被刪除後,這個指標就從meta-data中清除了,而資料部分儲存在磁碟中,資料對應的指標從meta-data中清除後,檔案資料部分佔用的空間就可以被覆蓋並寫入新的內容,之所以出現刪除檔案後,空間還沒釋放,就是因為有程式還在一直向這個檔案寫入內容,導致雖然刪除了檔案,但檔案對應的指標部分由於程式鎖定,並未從meta-data中清除,而由於指標並未被刪除,那麼系統核心就認為檔案並未被刪除,因此通過df命令查詢空間並未釋放也就不足為奇了。

解決措施有以下幾種:
1)通過lsof|grep deleted命令獲取到已經被刪除但是仍然被應用程式佔用的檔案列表,然後kill掉還在佔用所刪除檔案的程式。需要注意的是:如果有很多程式都在使用所刪除檔案,那麼採用第1種方式kill程式就有點麻煩了,而且風險也比較大。因為kill程式是通過截斷proc檔案系統中的檔案可以強制要求系統回收分配給正在使用的的檔案。必須要確定不會對執行中的程式造成影響時才能使用,應用程式對這種方式支援的並不好,當一個正在使用的檔案被截斷可能會引發不可預知的問題。
2)或停掉或重啟使用這個所刪除檔案的應用,讓OS自動回收磁碟空間。
3)也可以重啟作業系統,不過這並不是最好的方法
4)對待這種程式不停對檔案寫日誌的操作,要釋放檔案佔用的磁碟空間,最好的方法是線上清空這個檔案。通過這種方法,磁碟空間不但可以馬上釋放,也可保障程式繼續向檔案寫入日誌。
線上清空檔案(比如/home/wangshibo.log)的方式:

a)# echo " " > /home/wangshibo.log
b)# cat /dev/null > /home/wangshibo.log
c)# > /home/wangshibo.log

還有一種磁碟空間使用問題的現象:明明使用df -h命令檢視磁碟空間使用率不算高,還有很多空餘空間,但是建立檔案或寫入資料時一直報錯磁碟寫滿:“no space left on device”!
這個參考:由索引節點(inode)爆滿引發的問題

相關文章