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

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

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