linux系統下文件誤刪除該如何恢復?
一、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
覺得對您有幫助的話,幫我點贊、分享!您的支援是我不竭的創作動力!。另外,筆者最近一段時間輸出了如下的精品內容,期待您的關注。
- 《kafka修鍊之道》
- 《手摸手教你學Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《實戰前後端分離RBAC許可權管理系統》
- 《實戰SpringCloud微服務從青銅到王者》