1. 程式人生 > >ext2檔案系統下rm-rf * 誤刪資料恢復

ext2檔案系統下rm-rf * 誤刪資料恢復

   如果你不小心執行了rm -rf * 或者 rm -rf XXX,在ext2系統並不是不可以恢復的。
一. 首先需要明確幾個基本概念:磁碟裝置檔案(簡稱硬碟)、分割槽、檔案系統、目錄&檔案
  • 磁碟:簡單來說,/dev/sda、/dev/sdb均代表一個硬碟裝置
  • 分割槽:在磁碟上(裝置檔案上),處於使用目的將磁碟劃分的不同區域,例如/dev/sda1、/dev/sda2是磁碟sda的分割槽;/dev/sdb1、/dev/sdb2是磁碟sdb的分割槽。
  • 檔案系統:常見的有ext2、ext4,檔案系統作用於分割槽上,如果一個檔案系統有多個分割槽的話,每個分割槽都可以格式化成一種檔案系統。
  • 目錄&檔案:檔案系統掛載(mount)以後,可以從掛載點(/)處訪問整個分割槽的內容,執行建立檔案、建立目錄等操作
二. 誤刪資料後的注意事項&&恢復資料需要具備的基本條件:
  • 1. 應該立即停止對刪除檔案分割槽的資料寫入,不確定有沒有寫入的話,直接解除安裝(umount)分割槽是最可靠的,原因:因為Linux刪除檔案並不是真實的刪除磁碟分割槽中的檔案,而是將檔案inode節點中的扇區指標清除,同時釋放這些指標對應的資料塊,一旦有正在寫入的資料,系統會對這些釋放的資料塊進行重新分配,就會導致那些刪掉的資料被新資料覆蓋,這樣就永遠無法恢復了,因此要立馬解除安裝分區。如果確定沒有寫入,最好不要解除安裝分割槽。
  • 2. 準備另外一個用於恢復寫入的分割槽,用於儲存恢復出來的檔案
  • 3. 恢復出來的檔案是沒有檔名的,只有一個inode編號,不過還是有很多辦法準確恢復我們想要的很多資料
  • 4. 需要這臺機器的root許可權
  • 5. 刪除的檔案所在的檔案系統是ext2,可以通過df -T命令檢視檔案系統型別
  • 6. 機器安裝有開源工具debugfs,Linux預設都自帶的有,一般在root許可權下,可以通過 whereis debugfs命令來檢視是否存在
三. 資料恢復步驟:     $cd /home/work          $ll  假設對目錄 /home/work目錄執行了rm -rf *,恢復過程如下:      1. 檢視當前系統時間,記下資料是什麼時候被刪除的          $date                  Sat May 14 14:48:45 CST 2016      2. 獲取刪資料的使用者的uid

         $cat /etc/passwd | grep "work"          work:x:503:505::/home/work:/bin/bash           第三列 503就是work使用者對應的uid      3. 檢視被刪檔案所在的磁碟、分割槽、檔案系統和掛載點           $df -T                   可以看到被刪檔案在磁碟sda、分割槽/dev/sda6、檔案系統型別ext2、掛載點/home下      4. 拿到root許可權,切換到root使用者           $su root      5. 查詢開源工具debugfs的位置           $whereis debugfs           debugfs: /sbin/debugfs /usr/share/man/man8/debugfs.8.gz      6. 找一個新的分割槽,/dev/sda5的/tmp掛載點下,新建資料夾dump,用於儲存恢復的檔案資料           $cd /tmp           $mkdir dump      7. 執行debugfs開啟檔案所在分割槽
         $/sbin/debugfs          debugfs 1.41.14 (22-Dec-2010)
         debugfs: open /dev/sda6      8. 列出所有被刪掉的檔案的inode等資訊
         debugfs: lsdel
          這個步驟可能時間比較長,debugfs會掃描整個sda6分割槽的inode節點,然後把被刪的inode節點以more的形式打出來           <5、6>兩個步驟一般會把被刪掉的inode節點重定向到檔案中,命令:          echo “lsdel” | debugfs /dev/sda6 > /tmp/dump/ino.log ,info.log檔案內容如下:   
          第一列是inode號(重要);第二列是uid;第4列是檔案大小,最後一列是刪除時間(重要)  9. 根據檔案刪除時間範圍從info.log裡定位被刪除檔案的inode資訊 info.log列出的是歷史所有被刪的inode資訊,因此根據刪除時間uid如果刪除檔案數比較少,還可以根據刪除檔案個數、刪除檔案大小;來從info.log裡定位所有被刪掉檔案的inode資訊(依據步驟1的時間點,步驟2的uid 503定位我自測刪除的檔案的部分inode資訊如下圖):重定向到/tmp/dump/nodeInfo.log裡   
 10.  恢復被刪除的資料       ####如果檔案不多可以通過命令一個一個恢復,恢復的資料最好選擇別的分割槽比如sda5, 防止被刪磁碟資料被覆蓋,恢復命令:          $debugfs
         debugfs 1.41.14 (22-Dec-2010)
         debugfs: open /dev/sda6
         debugfs:  dump <12918785> /tmp/dump/aaa       即恢復了inode_id為12918785的檔案,存放目錄為/tmp/dump,vim aaa進去查看了下就是之前自測刪掉的指令碼內容       ####如果被刪除檔案比較多,最好選擇批量恢復       a). 先把步驟9定位到的nodeInfo.log的第一列,即所有inode_id取出來,重定向到inode_id.txt檔案中,命令:           $awk '{print $1}' inodeInfo.log >inode_id.txt       b). 寫批量恢復檔案的指令碼1.sh:          #!/bin/sh
         cat inode_id.txt | while read LINE
         do
         echo "dump <$LINE> /tmp/dump/$LINE" | debugfs /dev/sda6
         done        c).  $ sh 1.sh 執行恢復資料dump命令           執行完後去去/tmp/dump目錄檢視,即可看到目錄下生成了所有被刪除的檔案           檔案都是以inode_id號命名,根據檔案內容可以找到丟失的重要資料。