在 Linux 系统运维工作中,经常会遇到因操作不慎、操作错误等导致文件数据丢失的情况,尤其对于客户企业中一些新手。当然,这里所指的是彻底删除,即已经不能通过“回收站”找回的情况,比如使用“rm -rf”来删除数据。针对 Linux 下的 EXT 文件系统,可用的恢复工具有 debugfs、ext3grep、extundelete 等。 其中 extundelete 是一个开源的 Linux 数据恢复工具,支持 ext3、ext4 文件系统。
在数据被误删除后,第一时间要做的就是卸载被删除数据所在的分区,如果是根分区的 数据遭到误删,就需要将系统进入单用户模式,并且将根分区以只读模式挂载。这样做的原 因很简单,因为将文件删除后,仅仅是将文件的 inode 节点中的扇区指针清零,实际文件还存储在磁盘上,如果磁盘继续以读写模式挂载,这些已删除的文件的数据块就可能被操作系统重新分配出去,在这些数据库被新的数据覆盖后,这些数据就真的丢失了,恢复工具也回天无力。所以以只读模式挂载磁盘可以尽量降低数据库中数据被覆盖的风险,以提高恢复数 据成功的比例。
下面将介绍使用 extundelete 工具如何恢复误删除的文件。
编译安装extundelete
在编译安装extundelete 之前需要先安装两个依赖包e2fsprogs-libs 和e2fsprogs-devel, 这两个包在系统安装光盘的/Package 目录下就有,使用 rpm 或 yum 命令将其安装。e2fsprogs-devel 安装依赖于 libcom_err-devel 包。
安装完依赖包之后,即可将提前上传的 extundelete 软件包解压、配置、编译、安装。
[root@localhost ~]# yum -y install gcc gcc-* make //编译安装需要的环境
[root@localhost ~]# yum -y install e2fsprogs-devel e2fsprogs-libs e2fsprogs wget bzip2 //安装两个依赖包e2fsprogs-libs 和e2fsprogs-devel
[root@localhost ~]# tar jxf extundelete-0.2.4.tar.bz2 //解压
[root@localhost ~]# cd extundelete-0.2.4/ //cd切到extundelete目录
[root@localhost extundelete-0.2.4]# ./configure --prefix=/usr/local/extundelete && make && make install //先执行 ./configure 配置再执行 make编译 再执行 make install 安装
[root@localhost extundelete-0.2.4]# echo $? //回显是0表示无问题
[root@localhost extundelete-0.2.4]# ln -s /usr/local/extundelete/bin/* /usr/bin/ //做个软链接
模拟删除并执行恢复操作
(1)使用 fdisk 命令创建新分区,将其挂载到/test/ 目录下,往该目录下新建一些文件或目录。
[root@localhost ~]# fdisk /dev/sdb //进入交互式分区创建一块磁盘
...... //省略部分内容Command (m for help): n Partition type:
p primary (0 primary, 0 extended, 4 free) e extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): Using default value 41943039
Partition 1 of type Linux and of size 20 GiB is set Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos
Disk identifier: 0x30e29e0f
Device Boot Start End Blocks Id System
/dev/sdb1 2048 41943039 20970496 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# partprobe /dev/sdb //重读分区表
[root@localhost ~]# mkfs.ext3 /dev/sdb1 //格式化磁盘
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label= OS type: Linux
Block size=4096 (log=2)
...... //省略部分内容
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[root@localhost ~]# mkdir /test/
[root@localhost ~]# mount /dev/sdb1 /test/ //挂载
[root@localhost ~]# mkdir /test/xiaoxu
[root@localhost ~]# touch /test/aa.txt
[root@localhost ~]# ls /test/ //查看test目录下的文件和目录
aa.txt lost+found xiaoxu
[root@localhost ~]# extundelete /dev/sdb1 --inode 2 //查看文件系统/dev/sdb1 下存在哪些文件,其中--inode 2 代表从 i 节点为 2 的文件开始查看,2 代表该文件系统最开始的目录
Would you like to continue? (y/n) //输入y按回车
(2)模拟误操作并恢复
[root@localhost ~]# rm -rf /test/* //模拟误操作
[root@localhost ~]# umount /test/ //误操作之后第一时间取消挂载
[root@localhost ~]# extundelete /dev/sdb1 --restore-all //恢复数据,只能支持ext3系列的恢复
执行完恢复的命令后,在当前目录下会出现一个/RECOVERED_FILES/目录,里面保 存了已经恢复的文件。
[root@localhost ~]# ls
anaconda-ks.cfg extundelete-0.2.4 extundelete-0.2.4.tar.bz2 RECOVERED_FILES
[root@localhost ~]# cd RECOVERED_FILES/
[root@localhost RECOVERED_FILES]# ls
aa.txt lost+found xiaoxu
当然 extundelete 的用法还有很多,可以通过 help 查看详细用法。