一、首先我們先來了解下檔案删除原理:
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
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進行還原時也會自動生成掃描分區檔案。
本文轉自 a120518129 51CTO部落格,原文連結:http://blog.51cto.com/silencezone/1723194,如需轉載請自行聯系原作者