Linux下数据恢复
一、 将磁盘分区挂载为只读
这一步很重要,并且在误删除文件后应尽快将磁盘挂载为只读。越早进行,恢复的成功机率就越大。
否则其他daemons(进程) 都来读写,神仙都恢复不了了。磁盘规划时一定要做功能分区。否则,误删了想恢复也很困难。比如linux安装时不分区整个装/下面,就很麻烦。
/data挂在/dev/sdb1上
[root@localhost ~]# mount
/dev/sda2 on /home type ext4 (rw)
/home on /home type none (rw)
[root@localhost ~]# mount -r -n -o remount /home
mount: /home is busy
这需看看有哪些进程在用:
[root@localhost ~]# fuser -v -m /home
可以看到有很多java和hadoop进程在使用,杀之。
[root@localhost ~]# mount -r -n -o remount /home
成功。
再到/data里touch文件,报错。
[root@localhost ~]# touch a
touch: cannot touch `a’: Read-only file system
一下就放轻松了很多。因为改为只读挂载后,可以慢慢恢复,再也不用担心我的文件被覆盖。
1. 上传恢复工具extundelete并解压
tar jxvf extundelete - 0 . 2 . 4 .tar.bz2
2. 编译
(1) configure
[root@localhost extundelete-0.2.4]# ./configure
configure时报错,看了下config.log,确定是本机没编译环境 。
yum -y install gcc+ gcc-c++
等待,有一点慢。
安装完成后,再次config,依然报错
Configuring extundelete 0.2.4
configure: error: Can’t find ext2fs library
这是因为extundelete依赖e2fsprogs。
安装e2fsprogs后再次configure,成功。
[root@localhost extundelete-0.2.4]# yum install e2fsprogs-devel
[root@localhost extundelete-0.2.4]# ./configure
Configuring extundelete 0.2.4
Writing generated files to disk
(2) make & make install
[root@localhost extundelete-0.2.4]#make & make install
如果没有异常信息,基本说明安装成功.
(3) 可以到src目录验证下.
[root@localhost extundelete-0.2.4]# cd src
[root@localhost src]# ./extundelete
No action specified; implying --superblock.
./extundelete: Missing device name.
Usage: ./extundelete [options] [--] device-file
.............
[root@localhost src]# ./extundelete -v
extundelete version 0.2.4
libext2fs version 1.41.12
Processor is little endian.
如上信息,证明安装成功。
2. 查看被删除文件
# extundelete /dev/sdb1 --inode 2
File name | Inode number | Deleted status
. 2
.. 2
lost+found 11
xguest 131073
testml 131081 Deleted
[root@localhost src]# extundelete /dev/sda2 --restore-all
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 32 groups loaded.
Loading journal descriptors ... 44 descriptors loaded.
Searching for recoverable inodes in directory / ...
2 recoverable inodes found.
Looking through the directory structure for deleted files ...
0 recoverable inodes still lost.
这时可以看到恢复的文件 (默认会在当前目录生成一个RECOVERED_FILES)
[root@localhost src]# ls
block.c extundelete extundelete-cli.o extundelete-insertionops.o jfs_compat.h Makefile.am
block.h extundelete-block.o extundelete-extundelete.o extundelete-priv.h kernel-jbd.h Makefile.in
cli.cc extundelete.cc extundelete.h insertionops.cc Makefile RECOVERED_FILES
[root@localhost src]# cd RECOVERED_FILES/
[root@localhost RECOVERED_FILES]# ls
testml
[root@localhost RECOVERED_FILES]#
指定恢复某个文件
extundelete /dev/sda? (? 表示磁盘号) --restore-file + '文件名'
恢复完成后,将文件系统重新mount 就可重新使用。
或 先umount再mount; 或者 mount -o rw,remount + /mnt/data (要重新挂载的路径 如/home)