如何恢复 Linux 上删除的文件 (3)

豆豆网   技术应用频道   2008年01月22日  【字号: 收藏本文

内容摘要:恢复系统中删除的文件是一个非常繁琐的过程,而 e2undel 这个工具可以用来方便地恢复文件系统中已删除的文件。本文将首先讨论 e2undel 的工作原理和用法,并对之进行一些改进。然后讨论了文件系统故障、文件系统重建、磁盘物理损坏等情况下应该如何恢复数据。

  _init 和 _fini 这两个函数分别在打开和关闭动态链接库时执行,分别用来打开和关闭日志文件。如果某个命令(例如 rm)执行了 rmdir 系统调用,就会被这个库接管。rmdir 的处理比较简单,它先搜索到真正的 rmdir 系统调用的符号表,然后使用同样的参数来执行这个系统调用,如果成功,就将有关索引节点和文件名之类的信息记录到日志中(默认是 /var/e2undel/ e2undel)。

  这个库的使用非常简单,请执行下面的命令:

  清单6. libundel 的设置

# cp libundel.so.1.0 /usr/local/lib
# cd /usr/local/lib
# ln -s libundel.so.1.0 libundel.so.1
# ln –s libundel.so.1.0 libundel.so
  
# ldconfig
# mkdir /var/e2undel
# chmod 711 /var/e2undel
# touch /var/e2undel/e2undel
# chmod 622 /var/e2undel/e2undel

  上面的设置仅仅允许 root 用户可以恢复文件,如果希望让普通用户也能恢复文件,就需要修改对应文件的权限设置。

  现在尝试以另外一个用户的身份来删除些文件:

  清单7. 设置libundel之后删除文件

$ export LD_PRELOAD=/usr/local/lib/libundel.so
$ rm -rf e2undel-0.82

  要想记录所有用户的删除文件的操作,可以将 export LD_PRELOAD=/usr/local/lib/libundel.so 这行内容加入到 /etc/profile 文件中。

  现在使用 e2undel 来恢复已删除的文件就变得简单多了,因为已经可以通过文件名来恢复文件了:

  清单8. e2undel 利用 libundel 日志恢复删除文件

# ./e2undel -a -t -d /dev/sda2 -s /tmp/recover/
./e2undel 0.82
Trying to recover files on /dev/sda2, saving them on /tmp/recover/
  
/dev/sda2 opened for read-only access
/dev/sda2 was not cleanly unmounted.
Do you want wo continue (y/n)? y
489600 inodes (489531 free)
977956 blocks of 4096 bytes (941559 free)
last mounted on Fri Dec 28 20:45:05 2007
  
reading log file:
found 24 entries for /dev/sda2 in log file
searching for deleted inodes on /dev/sda2:
|==================================================|
489600 inodes scanned, 26 deleted files found
checking names from log file for deleted files: 24 deleted files with names
  
  user name | 1 <12 h | 2 <48 h | 3 <7 d | 4 <30 d | 5 <1 y | 6 older
-------------+---------+---------+---------+---------+---------+--------
    root |    0 |    0 |    0 |    2 |    0 |    0
    phost |   24 |    0 |    0 |    0 |    0 |    0
Select user name from table or press enter to exit: phost
Select time interval (1 to 6) or press enter to exit: 1
  
 inode   size deleted at    name
-----------------------------------------------------------
310083    0 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82
310113   2792 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/BUGS
310115   3268 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/HISTORY
310116   1349 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/INSTALL
310117   1841 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/INSTALL.de
310118   2175 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/Makefile
310119  12247 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/README
310120   9545 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/README.de
310121  13690 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/apprentice.c
310122  19665 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/ascmagic.c
310123   221 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/common.h
310124   1036 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/compactlog.c
310125  30109 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/e2undel.c
310127   2447 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/e2undel.h
310128   1077 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/file.c
310129   2080 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/file.h
310130   4484 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/find_del.c
310131   2141 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/is_tar.c
310132   2373 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/libundel.c
310133   7655 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/log.c
310134  39600 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/magic.h
310135   4591 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/names.h
310136  13117 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/softmagic.c
310137   5183 Dec 29 17:23 2007 /tmp/test/undel/e2undel-0.82/tar.h

来源:ibm    作者:冯锐 王磊    责编:豆豆技术应用

正在加载评论...