在linux中rm命令的功能与格式(Linux下恢复rm删除的文件)(1)

导读

在日常的运维工作中,大部分OP都习惯性的经常rm -rf 命令用于文件目录的删除,通过命令“rm -rf”可以将任何数据直接从硬盘删除,并且没有任何提示,同时Linux下也没有与Windows下回收站类似的功能,也就意味着,数据在删除后通过常规的手段是无法恢复的。所以当出现误操作时,很难快速的找回被删除的文件。

数据恢复工作选择

在Linux下,基于开源的数据恢复工具有很多,常见的有debugfs、R-Linux、ext3grep、extundelete等,比较常用的有ext3grep和extundelete,这两个工具的恢复原理基本一样,只是extundelete功能更加强大,本文重点介绍extundelete的使用。

数据恢复原理

首先我们稍微复习一下计算机基础知识:

硬盘

硬盘是一种采用磁介质的数据存储设备,数据『物理意义上的』存储在若干个磁盘片上。在磁盘片的每一面上,以转动轴为轴心、以一定的磁密度为间隔的若干个同心圆就被划分成磁道(track),每个磁道又被划分为若干个扇区(sector)。

主引导扇区和分区表

硬盘的0磁道0柱面1扇区是主引导扇区位,包括硬盘主引导记录MBR(Main Boot Record)和分区表DPT(Disk Partition Table)。操作系统通过分区表把硬盘划分为若干个分区,然后再在每个分区里面创建文件系统,写入数据文件。

分区日志

分区日志系统是一个文件系统,用于修复由于计算机关闭不当而导致的任何不一致。这种关闭通常是由于电源中断或软件问题造成的。即记录了分区的数据读写操作。通过这些日志,可以知道分区中的历史操作。

数据存储

具体的数据存储原理内容比较多,这里不做过多的概述。为了便于理解,可在此理解为:

操作系统中的文件在硬盘的表现形式是在硬盘一片数据区域记录二进制信息,并由操作系统的一个指针指向该物理地址

而操作系统级别的『删除文件』,即删除这个『指针』

原来的物理地址内没有『指针』指向后,相当于被释放,当操作系统需要时,可以被复写上新的数据。

由此得知,extundelete 通过查阅分区日志,找到被删除的指针,告诉用户,可以尝试恢复哪些数据。但由于操作系统随时可以复写空余磁盘,所以如果要恢复的物理地址已经被改写,数据将无法找回。

解决方案演示

演示环境:

操作系统: CentOS 6

需要恢复的文件: /mnt/data1/tmpdir/testDelete/test.log

1.创建文件

在linux中rm命令的功能与格式(Linux下恢复rm删除的文件)(2)

向test.log文件中写入内容

2.删除文件

在linux中rm命令的功能与格式(Linux下恢复rm删除的文件)(3)

删除test.log文件

3.安装 extundelete文件恢复工具

执行命令: yum install extundelete -y

4.查询被删除文件所处磁盘

[root@master-worksvr testDelete]# df /mnt/data1/tmpdir/testDelete Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 142433064 129081532 6116360 96% /mnt/data1

5.卸载磁盘,保护现场

umount /dev/sda3 备注: 不卸载也可以,这样会导致磁盘可能会被其他的进程写入数据,从而抹掉原来的数据,建议卸载

6.获取磁盘根inode值

磁盘根目录的inode值,一般情况下为2

[root@master-worksvr testDelete]# ls -id / 2 /

7.查询可恢复的数据

extundelete /dev/sda3 --inode 2

在linux中rm命令的功能与格式(Linux下恢复rm删除的文件)(4)

从上图可看出tmpdir 的 inode 是 2883585,继续根据tmpdir的inode查询

extundelete /dev/sda3 --inode 2883585

在linux中rm命令的功能与格式(Linux下恢复rm删除的文件)(5)

从上图可看出testDelete 的 inode 是 2941415,继续根据testDelete的inode查询

extundelete /dev/sda3 --inode 2941415

在linux中rm命令的功能与格式(Linux下恢复rm删除的文件)(6)

最终找到了被删除的文件,也就意味着test.log这个我们之前删除的文件,是可以被恢复出来的。

8.恢复数据

采用extundelete命令恢复数据:

1.恢复单个文件使用参数“--restore-file”,恢复单个目录使用参数“--restore-directory”,需要使用文件的相对路径。

2.文件恢复成功后,在执行extundelete命令的当前目录下会创建一个RECOVERED_FILES目录,用于存放恢复出来的文件。

实际操作:

[root@master-worksvr ~]# extundelete /dev/sda3 --restore-file /tmpdir/testDelete/test.log NOTICE: Extended attributes are not restored. Loading filesystem metadata ... 1104 groups loaded. Loading journal descriptors ... 32255 descriptors loaded. Successfully restored file /tmpdir/testDelete/test.log [root@master-worksvr ~]# cat ./RECOVERED_FILES/tmpdir/testDelete/test.log TestDelteFile [root@master-worksvr ~]# #若文件无法恢复,则会抛出: No files were undeleted.

extundelete还有其他很强大的功能在此就不演示,下面为extundelte命令相关参数的解释,可供参考:

命令格式: extundelete [options] [--] device-file 其中,参数(options)有: --version, -[vV],显示软件版本号。 --help,显示软件帮助信息。 --superblock,显示超级块信息。 --journal,显示日志信息。 --after dtime,时间参数,表示在某段时间之后被删的文件或目录。 --before dtime,时间参数,表示在某段时间之前被删的文件或目录。 动作(action)有: --inode ino,显示节点“ino”的信息。 --block blk,显示数据块“blk”的信息。 --restore-inode ino[,ino,...],恢复命令参数,表示恢复节点“ino”的文件,恢复的文件会自动放在当前目录下的RESTORED_FILES文件夹中,使用节点编号作为扩展名。 --restore-file 'path',恢复命令参数,表示将恢复指定路径的文件,并把恢复的文件放在当前目录下的RECOVERED_FILES目录中。 --restore-files 'path',恢复命令参数,表示将恢复在路径中已列出的所有文件。 --restore-all,恢复命令参数,表示将尝试恢复所有目录和文件。 -j journal,表示从已经命名的文件中读取扩展日志。 -b blocknumber,表示使用之前备份的超级块来打开文件系统,一般用于查看现有超级块是不是当前所要的文件。 -B blocksize,通过指定数据块大小来打开文件系统,一般用于查看已经知道大小的文件。

注意事项

服务器的数据一定要及时备份或做好容灾,防止丢失。希望大家都不要出现这样的悲剧。

若在实际操作过程有相关问题,欢迎和我一起探讨!

,