在實際的工作中,朋友們可能會將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針對該檔案有兩個計數器
當以上兩個計數器都為0的時候,該檔案實際上就是屬於沒有程序使用它的狀態,就直接被刪除掉了。如果有程序使用它,那麼該檔案的i_count數值不為0,就可以在/proc/<程序id>/fd
目錄種找回來
第二種情況:此時沒有程序使用被刪除的檔案,被刪除的檔案的兩個計數器i_count和i_link此時都為0。這個時候我們要理解一個概念
需要注意的是:存放資料塊block單元的檔案內容會一直存在麼?答案是否定的,因為該資料塊的內容被刪除了,所以該資料塊是可以被其他程序重新利用寫入資料的。所以,當你發現你誤刪除了非常重要的檔案時,你需要做的第一件事就是將磁碟從作業系統中unmout,或者停止所有程序向磁碟中寫資料。因為寫作資料操作,可能會佔用覆蓋你"誤刪除檔案"所在資料塊,一旦資料塊被寫的資料寫入覆蓋,你的資料檔案就再也找不回來了。
推薦閱讀:《java並行程式設計》
本文轉載註明出處(必須帶連線,不能只轉文字):字母哥部落格 - zimug.com
覺得對您有幫助的話,幫我點贊、分享!您的支援是我不竭的創作動力!。另外,筆者最近一段時間輸出瞭如下的精品內容,期待您的關注。