天天看點

《高性能Linux伺服器建構實戰:系統安全、故障排查、自動化運維與叢集架構》——3.5 實戰:extundelete恢複資料的過程

本節書摘來自華章計算機《高性能linux伺服器建構實戰:系統安全、故障排查、自動化運維與叢集架構》一書中的第3章,第3.5節,作者:高俊峰著, 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

在資料被誤删除後,第一時間要做的是解除安裝被删除資料所在的磁盤或磁盤分區,如果是系統根分區的資料遭到誤删除,就需要将系統進入單使用者,并且将根分區以隻讀模式挂載。這樣做的原因很簡單,因為将檔案删除後,僅僅是将檔案的inode結點中的扇區指針清零,實際檔案還存儲在磁盤上,如果磁盤以讀寫模式挂載,這些已删除的檔案的資料塊就可能被作業系統重新配置設定出去,在這些資料塊被新的資料覆寫後,這些資料就真的丢失了,恢複工具也無力回天。是以,以隻讀模式挂載磁盤可以盡量降低資料塊中資料被覆寫的風險,以提高恢複資料成功的比率。

3.5.1 通過extundelete恢複單個檔案

1 . 模拟資料誤删除環境

在示範通過extundelete恢複資料之前,我們首先要模拟一個資料誤删除環境,這裡我們以ext3檔案系統為例,在ext4檔案系統下的恢複方式與此完全一樣。簡單的模拟操作過程如下:

2 . 解除安裝磁盤分區

在将資料誤删除後,立刻需要做的就是解除安裝這塊磁盤分區:

3 . 查詢可恢複的資料資訊

通過extundelete指令可以查詢/dev/sdc1分區可恢複的資料資訊:

根據上面的輸出,标記為deleted狀态的是已經删除的檔案或目錄。同時還可以看到每個已删除檔案的inode值,接下來就可以恢複檔案了。

4 . 恢複單個檔案

執行如下指令開始恢複檔案:

extundelete恢複單個檔案的參數是“--restore-file”,這裡需要注意的是,“--restore-file”後面指定的是恢複檔案路徑,這個路徑是檔案的相對路徑。相對路徑是相對于原來檔案的存儲路徑而言的,比如,原來檔案的存儲路徑是/data/passwd,那麼在參數後面直接指定passwd檔案即可,如果原來檔案的存儲路徑是/data/test/mytest.txt,那麼在參數後面通過“test/mytest.txt”指定即可。

在檔案恢複成功後,extundelete指令預設會在執行指令的目前目錄下建立一個recovered_files目錄,此目錄用于存放恢複的檔案,是以執行extundelete指令的目前目錄必須是可寫的。

根據上面的輸出,通過md5sum指令校驗,校驗碼與之前的完全一緻,表明檔案恢複成功。

3.5.2 通過extundelete恢複單個目錄

extundelete除了支援恢複單個檔案,也支援恢複單個目錄,在需要恢複目錄時,通過“--restore-directory”選項即可恢複指定目錄的所有資料。

繼續在上面模拟的誤删除資料環境下操作,現在要恢複/data目錄下的ganglia-3.4.0檔案夾,操作如下:

可以看到之前删除的目錄ganglia-3.4.0已經成功恢複了,進入這個目錄檢查發現:所有檔案内容和大小都正常。

3.5.3 通過extundelete恢複所有誤删除資料

當需要恢複的資料較多時,一個個地指定檔案或目錄将是一項非常繁重和耗時的工作,不過,extundelete考慮到了這點,此時可以通過“--restore-all”選項來恢複所有被删除的檔案或檔案夾。

仍然在上面模拟的誤删除資料環境下操作,現在要恢複/data目錄下所有資料,操作過程如下:

可以看到所有資料全部完整地恢複了。

3.5.4 通過extundelete恢複某個時間段的資料

有時候删除了大量的資料量,其中很多資料都是沒用的,我們僅需要恢複其中的一部分資料,此時,如果采用恢複全部資料的辦法,不但耗時,而且浪費資源,在這種情況下,就需要采用另外的一種恢複機制有選擇地恢複,extundelete提供了“--after”和“--before”參數,可以通過指定某個時間段,進而隻恢複這個時間段内的資料。

下面通過一個簡單示例描述如何恢複某個時間段内的資料。

首先假定在/data目錄下有個剛剛建立的壓縮檔案ganglia-3.4.0.tar.gz,然後删除此檔案,接着解除安裝/data分區,開始恢複一小時内的檔案,操作如下:

可以看到,剛才删除的檔案已經成功恢複,而在/data目錄下還有很多被删除的檔案卻沒有恢複,這就是“--after”參數控制的結果,因為/data目錄下其他檔案都是在一天之前删除的,而我們恢複的是一個小時之内被删除的檔案,這就是沒有恢複其他被删除檔案的原因。

在這個操作過程中,需要注意是“--after”參數後面跟的時間是個總秒數。起算時間為“1970-01-01 00:00:00 utc”,通過“date +%s”指令即可将目前時間轉換為總秒數,因為恢複的是一個小時之内的資料,是以“1379146740”這個值就是通過“1379150340”減去“60*60=3600”獲得的。