linux系統下檔案誤刪除該如何恢復?

字母哥部落格發表於2022-05-25

一、linux誤刪除資料的場景

在實際的工作中,朋友們可能會將linux伺服器上的檔案不小心誤刪除掉了。而且越是資歷老的工程師越容易犯這樣的錯誤,敲程式碼的速度也是夠快,啪啪rm -rf一個回車,然後就是打臉時刻 。新人操作檔案時往往戰戰兢兢、反覆確認,反而不容易出錯。如果你也是一個有多年工作經驗的工程師,也給自己提個醒:淹死的都是會水的。我們需要區分兩種場景來進行誤刪除檔案的恢復:

  • 第一種場景:被刪除的檔案正在被程式使用
  • 第二種場景:檔案沒有被任何程式使用

第一種場景的資料恢復相對簡單一些。

二、場景一資料恢復實驗

第一種場景:被刪除的檔案正在被其他程式使用。我們先建立一個獨立目錄testdel,用於完成我們的實驗。然後使用echo命令建立一個檔案test-recovery.txt,放在testdel目錄下,檔案內容是:"test file delete recovery"。重點來了:我們使用命令tail來一直監聽這個檔案,表示這個檔案一直被tail程式監聽佔用。

$ mkdir ./testdel;
$ echo "test file delete recovery"  > ./testdel/test-recovery.txt;
$ tail -f ./testdel/test-recovery.txt;

此時我們新開啟一個linux終端,完成檔案刪除操作,檔案刪除之後使用ls命名在該目錄下檢視不到任何的檔案。

$ rm -fr ./testdel/test-recovery.txt;
$ ls -l ./testdel

下面我們來進行檔案的恢復,執行下文中的lsof命令,在其返回結果中我們可以看到test-recovery.txt (deleted)被刪除了,但是其存在一個程式tail使用它,tail程式的程式編號是1535。

$ lsof | grep test-recovery.txt;
tail      1535        kafka    3r      REG  253,2        26  34095906 /home/kafka/testdel/test-recovery.txt (deleted)

然後我們使用cd /proc/1535/fd命令進入該程式的檔案目錄下,1535是tail程式的程式id,這個檔案目錄裡包含了若干該程式正在開啟使用的檔案。

我們看到檔名為3的檔案,就是我們剛剛“誤刪除”的檔案,所以我們使用下面的cp命令把它恢復回去。至此,有程式引用的檔案誤刪除恢復就完成了。

cp ./3 /home/kafka/testdel/test-recovery.txt;

三、場景二資料恢復

對於場景二,沒有程式使用該檔案,則該檔案被刪除之後進行檔案恢復就稍微麻煩一些了。首先我們要區分當前作業系統掛載的磁碟目錄的檔案格式,比如:執行cat /etc/fstab得到如下的結果

除了xfs磁碟檔案格式,linux常用的還有ext4的磁碟檔案格式。每種磁碟檔案格式,資料恢復的方式,使用到的工具都是不一樣的。鑑於篇幅的問題,我就不在本文中介紹了,請關注我我會繼續更新!

四、深入-為什麼資料可以恢復?

第一種情況:當某個檔案正在被某個程式使用時,linux針對該檔案有兩個計數器

  • i_count計數器:該檔案可能被多個程式使用,每一個程式使用該檔案,i_count數值都會加1。反之,程式釋放該檔案的引用,則該計數器減1
  • i_nlink作用是記錄該檔案產生的硬連結的次數(在linux種可以使用ln命令建立檔案的硬連結)。

當以上兩個計數器都為0的時候,該檔案實際上就是屬於沒有程式使用它的狀態,就直接被刪除掉了。如果有程式使用它,那麼該檔案的i_count數值不為0,就可以在/proc/<程式id>/fd目錄種找回來

第二種情況:此時沒有程式使用被刪除的檔案,被刪除的檔案的兩個計數器i_count和i_link此時都為0。這個時候我們要理解一個概念

  • 作業系統檔案刪除:作業系統層面的刪除檔案,只是刪除檔案的inode資訊。刪除inode資訊之後,該檔案對於作業系統及作業系統的使用者不可見了。
  • 磁碟檔案物理刪除:我們知道物理磁碟是由一個個資料塊組成的,所以如果想恢復檔案,我們需要找到存放檔案的資料塊block單元,真正在磁碟上儲存檔案的block暫時並未被刪除(準確的說是暫時並未被覆蓋)。

需要注意的是:存放資料塊block單元的檔案內容會一直存在麼?答案是否定的,因為該資料塊的內容被刪除了,所以該資料塊是可以被其他程式重新利用寫入資料的。所以,當你發現你誤刪除了非常重要的檔案時,你需要做的第一件事就是將磁碟從作業系統中unmout,或者停止所有程式向磁碟中寫資料。因為寫作資料操作,可能會佔用覆蓋你"誤刪除檔案"所在資料塊,一旦資料塊被寫的資料寫入覆蓋,你的資料檔案就再也找不回來了。

推薦閱讀:《java併發程式設計》

歡迎關注我的部落格,更多精品知識合集

本文轉載註明出處(必須帶連線,不能只轉文字):字母哥部落格 - zimug.com

覺得對您有幫助的話,幫我點贊、分享!您的支援是我不竭的創作動力!。另外,筆者最近一段時間輸出瞭如下的精品內容,期待您的關注。

相關文章