Linux檔案刪除但空間不釋放問題篇

陳(程)序員發表於2020-09-23

通常報磁碟不足的錯誤,有兩個原因:
•磁碟空間滿:可以通過df -h命令檢視磁碟的使用情況。
•磁碟inode資源佔用完:可以通過df -i命令檢視,確認inode節點使用率;

如果是inode資源佔用完,是因為使用的小檔案過多導致的。但如果是磁碟空間滿,我們需要刪除檔案,擠出空間來,但發現磁碟空間根本沒減少。這就需要了解rm刪除檔案原理。

rm刪除檔案原理
Linux是link的數量來控制檔案刪除的。只有當一個檔案不存在任何link的時候,這個檔案才會被刪除。一般來講,每個檔案都有兩個link計數器:i_count和i_nlink
•i_count的意義是當前檔案使用者(或被呼叫)的數量
當一個檔案被某一個程式引用時,對應的這個值就會增加
•i_nlink的意義是介質連線的數量(硬連結的數量)
當建立檔案的硬連結的時候,這個值就會增加

rm操作只是將檔案的i_nlink減少了,實際就是將檔名到inode的連結刪除了,如果沒有其它的連結,i_nlink就為0。但是由於該檔案依然被程式引用,因此,此時檔案對應的i_count並不為0,所以執行rm操作,系統並沒有真正的刪除這個檔案,只有當i_nlink和i_count都為0的時候,這個檔案才會被真正的刪除。也就是說,必須要解除該程式對該檔案的呼叫,才能真正的刪除。

解決方案

lsof | grep deleted

當發現刪除檔案後,磁碟的空間還是沒有變,庫使用使用以上命令,獲得一個已經被刪除但是仍然被應用程式佔用的檔案列表,然後可以kill 掉相關程式即可強制要求系統回收分配給正在使用的的檔案,這樣就可以釋放次磁碟資源。

注:系統中,只有已釋放的檔案資料塊被重用其中資料被覆蓋時,原檔案資料才算刪除掉。

相關文章