ext2檔案系統下rm-rf * 誤刪資料恢復
阿新 • • 發佈:2019-02-20
如果你不小心執行了rm -rf * 或者 rm -rf XXX,在ext2系統並不是不可以恢復的。
一. 首先需要明確幾個基本概念:磁碟裝置檔案(簡稱硬碟)、分割槽、檔案系統、目錄&檔案
$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號命名,根據檔案內容可以找到丟失的重要資料。
一. 首先需要明確幾個基本概念:磁碟裝置檔案(簡稱硬碟)、分割槽、檔案系統、目錄&檔案
- 磁碟:簡單來說,/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命令來檢視是否存在
$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號命名,根據檔案內容可以找到丟失的重要資料。