linux rm刪除文件原理

很多時候,我們都會發現,某個進程在對當前文件讀寫,但是我們依然能夠rm, 是不是很奇怪?而windows下面,肯定會報錯,”當前文件正在被使用“, 這就得從linux下面刪除文件的原理說起了。
  
  
   Linux是通過link的數量來控制文件刪除的,只有當一個文件不存在任何link的時候,這個文件纔會被刪除。一般來說,每個文件都有2個link計數器:i_count 和 i_nlink。
  
   i_count的意義是當前文件使用者(或被調用)的數量,i_nlink 的意義是介質連接的數量(硬鏈接的數量);可以理解爲i_count是內存引用計數器,i_nlink是磁盤的引用計數器。
  
  當一個文件被某一個進程引用時,對應i_count數就會增加;當創建文件的硬鏈接的時候,對應i_nlink數就會增加。
  
   對於刪除命令rm而言,實際就是減少磁盤引用計數i_nlink。這裏就會有一個問題,如果一個文件正在被某個進程調用,而用戶卻執行rm操作把文件刪除了,那麼會出現什麼結果呢?當用戶執行rm操作刪除文件後,再執行ls或者其他文件管理命令,無法再找到這個文件了,但是調用這個刪除的文件的進程卻在繼續正常執行,依然能夠從文件中正確的讀取及寫入內容。這又是爲什麼呢?
  
  這是因爲rm操作只是將文件的i_nlink減少了,如果沒其它的鏈接i_nlink就爲0了;但由於該文件依然被進程引用,因此,此時文件對應的i_count並不爲0,所以即使執行rm操作,但系統並沒有真正刪除這個文件,當只有i_nlink及i_count都爲0的時候,這個文件纔會真正被刪除。也就是說,還需要解除該進程的對該文件的調用纔行。
  
  以上講的i_nlink及i_count是文件刪除的真實條件,但是當文件沒有被調用時,執行了rm操作刪除文件後是否還可以找回被刪的文件呢?
  
  前面說了,rm操作只是將文件的i_nlink減少了,或者說置0了,實際就是將文件名到inode的鏈接刪除了,此時,並沒有刪除文件的實體即(block數據塊),此時,如果及時停止機器工作,數據是可以找回的,如果此時繼續寫入數據,那麼當新數據就可能會被分配到被刪除的數據的block數據塊,此時,文件就會被真正的回收了

 

備註:根據以上原理,實際情況會出現以下問題,web服務器磁盤空間不夠了,刪除了所有無用日誌還是先是磁盤空間不足,但是用du -sh /*發現磁盤空間佔用的遠小於硬盤總大小,這就是因爲只刪除了一個i_nlink,而還有其他進程在使用着這些log文件,apache或者tomcat,重啓再看就ok了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章