一、首先我們先來了解下文件刪除原理:
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進行還原時也會自動生成掃描分區文件。