误删某个目录下的数据后(rm -rf *),禁止向该磁盘写入任何内容,要立即将该磁盘卸载或者挂载为只读,防止新的数据写入。一旦有新的数据写入,那么恢复的可能性就不大了。
切记!
切记!!
切记!!!
如果误删的数据较大,应单独准备一张数据盘作为恢复数据的中转盘。
如果删除的为/根目录,则需要将 extundelete安装到U盘中,恢复时将数据恢复到U盘中,不能恢复到/根,避免原数据被覆盖。
例如误删除了某个磁盘目录的处理过程如下:
/dev/sdb1挂载在/data1目录下,/data1目录下有aisvr、aiviewer两个目录,大小为160M左右,而在/data1目录下执行了rm -rf * 的操作,此时,按照如下步骤进行数据恢复处理。
1、先挂载磁盘为只读,防止新数据写入导致覆盖掉误删除的数据。
mount -o remount,ro /data1
2、源码安装extundelete工具及所需依赖
apt-get install libcomerr2 comerr-dev e2fslibs-dev
tar -xf extundelete-0.2.4.tar.bz2
cd /extundelete-0.2.4
./configure
make -j 4 #使用4进程同时编译,提升编译速度或者使用4核CPU同时编译。
make install
3、恢复
(1)、创建用于存放恢复数据的目录(其他磁盘的目录)
mkdir /data2
(2)、通过inode结点查看被删除的文件名字
cd /data2
extundelete /dev/sdb1 --inode 2 ###ext4文件系统的分区根目录的inode值为2,xfs分区根目录的inode值为64
下图可以看到被删除的目录名为aisvr、lost+found、aiviewer。
已删除的目录名.png
(3)、有多种恢复数据的方式,这里选取较为简便的两种,根据实际情况而定。
恢复某个目录,如目录aisvr、aiviewer下的所有文件
extundelete /dev/sdb1 --restore-directory aisvr
extundelete /dev/sdb1 --restore-directory aiviewer
恢复所有的文件
extundelete /dev/sdb1 --restore-all
恢复开始后,extundelete会自动在当前目录(/data2)生成RECOVERED_FILES目录,并将恢复的文件放到该目录下,恢复完成后可检查文件是否已全部恢复。
如果期间有新数据写入到/dev/sdb1挂载的目录下,那么部分数据的inode就已经被覆盖了,恢复的可能性非常小。
附:
一、文件删除原理
在ext3/4文件系统中,inode索引节点除了存放文件属性还指向文件的block节点,是书的目录,block存放文件的实际数据,是书的每一页,文件的上级目录的block存放的是文件名及其inode节点编号,删除文件实际上是删除文件名和inode节点编号的关联以及inode节点内的指针信息,那么实际上,文件的block还在,加上ext3/4文件系统是日志文件系统,格式化时会分配一个固定大小的空间的日志文件journal,它记录创建和删除文件的记录,当删除一个文件,操作系统首先把文件inode信息和文件名称写入到journal,然后删除文件并清空inode原始数据指针。
二、有两种情况无法恢复
1)当新的数据写入到被删除文件占用的block后,原来的inode号就指向新的数据,那么这样是无法找回的。
2)当journal日志文件存满之后,会释放前面的空间,循环使用,存放最新的记录,如果删除文件的记录被覆盖,是恢复不了的。
三、恢复文件的原理
根据journal日志文件残留inode的信息,定位到相关目录,恢复残留inode对应的block。但日志文件恢复只适合小数据量的恢复,因为journal的空间有限,存放不了太多记录。对于大文件如oracle等数据库文件恢复采用逆向推算和数据文件本身特点来提取。