技巧之:恢復linux被誤刪文件(方案有3)

一、首先我們先來了解下文件刪除原理:

    1) linux是通過link的數量來控制文件刪除的,只有當一個文件不存在任何link的時候,這個文件纔會被刪除。一般來說,每個文件都有2個link計數器:i_count和i_nlink。

2)當進程打開了某個文件時,只要該進程保持打開該文件,即使將其刪除,它依然存在於磁盤中。這意味着,進程並不知道文件已經被刪除,它仍然可以向打開該文件時提供給它的文件描述符進行讀取和寫入。除了該進程之外,這個文件是不可見的,因爲已經刪除了其相應的目錄索引節點。

3) 當你發現你誤刪除了文件後,要做的第一件事是馬上卸載被誤刪除文件所在的分區,或者以只讀的方式來掛載該分區。原因大家都很清楚,文件被刪除後,文件中的數據還存在磁盤上,除非存放這些數據的數據塊又被操作系統分配出去了。我們這一步就是儘量降低數據塊中數據被覆蓋的風險,以提高恢復數據成功的比率。

二、瞭解完後,實戰演練

方案1)現在我向大家介紹使用extundelete恢復文件(適合rhel6.X系統的ext4)

#上傳extundelete-0.2.4.tar.bz2包傳到/usr/local/src下

#tar -jxvf  extundelete-0.2.4.tar.bz2

# cd extundelete-0.2.4

#./configure (這步出現錯誤,請看下文)

#mount /dev/cdrom /mnt

#rpm -ivh  /mnt/Packages/e2fsprogs-devel-1.41.12-18.el6.x86_64.rpm
 (必須安裝否則,前面./configure報錯)

#./configure (成功)

make && make install

軟件安裝完畢,下面我們來恢復文件吧

1)我先創建一個恢復目錄

mkdir recover

cd recover

extundelete  /dev/sda4 --inode  2  (看到你所刪除的文件)

#extundelete  /dev/sda4 -restore-inode 15 (按對應的節點來恢復文件)

#extundelete  /dev/sda4 -restore-file  a.txt   (按對應文件名來恢復文件)

#extundelete  /dev/sda4 -restore-dirctory etc  (按對應的目錄,這裏我以etc目錄)

##extundelete  /dev/sda4 -restore-all (全部恢復)

方案2)使用lsof自帶一個的神祕功能

原理:大多數與 lsof 相關的信息都存儲於以進程的 PID 命名的目錄中

假如由於誤操作將/var/log/messages文件刪除掉了,那麼這時要將/var/log/messages文件恢復的方法

如下:

首先使用lsof來查看當前是否有進程打開/var/logmessages文件,如下:

# lsof |grep /var/log/messages

syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages (deleted)

從 上面的信息可以看到 PID 1283(syslogd)打開文件的文件描述符爲 2。同時還可以看到/var/log

/messages已經標記被刪除了。因此我們可以在 /proc/1283/fd/2 (fd下的每個以數字命名的文件表示

進程對應的文件描述符)中查看相應的信息,如下:

# head -n 10 /proc/1283/fd/2

Aug 4 13:50:15 holmes86 syslogd 1.4.1: restart.

Aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.

Aug 4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 ([email protected])

(gcc version 4.2.0) #1 SMP Wed Jul 18 11:18:32 EDT 2007 Aug 4 13:50:15 holmes86 kernel:

BIOS-provided physical RAM map: Aug 4 13:50:15 holmes86 kernel: BIOS-e820:

0000000000000000 - 000000000009f000 (usable) Aug 4 13:50:15 holmes86 kernel: BIOS-e820:

000000000009f000 - 00000000000a0000 (reserved) Aug 4 13:50:15 holmes86 kernel:

BIOS-e820: 0000000000100000 - 000000001f7d3800 (usable) Aug 4 13:50:15 holmes86 kernel:

BIOS-e820: 000000001f7d3800 - 0000000020000000 (reserved) Aug 4 13:50:15 holmes86

kernel: BIOS-e820: 00000000e0000000 - 00000000f0007000 (reserved) Aug 4 13:50:15

holmes86 kernel: BIOS-e820: 00000000f0008000 - 00000000f000c000 (reserved)

從上面的信息可以看出,查看 /proc/8663/fd/15 就可以得到所要恢復的數據。如果可以通過文件描述

符查看相應的數據,那麼就可以使用 I/O 重定向將其複製到文件中,如:
cat /proc/1283/fd/2 > /var/log/messages

對於許多應用程序,尤其是日誌文件和數據庫,這種恢復刪除文件的方法非常有用。

方案3)使用ext3grep恢復文件(適合rhel5.X系統的ext3)

#上傳ext3grep-0.10.1.tar.gz包傳到/usr/local/src下

#tar -jxvf  ext3grep-0.10.1.tar.gz

# cd ext3grep-0.10.1

#./configure (成功)

make && make install

軟件安裝完畢,下面我們來恢復文件吧

1)我先創建一個恢復目錄

mkdir recover

cd recover

ext3grep /dev/your-device --restore-filepath/to/your/file/filename

需要注意的是,上面的文件路徑,是在該分區上文件路徑。假設我們要恢復/dev/sda3分區上文件,這個分區原來的安裝點是/home,現在想恢復文件/home/easwy/vi/tips.xml,那麼輸入的命令應該是:

    ext3grep /dev/sda3--restore-file easwy/vi/tips.xml

所有恢復的文件都會放在當前目下在RESTORED_FILES目錄下,大小也一樣,這裏RESTORED_FILES目錄是執行ext3grep的當前目錄下

如果你忘記了文件名,或者你誤刪除的是一個目錄而你無法記全該目錄中的文件,你可以先用下面的命令查詢一下文件名:

ext3grep /dev/sda3 --dump-names | tee filename.txt

上面的命令把ext3grep命令的輸出記錄到文件filename.txt中,你可以慢慢查看,或者使用grep命令過濾出你需要的信息。

當你知道了目錄/文件的信息後,就可以用上面說的命令進行恢復了。

復所有文件和目錄,但是目錄的話,如果刪除時間較長,不一定能完全恢復,壓縮文件一般都能恢復

ext3grep /termite/cc-disk --restore-all

ext3grep /dev/sda3  --ls --inode 2 創建掃描分區文件:sda5.ext3grep.stage1和sda5.ext3grep.stage2

如果想要重新生成可以刪除這個兩個文件,再次執行這條命令。另外當第一次執行ext3grep /dev/sda3 --restore-file test/a.txt進行還原時也會自動生成掃描分區文件。

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