使用条件:
系统中有进程一直在访问这个文件。
特别利于:日志文件和数据库
原因:
- 伪删除机制,文件数据还在,但是目录的索引被删除了。
- 此时,在访问的程序并不知道文件被删,所以句柄(指向文件的标识)依然存在。
- 于是,我们就可以通过lsof命令找出这个句柄,通过它找到错删的文件内容。
详细用法:
打个比方,由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法如下:
首先使用lsof来查看当前是否有进程打开/var/logmessages文件,如下:
1 |
# lsof |grep /var/log/messages |
2 |
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下的每个以数字命名的文件表示进程对应的文件描述符)中查看相应的信息,如下:
01 |
# head -n 10 /proc/1283/fd/2 |
02 |
Aug 4 13:50:15 holmes86 syslogd 1.4.1: restart. |
03 |
Aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.
|
04 |
Aug 4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 (root@everestbuilder.linux-ren.org) (gcc version 4.2.0) |
05 |
#1 SMP Wed Jul 18 11:18:32 EDT 2007 |
06 |
Aug 4 13:50:15 holmes86 kernel: BIOS-provided physical RAM map: |
07 |
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000000000 - 000000000009f000 (usable) |
08 |
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved) |
09 |
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000100000 - 000000001f7d3800 (usable) |
10 |
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000001f7d3800 - 0000000020000000 (reserved) |
11 |
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000e0000000 - 00000000f0007000 (reserved) |
12 |
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000f0008000 - 00000000f000c000 (reserved) |
从上面的信息可以看出,查看 /proc/1283/fd/2 就可以得到所要恢复的数据。如果可以通过文件描述符查看相应的数据,那么就可以使用 I/O 重定向将其复制到文件中,如:
cat /proc/1283/fd/2 > /var/log/messages
对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。
用法部分摘自 <http://blog.csdn.net/guoguo1980/article/details/2324454>
转载请注明:旅途@KryptosX » 一种文件恢复技巧
时间: 2024-10-24 22:56:11