Linux不像windows有那麼顯眼的資源回收筒,不是簡單的還原就可以了。

linux删除檔案還原可以分為兩種情況,一種是删除以後在程序存在删除資訊,一種是删除以後程序都找不到,隻有借助于工具還原,這裡分别檢查介紹下。
一、誤删除檔案程序還在的情況。
這種一般是有活動的程序存在持續标準輸入或輸出,到時檔案被删除後,程序PID還是存在。這也就是有些伺服器删除一些檔案但是磁盤不釋放的原因。比如目前舉例說明: 通過一個shell終端對一個測試檔案做cat追加操作:
[[email protected]_backup ~]# echo "hello py" > testdelete.py
[[email protected]_backup ~]# cat >> testdelete.py
hello delete
另外一個終端檢視這個檔案可以清楚看到内容:
[[email protected]_backup ~]# cat testdelete.py
hello py
hello delete
此時,在目前伺服器删除檔案
rm -f ./testdelete.py
指令檢視這個目錄,檔案已經不存在了,那麼現在我們将其恢複出來。
1. lsof檢視删除的檔案程序是否還存在。這裡用到一個指令lsof,如沒有安裝請自行yum或者apt-get。類似這種情況,我們可以先lsof檢視删除的檔案 是否還在:
[[email protected]_backup ~]# lsof | grep deleted
mysqld 1512 mysql 5u REG 252,3 0 6312397 /tmp/ibzW3Lot (deleted)
cat 20464 root 1w REG 252,3 23 1310722 /root/testdelete.py (deleted)
幸運的是這種情況程序還存在 ,那麼開始進行恢複 操作。
2. 恢複。恢複指令:
cp /proc/pid/fd/1 /指定目錄/檔案名
進入 程序目錄,一般是進入/proc/pid/fd/,針對目前情況:
[[email protected]_backup ~]# cd /proc/20464/fd
[[email protected]_backup fd]# ll
total 0
lrwx------ 1 root root 64 Nov 15 18:12 0 > /dev/pts/1
l-wx------ 1 root root 64 Nov 15 18:12 1 > /root/testdelete.py (deleted)
lrwx------ 1 root root 64 Nov 15 18:12 2 > /dev/pts/1
恢複操作:
cp 1 /tmp/testdelete.py
檢視檔案:
[[email protected]_backup fd]# cat /tmp/testdelete.py
hello py
hello delete
恢複完成。
二、誤删除的檔案程序已經不存在,借助于工具還原。
建立準備删除的目錄并echo一個 帶有内容的檔案:
[[email protected]_backup 21yunwei]# tree
.
├── deletetest
│ └── mail
│ └── test.py
├── lost+found
└── passwd
3 directories, 2 files
[[email protected]_backup 21yunwei]# cat /21yunwei/deletetest/mail/test.py
hello Dj
[[email protected]_backup 21yunwei]# tail -2 passwd
haproxy:x:500:502::/home/haproxy:/bin/bash
tcpdump:x:72:72::/:/sbin/nologin
執行删除操作:
[[email protected]_backup 21yunwei]# rm -rf ./*
[[email protected]_backup 21yunwei]# ll
total 0
現在開始進行誤删除檔案的恢複。這種情況一般是沒有守護程序或者背景程序對其持續輸入,是以删除就删除了,lsof也看不到。就要借助于工具。這裡我們采用的工具是extundelete第三方工具。恢複步驟如下:
- 停止對目前分區做任何操作,防止inode被覆寫。inode被覆寫基本就告别恢複了。比如停止所在分區的服務,解除安裝目錄所在的裝置,有必要的情況下都可以斷網。
- 通過dd指令對目前分區進行備份,防止第三方軟體恢複失敗導緻資料丢失。适合資料非常重要的情況,這裡測試,就沒有備份,如備份可以考慮如下方式:
dd if=/path/filename of=/dev/vdc1
- 通過umount指令,對目前裝置分區解除安裝。或者fuser 指令。
umount /dev/vdb1 或者 umount /21yunwei
如果提示裝置busy,可以用fuser指令強制解除安裝:
fuser -m -v -i -k /21yunwei
- 下載下傳第三方工具extundelete安裝,搜尋誤删除的檔案進行還原。
wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
tar jxvf extundelete-0.2.4.tar.bz2
cd extundelete-0.2.4
./configure
make
make install
掃描誤删除的檔案:
[[email protected]_backup extundelete-0.2.4]# extundelete --inode 2 /dev/vdb1
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 8 groups loaded.
Group: 0
Contents of inode 2:
.
.省略N行
File name | Inode number | Deleted status
. 2
.. 2
lost+found 11 Deleted
deletetest 12 Deleted
passwd 14 Deleted
通過掃描發現了我們删除的檔案夾,現在執行恢複操作。
1.恢複單一檔案passwd
[[email protected]_backup /]# extundelete /dev/vdb1 --restore-file passwd
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 8 groups loaded.
Loading journal descriptors ... 46 descriptors loaded.
Successfully restored file passwd
恢複檔案是放到了目前目錄RECOVERED_FILES。 檢視恢複的檔案:
[[email protected]_backup /]# tail -5 RECOVERED_FILES/passwd
mysql:x:497:500::/home/mysql:/bin/false
nginx:x:496:501::/home/nginx:/sbin/nologin
zabbix:x:495:497:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
haproxy:x:500:502::/home/haproxy:/bin/bash
tcpdump:x:72:72::/:/sbin/nologin
2.恢複目錄deletetest
[[email protected]_backup /]# extundelete /dev/vdb1 --restore-directory deletetest
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 8 groups loaded.
Loading journal descriptors ... 46 descriptors loaded.
Searching for recoverable inodes in directory deletetest ...
5 recoverable inodes found.
Looking through the directory structure for deleted files ...
[[email protected]_backup /]# cat RECOVERED_FILES/deletetest/mail/test.py
hello Dj
3.恢複所有
[[email protected]_backup /]# extundelete /dev/vdb1 --restore-all
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 8 groups loaded.
Loading journal descriptors ... 46 descriptors loaded.
Searching for recoverable inodes in directory / ...
5 recoverable inodes found.
Looking through the directory structure for deleted files ...
0 recoverable inodes still lost.
[[email protected]_backup /]# cd RECOVERED_FILES/
[[email protected]_backup RECOVERED_FILES]# tree
.
├── deletetest
│ └── mail
│ └── test.py
└── passwd
2 directories, 2 files
4.恢複指定inode
[[email protected]_backup /]# extundelete /dev/vdb1 --restore-inode 14
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 8 groups loaded.
Loading journal descriptors ... 46 descriptors loaded.
[[email protected]_backup /]# tail -5 /RECOVERED_FILES/file.14
mysql:x:497:500::/home/mysql:/bin/false
nginx:x:496:501::/home/nginx:/sbin/nologin
zabbix:x:495:497:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
haproxy:x:500:502::/home/haproxy:/bin/bash
tcpdump:x:72:72::/:/sbin/nologin
注意恢複inode的時候,恢複 出來的檔案名和之前不一樣,需要單獨進行改名。内容是沒問題的。
更多的extundelete用法請參考extundelete –help選項參數說明,目前恢複所有的操作完成。
原文連結:
http://www.21yunwei.com/archives/6030