extundelete工具恢復rm -rf 刪除的目錄(ext4、ext3)

lhrbest發表於2019-08-30

extundelete工具恢復rm -rf 刪除的目錄(ext4)


ext3grep工具只能用於恢復ext3檔案系統下刪除的檔案,對於ext4檔案系統,可以使用extundelete工具。使用的方法類似ext3grep。 ext3grep 僅對 ext3 檔案系統有效, extundelete ext3 ext4 檔案系統都有效

extundelete工具恢復rm -rf 刪除的目錄(ext4、ext3) ext3grep-0.10.2.tar.gz

extundelete工具恢復rm -rf 刪除的目錄(ext4、ext3) extundelete-0.2.4.tar.bz2




# extundelete /dev/sdb1 --inode 2

# extundelete /dev/sdb1 --restore-inode 57146

[root@rhel6lhr extundelete-0.2.4]# df -hT
Filesystem                               Type     Size  Used Avail Use% Mounted on
/dev/sda2                                ext4      48G   16G   31G  34% /
tmpfs                                    tmpfs    2.0G   80K  2.0G   1% /dev/shm
/dev/sda1                                ext4     283M   58M  210M  22% /boot
/dev/mapper/vg_orasoft-lv_orasoft_u01    ext4      49G   36G   11G  78% /u01
/dev/mapper/vg_orasoft-lv_orasoft_u02    ext4     7.3G  4.8G  2.2G  69% /u02
/dev/mapper/vg_orasoft-lv_orasoft_u03    ext4     6.8G  4.2G  2.4G  65% /u03
/dev/mapper/vg_oradata-lv_oradata_u04    ext4      40G   20G   18G  52% /u04
/dev/mapper/vg_oradata-lv_oradata_u05    ext4      40G   25G   14G  65% /u05
/dev/mapper/vg_orasoft-lv_orasoft_mysql  ext4     976M  323M  603M  35% /var/lib/mysql
/dev/mapper/vg_orasoft-lv_orasoft_u06    ext4      11G  5.5G  4.7G  54% /u06
/dev/mapper/vg_orasoft-lv_orasoft_u07    ext4      14G  8.2G  4.8G  64% /u07
/dev/mapper/vg_mysqlsoft-lv_mysqlsoft_55 ext4     2.9G  817M  2.0G  30% /usr/local/mysql55
/dev/mapper/vg_mysqlsoft-lv_mysqlsoft_56 ext4     2.9G  1.4G  1.4G  50% /usr/local/mysql56
/dev/mapper/vg_mysqlsoft-lv_mysqlsoft_57 ext4     4.8G  3.3G  1.3G  72% /usr/local/mysql57
/dev/mapper/vg_mysqlsoft-lv_mysqlsoft_80 ext4     5.8G  2.7G  2.9G  49% /usr/local/mysql80
/dev/sr0                                 iso9660  3.6G  3.6G     0 100% /media/lhr/cdrom


軟體下載: 


作為一名運維人員,保證資料的安全是根本職責,所以在維護系統的時候,要慎之又慎,但是有時難免會出現資料被誤刪除的情況,在這個時候改如何快速、有效地恢復資料呢?本文我們就來介紹一下Linux系統下常用的幾個資料恢復工具。


https://blog.51cto.com/ixdba/1566856


一、 如何使用“rm -rf”命令


在Linux系統下,透過命令“rm -rf”可以將任何資料直接從硬碟刪除,並且沒有任何提示,同時Linux下也沒有與Windows下回收站類似的功能,也就意味著,資料在刪除後透過常規的手段是無法恢復的,因此使用這個命令要非常慎重。在使用rm命令的時候,比較穩妥的方法是把命令引數放到後面,這樣有一個提醒的作用。其實還有一個方法,那就是將要刪除的東西透過mv命令移動到系統下的/tmp目錄下,然後寫個指令碼定期執行清除操作,這樣做可以在一定程度上降低誤刪除資料的危險性。

其實保證資料安全最好的方法是做好備份,雖然備份不是萬能的,但是沒有備份是萬萬不行的。任何資料恢復工具都有一定侷限性,都不能保證完整地恢復出所有資料,因此,把備份作為核心,把資料恢復工具作為輔助是運維人員必須堅持的一個準則。


二、 extundelete與ext3grep的異同

在Linux下,基於開源的資料恢復工具有很多,常見的有debugfs、R-Linux、ext3grep、extundelete等,比較常用的有ext3grep和extundelete,這兩個工具的恢復原理基本一樣,只是extundelete功能更加強大,本文重點介紹extundelete的使用。


三、 extundelete的恢復原理

在介紹使用extundelete進行恢復資料之前,簡單介紹下關於inode的知識。在Linux下可以透過“ls –id”命令來檢視某個檔案或者目錄的inode值,例如檢視根目錄的inode值,可以輸入:

[root@cloud1 ~]# ls -id  / 2 /

由此可知,根目錄的inode值為2。

在利用extundelete恢復檔案時並不依賴特定檔案格式,首先extundelete會透過檔案系統的inode資訊(根目錄的inode一般為2)來獲得當前檔案系統下所有檔案的資訊,包括存在的和已經刪除的檔案,這些資訊包括檔名和inode。然後利用inode資訊結合日誌去查詢該inode所在的block位置,包括直接塊,間接塊等資訊。最後利用dd命令將這些資訊備份出來,從而恢復資料檔案。


四、 安裝extundelete

extundelete的官方網站是 ,其目前的穩定版本是extundelete-0.2.4。,在安裝extundelete之前需要安裝e2fsprogs和e2fsprogs-libs兩個依賴包。

e2fsprogs和e2fsprogs-libs安裝非常簡單,這裡不做介紹。下面是extundelete的編譯安裝過程:

[root@cloud1 app]#tar jxvf  extundelete-0.2.4.tar.bz2[root@cloud1 app]#cd extundelete-0.2.4[root@cloud1 extundelete-0.2.4]#./configure[root@cloud1 extundelete-0.2.4]#make[root@cloud1 extundelete-0.2.4]#make install

成功安裝extundelete後,會在系統中生成一個extundelete可執行檔案。extundelete的使用非常簡單,讀者可以透過“extundelete  --help”獲得此軟體的使用方法。 


五、 extundelete用法詳解

extundelete安裝完成後,就可以執行資料恢復操作了,本節詳細介紹下extundelete每個引數的含義。extundelete用法如下:

extundelete --help

命令格式: 

extundelete [options] [action] device-file

其中引數(options)有:

--version, -[vV],顯示軟體版本號。

--help,顯示軟體幫助資訊。

--superblock,顯示超級塊資訊。

--journal,顯示日誌資訊。

--after dtime,時間引數,表示在某段時間之後被刪的檔案或目錄。

--before dtime,時間引數,表示在某段時間之前被刪的檔案或目錄。


動作(action)有:

--inode ino,顯示節點“ino”的資訊。

--block blk,顯示資料塊“blk”的資訊。

--restore-inode ino[,ino,...],恢復命令引數,表示恢復節點“ino”的檔案,恢復的檔案會自動放在當前目錄下的RESTORED_FILES資料夾中,使用節點編號作為副檔名。

--restore-file 'path',恢復命令引數,表示將恢復指定路徑的檔案,並把恢復的檔案放在當前目錄下的RECOVERED_FILES目錄中。

--restore-files 'path' ,恢復命令引數,表示將恢復在路徑中已列出的所有檔案。

--restore-all,恢復命令引數,表示將嘗試恢復所有目錄和檔案。

-j journal,表示從已經命名的檔案中讀取擴充套件日誌。

-b blocknumber,表示使用之前備份的超級塊來開啟檔案系統,一般用於檢視現有超級塊是不是當前所要的檔案。

-B blocksize,表示使用資料塊大小來開啟檔案系統,一般用於檢視已經知道大小的檔案。


六、 實戰:extundelete恢復資料的過程

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


6.1 透過extundelete恢復單個檔案

1. 模擬資料誤刪除環境

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

[root@cloud1 ~]#mkdir /data[root@cloud1 ~]#mkfs.ext3 /dev/sdc1[root@cloud1 ~]#mount /dev/sdc1  /data[root@cloud1 ~]# cp /etc/passwd  /data[root@cloud1 ~]# cp -r /app/ganglia-3.4.0  /data[root@cloud1 ~]# mkdir /data/test[root@cloud1 ~]# echo "extundelete test" > /data/test/mytest.txt[root@cloud1 ~]#cd /data[root@cloud1 data]# md5sum  passwd 0715baf8f17a6c51be63b1c5c0fbe8c5  passwd[root@cloud1 data]# md5sum  test/mytest.txt eb42e4b3f953ce00e78e11bf50652a80  test/mytest.txt[root@cloud1 data]# rm -rf /data/*

2. 解除安裝磁碟分割槽

在將資料誤刪除後,立刻需要做的就是解除安裝這塊磁碟分割槽:

[root@cloud1 data]#cd /mnt[root@cloud1 mnt]# umount /data

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

透過extundelete命令可以查詢/dev/sdc1分割槽可恢復的資料資訊:

[root@cloud1 /]# extundelete  /dev/sdc1  --inode 2......File name                                       | Inode number | Deleted status.                                                2..                                                2
lost+found                                        11             Deletedpasswd                                           49153          Deletedtest                                              425985         Deleted
ganglia-3.4.0                                       245761         Deleted

根據上面的輸出,標記為Deleted狀態的是已經刪除的檔案或目錄。同時還可以看到每個已刪除檔案的inode值,接下來就可以恢復檔案了。

4. 恢復單個檔案

執行如下命令開始恢復檔案:

[root@cloud1 /]# extundelete  /dev/sdc1  --restore-file passwd Loading filesystem metadata ... 40 groups loaded.
Loading journal descriptors ... 54 descriptors loaded.
Successfully restored file passwd[root@cloud1 /]# cd RECOVERED_FILES/[root@cloud1 RECOVERED_FILES]# lspasswd[root@cloud1 RECOVERED_FILES]# md5sum  passwd 0715baf8f17a6c51be63b1c5c0fbe8c5  passwd

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

在檔案恢復成功後,extundelete命令預設會在執行命令的當前目錄下建立一個RECOVERED_FILES目錄,此目錄用於存放恢復出來的檔案,所以執行extundelete命令的當前目錄必須是可寫的。

根據上面的輸出,透過md5sum命令校驗,校驗碼與之前的完全一致,表明檔案恢復成功。


6.2 透過extundelete恢復單個目錄

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

繼續在上面模擬的誤刪除資料環境下操作,現在要恢復/data目錄下的ganglia-3.4.0資料夾,操作如下:

[root@cloud1 mnt]# extundelete  /dev/sdc1  --restore-directory /ganglia-3.4.0Loading filesystem metadata ... 40 groups loaded.
Loading journal descriptors ... 247 descriptors loaded.
Searching for recoverable inodes in directory /ganglia-3.4.0 ... 
781 recoverable inodes found.
Looking through the directory structure for deleted files ... 
4 recoverable inodes still lost.[root@cloud1 mnt]# lsRECOVERED_FILES[root@cloud1 mnt]# cd RECOVERED_FILES/[root@cloud1 RECOVERED_FILES]# lsganglia-3.4.0

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


6.3 透過extundelete恢復所有誤刪除資料

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

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

[root@cloud1 mnt]# extundelete  /dev/sdc1 --restore-allLoading filesystem metadata ... 40 groups loaded.
Loading journal descriptors ... 247 descriptors loaded.
Searching for recoverable inodes in directory / ... 
781 recoverable inodes found.
Looking through the directory structure for deleted files ... 
0 recoverable inodes still lost.[root@cloud1 mnt]# lsRECOVERED_FILES[root@cloud1 mnt]# cd RECOVERED_FILES/[root@cloud1 RECOVERED_FILES]# lsganglia-3.4.0  passwd  test[root@cloud1 RECOVERED_FILES]# du -sh  /mnt/RECOVERED_FILES/*15M     /mnt/RECOVERED_FILES/ganglia-3.4.0
4.0K    /mnt/RECOVERED_FILES/passwd
8.0K    /mnt/RECOVERED_FILES/test

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


6.4 透過extundelete恢復某個時間段的資料

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

下面透過一個簡單示例,描述下如何恢復某個時間段內的資料。

我們首先假定在/data目錄下有個剛剛建立的壓縮檔案ganglia-3.4.0.tar.gz,然後刪除此檔案,接著解除安裝/data分割槽,開始恢復一小時內的檔案,操作如下:

[root@cloud1 ~]#cd /data/[root@cloud1 data]# cp /app/ganglia-3.4.0.tar.gz  /data[root@cloud1 data]# date +%s1379150309[root@cloud1 data]# rm -rf ganglia-3.4.0.tar.gz[root@cloud1 data]# cd /mnt[root@cloud1 mnt]# umount /data[root@cloud1 mnt]# date +%s1379150340[root@cloud1 mnt]# extundelete  --after 1379146740 --restore-all /dev/sdc1Only show and process deleted entries if they are deleted on or after 1379146740 and before 9223372036854775807.
Loading filesystem metadata ... 40 groups loaded.
Loading journal descriptors ... 247 descriptors loaded.
Searching for recoverable inodes in directory / ... 
779 recoverable inodes found.[root@cloud1 mnt]#  cd RECOVERED_FILES/[root@cloud1 RECOVERED_FILES]# lsganglia-3.4.0.tar.gz

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

在這個操作過程中,需要注意是“--after”引數後面跟的時間是個總秒數。起算時間為“1970-01-01 00:00:00 UTC”,透過“date +%s”命令即可將當前時間轉換為總秒數,因為恢復的是一個小時之內的資料,所以“1379146740”這個值就是透過“1379150340”減去“60*60=3600”獲得的。




1.在安裝extundelete包./configure時遇到configure: error: C++ compiler cannot create executables問題

[root@localhost extundelete-0.2.4]# ./configure 
Configuring extundelete 0.2.4
configure: error: in `/root/Desktop/extundelete-0.2.4':
configure: error: C++ compiler cannot create executables
See `config.log' for more details

經過查詢知道需要安裝gcc-c++包
安裝gcc-c++
[root@localhost Packages]# rpm -ivh gcc-c++-4.4.7-3.el6.i686.rpm 
warning: gcc-c++-4.4.7-3.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
error: Failed dependencies:
libstdc++-devel = 4.4.7-3.el6 is needed by gcc-c++-4.4.7-3.el6.i686
有依賴關係先裝 libstdc++-devel-4.4.7-3.el6.i686.rpm
[root@localhost Packages]# rpm -ivh libstdc++-devel-4.4.7-3.el6.i686.rpm
warning: libstdc++-devel-4.4.7-3.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                ########################################### [100%]
   1:libstdc++-devel        ########################################### [100%]
再安裝 gcc-c++-4.4.7-3.el6.i686.rpm 
[root@localhost Packages]# rpm -ivh gcc-c++-4.4.7-3.el6.i686.rpm 
warning: gcc-c++-4.4.7-3.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                ########################################### [100%]
   1:gcc-c++                ########################################### [100%]
[root@localhost Packages]# rpm -qa | grep gcc-c++
gcc-c++-4.4.7-3.el6.i686

2.重新./configure顯示
[root@localhost extundelete-0.2.4]# ./configure 
Configuring extundelete 0.2.4
configure: error: Can't find ext2fs library

經過查詢知道缺少 e2fsprogs-devel,下面開始安裝

[root@localhost Packages]# rpm -ivh e2fsprogs-devel-1.41.12-14.el6.i686.rpm 
warning: e2fsprogs-devel-1.41.12-14.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
error: Failed dependencies:
libcom_err-devel  = 1.41.12-14.el6 is needed by e2fsprogs-devel-1.41.12-14.el6.i686
pkgconfig(com_err) is needed by e2fsprogs-devel-1.41.12-14.el6.i686

有依賴的包,所以先安裝依賴包

[root@localhost Packages]# ll | grep libcom_err-devel
-r--r--r--  49 root root    31984 12月 19 2012 libcom_err-devel-1.41.12-14.el6.i686.rpm

[root@localhost Packages]# rpm -ivh libcom_err-devel-1.41.12-14.el6.i686.rpm 
warning: libcom_err-devel-1.41.12-14.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                ########################################### [100%]
   1:libcom_err-devel       ########################################### [100%]
解決了依賴關係,在安裝 e2fsprogs-devel
[root@localhost Packages]# rpm -ivh e2fsprogs-devel-1.41.12-14.el6.i686.rpm 
warning: e2fsprogs-devel-1.41.12-14.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                ########################################### [100%]
   1:e2fsprogs-devel        ########################################### [100%]

3。再./configure出現,表示成功了;

[root@localhost extundelete-0.2.4]# ./configure 
Configuring extundelete 0.2.4
Writing generated files to disk

4.進行make & make install
[root@localhost extundelete-0.2.4]# make
make -s all-recursive
Making all in src
extundelete.cc:571: 警告:未使用的引數‘flags’

[root@localhost extundelete-0.2.4]# make install
Making install in src
  /usr/bin/install -c extundelete '/usr/local/bin'



https://www.cnblogs.com/patf/p/3368765.html


首先。Linux下很多人都喜歡用rm -rf去刪除目錄。但是rm --help提示這是一個非常危險的命令、謹慎用之。

這裡公司一臺伺服器。同事在操作的過程中誤刪掉一個目錄。而且是非常重要的。

嘗試恢復cat /etc/redhat-release 檢視為rhel4版本。很老了這就有一個問題出現yum無法用。

先用一個ext3grep 工具恢復。但是該工具--help 提示沒有針對目錄恢復的引數 只有一個all 我嘗試用時間戳恢復當時時間段的資料效果不理想、

而且跟要命的是當我檢視分割槽的時候df -aT發現這個刪除的目錄進入奇蹟般的劃分在了與/一個分割槽。0 0這意味著我掛載為只讀分割槽時要殺掉一

切與/根分割槽有關的程式;所有反覆思索後決定一個好的辦法:

USB行動硬碟安裝一個便攜Linux系統,並在其上面安裝extundelete工具因為這個工具需要幾個包的支援。而rhel4的系統現在yum已經無法使用

安裝支援包都很困難。索性放棄。

關於USB行動硬碟系統。與我們用的stat 硬碟安裝系統一樣。可以用光碟映象安裝選擇USB裝置為安裝裝置。或者用虛擬機器安裝都可以。這裡我就

不多說推薦虛擬機器 和 (優點是你有映象但無法刻盤)。

好了進入centOS6.4後

下載extundelete:wget

 

1 [root@vbok src]# wget 
1 [root@vbok src]# tar jxvf extundelete-0.2.4.tar.bz2

直接./configure make make install 但我執行./configure時報錯:

1 [root@vbok src]# cd extundelete-0.2.42 [root@vbok extundelete-0.2.4]# ./configure 
3 Configuring extundelete 0.2.44 configure: error: Can't find ext2fs library

提示 ext2fs library 少幾個包的支援

1 [root@vbok extundelete-0.2.4]# yum -y install ext2fs

OK 在執行make三部曲

[root@vbok extundelete-0.2.4]# ./configure 
Configuring extundelete 0.2.4Writing generated files to disk

當然如果你make完後就可以使用這個工具的

1 [root@vbok extundelete-0.2.4]# make2 make -s all-recursive3 Making all in src4 extundelete.cc:571: 警告:未使用的引數‘flags’

直接在~/src/extundelete --help

[root@vbok extundelete-0.2.4]# src/extundelete --help

或者在執行 make install 這時會安裝到/usr/local/bin/extundelete 下

我還是推薦make完就成了。因為假如你要恢復的目錄正好是/usr 那你就還需要在./configure下加引數。浪費時間效果一樣

OK來演示下恢復吧

 1 [root@vbok /]# df -h 2 檔案系統              容量  已用  可用 已用%% 掛載點 3 /dev/mapper/vg_vbok-gen 4                        25G  541M   23G   3% / 5 tmpfs                 943M  232K  943M   1% /dev/shm 6 /dev/sdb1             485M   36M  424M   8% /boot 7 /dev/mapper/vg_vbok-home 8                        20G  172M   19G   1% /home 9 /dev/mapper/vg_vbok-opt10                        11G  156M  9.9G   2% /opt11 /dev/mapper/vg_vbok-usr12                        39G  3.2G   34G   9% /usr13 /dev/sdb3              51G   16K   51G   1% /vfat

我在/opt下建立了個目錄 “1“ 下面有多個子目錄和檔案。然後我將其刪除。

(看看現在的時間)並回到extundelete 安裝目錄下將opt目錄掛載為只讀為了保護資料防止重寫。

 1 root@vbok /]# cd opt/ 2 [root@vbok opt]# ls 3 1  lost+found  rh 4 [root@vbok opt]# date 5 2013年 10月 14日 星期一 16:44:55 CST 6 [root@vbok opt]# rm -rf 1 7 [root@vbok opt]# ls 8 lost+found  rh 9 [root@vbok opt]# cd /usr/local/src/extundelete-0.2.410 [root@vbok extundelete-0.2.4]# mount -o remount,ro /dev/mapper/vg_vbok-opt

這裡說下我要用到的引數 src/extundelete --help

1 --restore-directory 'path'2                          Will restore directory 'path'. 'path' is relative to the3 --restore-all          Attempts to restore everything.4  --after dtime          Only process entries deleted on or after 'dtime'.5   --before dtime         Only process entries deleted before 'dtime'.

第一個是 恢復目錄 path為路徑後面跟要恢復那個目錄的路徑

第二個是 恢復所有

第三個是 恢復dtime這個時間戳以後刪除的檔案 

第四個是恢復這個時間戳以前刪除的檔案  (這裡說下,卡時間恢復是非常好用的引數。你可以指定恢復那個時間到那個時間之間的資料)

基本這幾個選項就夠恢復了,當然還有--restore-files 引數來恢復單個檔案。

OK開始

我上面在刪除的時間date了下系統時間所以我就來生成下 刪除前和刪除後的時間戳用來定位我要恢復的目錄,然後利用工具恢復刪除的目錄

[root@vbok extundelete-0.2.4]# date -d "2013-10-14 16:43" +%s1381740180[root@vbok extundelete-0.2.4]# date -d "2013-10-14 16:58" +%s  
1381741080[root@vbok extundelete-0.2.4]# src/extundelete /dev/mapper/vg_vbok-opt --after /1381740180 --before 1381741080 --restore-directory 1

OK恢復完成,這裡要注意的是在用恢復目錄選項的時候,後面接的目錄是以opt後的目錄。也就是說 /dev/mapper/vg-vbox-opt 已經代表了/opt這個目錄我們只需要接著寫 opt後面的目錄 例如要恢復/opt/1/2/3 這個目錄 我們後面的路徑為 1/2/3 就可以恢復3這個目錄了 當然有時間戳指定時間段後就可以用--restore-all恢復這個時間段刪除的所有資料了。OK

 1 NOTICE: Extended attributes are not restored. 2 Loading filesystem metadata ... 86 groups loaded. 3 Loading journal descriptors ... 91 descriptors loaded. 4 Searching for recoverable inodes in directory 1 ... 
 5 9 recoverable inodes found. 6 Looking through the directory structure for deleted files ... 
 7 1 recoverable inodes still lost. 8 [root@vbok extundelete-0.2.4]# cd RECOVERED_FILES/ 9 [root@vbok RECOVERED_FILES]# LS10 -bash: LS: command not found11 [root@vbok RECOVERED_FILES]# ls12 113 [root@vbok RECOVERED_FILES]# cd 114 [root@vbok 1]# ls15 11  2216 [root@vbok 1]# cd 11/17 [root@vbok 11]# ls18 2  a19 [root@vbok 11]# cd ../22/c 
20 -bash: cd: ../22/c: 不是目錄21 [root@vbok 11]# cd ../22/c

資料 完好無損。

在講/opt這個分割槽掛載回讀寫的,不會的可以reboot重啟下也可以

 

一、 將磁碟分割槽掛載為只讀

這一步很重要,並且 在誤刪除檔案後應儘快將磁碟掛載為只讀。越早進行,恢復的成功機率就越大。

 

1.  檢視被刪除檔案位於哪個分割槽

[root    ~] #  mount
/dev /mapper /VolGroup -lv_root on  / type ext4(rw)
/dev /mapper /VolGroup -lv_home on  /home type ext4(rw)

2.  嘗試將對應目錄重新掛載為只讀

[root    ~] #    mount -r -n -o remount /home
mount :  /home is busy

 

3.  如果顯示 xxx is busy

[root    ~ ] fuser -v -m /data

找出相關程式,kill.

 

4.  成功將目錄掛載為只讀

[root    ~ ]  #   mount -r -n -o remount /home

此時在/home目錄 touch 檔案時,會報錯:

[root    ~ ]  touch txt
touch : cannot touch  `txt’ : Read -only file system

 

二、 使用資料恢復工具 extundelete

之前嘗試了debugfs + dd,未果。

後來安裝 extundelete-0.2.4 ,:

1.  下載

(1) 因為sourceforge被牆,伺服器上直接wget不成功,所以只能在本地翻 牆下載,連結如下:

        

(2) 把下載的檔案放到伺服器

      啟動本地的nginx,然後在伺服器上wget(當然透過其它方法也可以,只要能傳到伺服器):

wget http ://本機IP /extundelete -0. 2. 4.tar.bz2  

(3) 解壓

tar jxf extundelete  -  0 .  2 .  4 .tar.bz2

 

2.  編譯

(1) configure

[root   extundelete -0. 2. 4] ./configure

configure時報錯,看了下config.log,確定是本機沒編譯環境 。

yum -y install gcc+ gcc-c++

等待,有一點慢。

安裝完成後,再次config,依然報錯

Configuring extundelete  0. 2. 4
configure : error : Can’t find ext2fs library

這是因為extundelete依賴e2fsprogs。

安裝e2fsprogs後再次configure,成功。

[root   extundelete -0. 2. 4] yum install e2fsprogs-devel
[root   extundelete -0. 2. 4] # ./configure
Configuring extundelete  0. 2. 4
Writing generated files to disk

 

(2) make & make install

[root   extundelete -0. 2. 4] #make & make install

 如果沒有異常資訊,基本說明安裝成功.

 

(3) 可以到src目錄驗證下.

[root   extundelete -0. 2. 4] # cd src
[root   src] ./extundelete
No action specified; implying  --superblock.
. /extundelete : Missing device name.
Usage : . /extundelete [options] [ --] device -file
.............

 

[root   src]#  ./extundelete -v

extundelete version 0.2.4

libext2fs version 1.41.12

Processor is little endian.

如上資訊,證明安裝成功。

下面才真正開始資料恢復。

 

三、 掛載新硬碟

(如果原伺服器磁碟空間夠大,可以跳過這一步。)

因為被誤刪的資料很大(約200G),原伺服器所在的物理機上也沒有磁碟空間了。因些需要到遠端掛載另一臺伺服器B上的磁碟,B是xen虛出的機器,空間也不夠,但所在的物理機上還有磁碟空間,這時需要從宿主機上分空間給B。

1  在xen上掛載一塊磁碟給B

因為是圖形操作,就不再細說。只需分配足夠大的空間就可以了,我當時選的是300G。

2  登入伺服器B, 準備掛載新磁碟。

(1) 檢視新磁碟是否已掛載

[nmen @dev  -ubuntu -server]  ls  /dev /sd *
/dev /sda   /dev /sda1   /dev /sda2   /dev /sda5   /dev /sda6   /dev /sda7   /dev /sda8   /dev/sdb

/dev/sdb確實已掛載。

此時新盤是未分割槽,也未格式化,因此需要先進行這兩件事。

 

(2)  分割槽

下圖是hdb的硬碟,sdb的盤也一樣的操作。


(本圖來自: )

 

(3)  格式化

[nmen @dev  -ubuntu -server] :~sudo mkfs -t ext3 /dev/sdb1
mke2fs  1. 41. 11 ( 14-Mar -2010)
Filesystem label =
OS type : Linux
Block size =4096 (log =2)
Fragment size =4096 (log =2)
Stride =0 blocks, Stripe width =0 blocks
22937600 inodes,  91749215 blocks
4587460 blocks ( 5.00 %) reserved  for the super user
First data block =0
Maximum filesystem blocks =4294967296
2800 block groups
32768 blocks per group,  32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks :
     327689830416384022937629491281920088473616056322654208,
     409600079626241123942420480000238878727166361678675968
 
Writing inode tables :  done                           
Creating journal ( 32768 blocks) :  done
Writing superblocks  and filesystem accounting information :  done
 
This filesystem will be automatically checked every  33 mounts  or
180 days, whichever comes first.  Use tune2fs  -or  -i to override.

顯示以上資訊說明已成功格式化。

 

(4)  設定卷標

sudo  e2label  /dev /sdb1  /restore

 

(5)  掛載

[nmen @dev  -ubuntu -server] :~$ mkdir  /restore
[nmen @dev   - ubuntu  - server]  :  ~ $  mount  -vl  -t ext3  /dev /sdb1  /restore

至此伺服器B上掛載新硬碟結束,現在有足夠空間來做存放要恢復的資料了。

 

四、透過NFS遠端掛載

透過網路, 將遠端主機B共享的檔案系統,掛載到需要做資料恢復的機器A。

1. 伺服器B上安裝NFS

(1) 安裝

B是ubuntu系統,預設沒安裝nfs.

#  sudo apt-get install nfs-kernel-server

 

(2) 配置

修改/etc/exports , 新增如下語句。


# /etc/exports: the access control list for filesystems which may be exported
#               to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#
/restore *(rw,sync,no_root_squash,no_subtree_check)

其中 :

   /restore                                                                  -- 需要與客戶機共享的目錄;

     *                                                                            -- 表示任何主機均可訪問本目錄,也可指定IP;

   (w,sync,no_root_squash,no_subtree_check)      -- 配置客戶機的許可權;

因為是臨時使用,並且是伺服器位於內網,所以設定相對隨意。

 

(3) 使配置生效

#  exportfs –rv

#  /etc/init.d/nfs-kernel-server restart

 

(4) 驗證是否配置成功

顯示NFS伺服器輸出目錄列表:

nmen @dev  -ubuntu -server :  showmount -e
Export list  for chinahrd -ubuntu -dev :
/restore  *

 

(5) 防火牆

因為時間緊急,並且是內網,所以臨時關閉了B上的防火牆:

sudo  ufw  disable

可透過以下命令啟用防火牆:

sudo ufw enable

2.  伺服器A上掛載遠端目錄

將/restore目錄從伺服器 B 掛載到 /mnt 上。

mount  -t nfs [B的IP] :/restore   /mnt

命令詳解如下:

# mount -t nfs [-o mount-options] server:/directory /mount-point
 
-o mount -options
     指定可以用來掛載 NFS 檔案系統的掛載選項。
server :/directory
     指定包含共享資源的伺服器主機名,以及要掛載的檔案或目錄的路徑。
/mount -point
     指定要掛載檔案系統的目錄。

 

五、資料恢復

1.   得到刪除的大概時間

這一步不是必須,但這個有助於更快的回覆想要的資料。

date  -"Fri Apr 15:40:00 2014"  +%s
1397202000

1397202000這個時間值,我們後期會用到。

2.  檢視被刪除檔案

# extundelete /dev/sdb1 --inode 2

File name                                       | Inode number | Deleted status

.                                                 9

..                                                11

lost+found                                        24             Deleted

data                                              82             Deleted

一個分割槽掛載到一個目錄下時,”根”目錄的inode值為一般是2。

狀態為deleted的是被刪除的檔案。

3.  資料恢復

進入剛mount的遠端目錄/restore;

指定--after "1397202000", 表示恢復這個時間點之後的檔案;

檔案預設會被恢復到當前目錄下的RECOVERED_FILES目錄中。

cd  /restore
[root   restore]#[extundelete的安裝路徑] ./extundelete --restore-all --after  "1397202000" /dev /mapper /VolGroup -lv_home

Only show and process deleted entries if they are deleted on or after 1397202000 and before 9223372036854775807.

NOTICE: Extended attributes are not restored.

Loading filesystem metadata ... 6924 groups loaded.

Loading journal descriptors ... 27149 descriptors loaded.

Searching for recoverable inodes in directory / ...

696 recoverable inodes found.

Looking through the directory structure for deleted files ...

Unable to restore inode 27394319 (VMware/9.50_ps/9.55locate.vmx.lck): Space has been reallocated.

Unable to restore inode 27402241 (VMware/9.35win7/9.35win7.vmx.lck): Space has been reallocated.

Unable to restore inode 27396032 (VMware/9.35win7/9.35win7-Snapshot1.vmsn): No undeleted copies found in the journal.

Unable to restore inode 27394051 (VMware/9.36win2008/9.36win2008R2.vmx.lck/E00633.lck): Space has been reallocated.

Unable to restore inode 27394603 (lost+found/E09292.lck): Space has been reallocated.

8 recoverable inodes still lost.

 

一般來說,要等很久。。。

cd restore /RECOVERED_FILES$
ls
110_open_dns   111_open_dns_node1   112_DNS_node2   116_svn

刪除的檔案回來了,至此鬆一口氣。

六、收尾工作

(1) 重新掛載A上的磁碟為可讀寫:

[root   src] # mount -o remount, rw /home/

解除安裝伺服器B上的目錄。

 

(2) 開啟B的防火牆。

sudo ufw enable

 

(3) 在A上對rm命令啟用別名,防止沉默式刪除。

vi  /etc /bashrc

source /etc/bashrc

 

# do not delete / or prompt if deleting more than 3 files at a time #
alias  rm = 'rm -I --preserve-root'  
 
# confirmation #
alias  mv = 'mv -i'
alias  cp = 'cp -i' alias ln = 'ln -i'  
 
# Parenting changing perms on / #
alias chown = 'chown --preserve-root'
alias chmod = 'chmod --preserve-root'
alias chgrp = 'chgrp --preserve-root'

(4) 在B上使用Rsync,定期備份A上資料。

參考:






About Me

........................................................................................................................

● 本文作者:小麥苗,部分內容整理自網路,若有侵權請聯絡小麥苗刪除

● 本文在itpub、部落格園、CSDN和個人微 信公眾號( xiaomaimiaolhr)上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文部落格園地址: http://www.cnblogs.com/lhrbest

● 本文CSDN地址: https://blog.csdn.net/lihuarongaini

● 本文pdf版、個人簡介及小麥苗雲盤地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA寶典今日頭條號地址:

........................................................................................................................

● QQ群號: 230161599 、618766405

● 微 信群:可加我微 信,我拉大家進群,非誠勿擾

● 聯絡我請加QQ好友 646634621 ,註明新增緣由

● 於 2019-08-01 06:00 ~ 2019-08-31 24:00 在西安完成

● 最新修改時間:2019-08-01 06:00 ~ 2019-08-31 24:00

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

........................................................................................................................

小麥苗的微店

小麥苗出版的資料庫類叢書http://blog.itpub.net/26736162/viewspace-2142121/

小麥苗OCP、OCM、高可用網路班http://blog.itpub.net/26736162/viewspace-2148098/

小麥苗騰訊課堂主頁https://lhr.ke.qq.com/

........................................................................................................................

使用 微 信客戶端掃描下面的二維碼來關注小麥苗的微 信公眾號( xiaomaimiaolhr)及QQ群(DBA寶典)、新增小麥苗微 信, 學習最實用的資料庫技術。

........................................................................................................................

歡迎與我聯絡

 

 



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2655565/,如需轉載,請註明出處,否則將追究法律責任。

相關文章