centos7 rm之后数据恢复的方式

仅供自己学习参考 如果文件没有被使用 初次测试发现基本无法恢复。

场景1 文件正在被程序使用

创建一个文件 并用tail -f一直读取文件信息   不要使用tailf 这个文件删除后会被终止掉

centos7rm centos7rm-rf删除目录恢复_文件系统

在另一个窗口删除这个文件

centos7rm centos7rm-rf删除目录恢复_标识符_02

安装lsof并通过lsof 查看正在读取这个文件的进程

yum -y install lsof
lsof |grep delete test.txt

centos7rm centos7rm-rf删除目录恢复_标识符_03

去/proc下查找对应pid的文件句柄

cd /proc/13419/fd
ls -l

centos7rm centos7rm-rf删除目录恢复_centos7rm_04

把状态为delete的数字 copy到任意文件夹恢复

cp 3 /opt/test.txt_bak
# 查看test.txt_bak的内容  与原文件一致
cat /opt/test.txt_bak

centos7rm centos7rm-rf删除目录恢复_centos7rm_05

场景2 文件未被程序使用

xfs貌似没有成熟的恢复工具啊。看网上都是恢复ext4的。关于xfs我查到的都是先备份

基本上我自己测试恢复 都无法恢复。。。也可能是我不熟练的缘故

下面测试的工具都恢复失败,或者恢复出来的文件不对。

查看磁盘类型

df -lhT

centos7rm centos7rm-rf删除目录恢复_标识符_06

centos7rm centos7rm-rf删除目录恢复_django_07

如果是外挂盘 应该先umount 确保没有读写操作影响恢复

df -h 
umount /${mount_dir}
df -h

centos7rm centos7rm-rf删除目录恢复_centos7rm_08

工具0 ReclaiMe xfs格式windows恢复软件

官网:http://www.reclaime.com/library/xfs-recovery.aspx

支持虚拟硬盘文件vhd,vmdk,还支持xfs格式系统。只有windows exe 我这边没有测试安装

centos7rm centos7rm-rf删除目录恢复_centos7rm_09

工具1 extundelete
yum -y install bzip2
cd /opt
wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
bzip2 -d extundelete-0.2.4.tar.bz2
tar xvf extundelete-0.2.4.tar
yum install -y gcc-c++ e2fsprogs-devel
cd extundelete-0.2.4
./configure
make  && make install
/usr/local/bin/extundelete -v

安装完成 查看版本号

centos7rm centos7rm-rf删除目录恢复_标识符_10

测试磁盘是xfs 恢复不了

测试磁盘是ext4 这里引用了阿里云的例子

完成以下操作,使用extundelete模拟数据误删除后恢复的过程:

  1. 检查ECS现有的磁盘和可用分区,并对/dev/vdb进行分区和格式化。
fdisk -l
# 此处省略格式化等命令

centos7rm centos7rm-rf删除目录恢复_标识符_11

  1. 将分区后的磁盘挂载到/zhuyun目录下,然后在/zhuyun下新建测试文件hello,并写入内容test
mkdir /zhuyun                                #新建zhuyun目录
mount /dev/vdb1 /zhuyun                      #将磁盘挂载到zhuyun目录下
echo test > hello                            #写入测试文件
  1. 记录文件hello的md5值。md5sum命令用于生成和校验删除前和恢复后两个文件的md5值。
md5sum hello

centos7rm centos7rm-rf删除目录恢复_文件系统_12

  1. 模拟删除hello文件。
rm -rf hello
cd ~
fuser -k /zhuyun                     #结束使用某分区的进程树(确认没有资源占用的话,可以跳过此步)
  1. 卸载数据盘。
umount /dev/vdb1                     #任何的文件恢复工具,在使用前,均要将要恢复的分区卸载或挂载为只读,防止数据被覆盖使用
  1. 使用extundelete工具恢复文件。
extundelete --inode 2 /dev/vdb1       #为查找某i节点中的内容,使用2则说明为整个分区搜索,如果需要进入目录搜索,只须要指定目录I节点即可。这是可以看到删除的文件名和inode
/usr/local/bin/extundelete  --restore-inode 12  /dev/vdb1    #恢复删除的文件

这个时候会在执行命令的同级目录下出现RECOVERED_FILES目录。

centos7rm centos7rm-rf删除目录恢复_django_13

  1. 通过md5sum命令查看恢复后RECOVERED_FILES文件的md5值。
md5sum RECOVERED_FILES

查看删除前的hello和恢复后的RECOVERED_FILES两个文件的md5值是否一致,如果一致,则数据恢复成功。

这一部分是自己测试失败的情况 可以跳过

一定要umount 磁盘 不然会直接提示Space has been reallocated。我这里只有一块系统盘 vda1 所以直接被回收了。

# 执行命令
extundelete /dev/vda1 --inode 2239548
# 恢复文件 最后这个file是根据上面命令获取到的名称 如图
extundelete /dev/vda --restore-file file
# 恢复成功的文件会在当前文件夹的RECOVERED_FILES下 会有历史版本。

# 恢复目录
extundelete /dev/vda --restore-directory testdir
# 恢复全部
extundelete /dev/vda --restore-all

centos7rm centos7rm-rf删除目录恢复_centos7rm_14

挂一块盘测试

centos7rm centos7rm-rf删除目录恢复_文件系统_15

centos7rm centos7rm-rf删除目录恢复_django_16

初始化vdb

[root@django ~]# fdisk  -l

磁盘 /dev/vda:42.9 GB, 42949672960 字节,83886080 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000b2d99

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048    83875364    41936658+  83  Linux

磁盘 /dev/vdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

[root@django ~]# fdisk /dev/vdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0xa7a2f339 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):p

磁盘 /dev/vdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xa7a2f339

   设备 Boot      Start         End      Blocks   Id  System

命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):
将使用默认值 41943039
分区 1 已设置为 Linux 类型,大小设为 20 GiB

命令(输入 m 获取帮助):t
已选择分区 1
Hex 代码(输入 L 列出所有代码):L

 0  空              24  NEC DOS         81  Minix / 旧 Linu bf  Solaris
 1  FAT12           27  隐藏的 NTFS Win 82  Linux 交换 / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 隐藏的 C:  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux 扩展      c7  Syrinx
 5  扩展            41  PPC PReP Boot   86  NTFS 卷集       da  非文件系统数据
 6  FAT16           42  SFS             87  NTFS 卷集       db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux 纯文本    de  Dell 工具
 8  AIX             4e  QNX4.x 第2部分  8e  Linux LVM       df  BootIt
 9  AIX 可启动      4f  QNX4.x 第3部分  93  Amoeba          e1  DOS 访问
 a  OS/2 启动管理器 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad 休 eb  BeOS fs
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         ee  GPT
 f  W95 扩展 (LBA)  54  OnTrackDM6      a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        f0  Linux/PA-RISC
11  隐藏的 FAT12    56  Golden Bow      a8  Darwin UFS      f1  SpeedStor
12  Compaq 诊断     5c  Priam Edisk     a9  NetBSD          f4  SpeedStor
14  隐藏的 FAT16 <3 61  SpeedStor       ab  Darwin 启动     f2  DOS 次要
16  隐藏的 FAT16    63  GNU HURD or Sys af  HFS / HFS+      fb  VMware VMFS
17  隐藏的 HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE
18  AST 智能睡眠    65  Novell Netware  b8  BSDI swap       fd  Linux raid 自动
1b  隐藏的 W95 FAT3 70  DiskSecure 多启 bb  Boot Wizard 隐  fe  LANstep
1c  隐藏的 W95 FAT3 75  PC/IX           be  Solaris 启动    ff  BBT
1e  隐藏的 W95 FAT1 80  旧 Minix
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@django ~]# part
parted     partprobe  partx
[root@django ~]# partprobe
[root@django ~]# pvcreate /dev/vdb1
  Physical volume "/dev/vdb1" successfully created.
[root@django ~]# vgcreate vg01 /dev/vdb1
  Volume group "vg01" successfully created
[root@django ~]# lvcreate -L 19G -n lv01 vg01
  Logical volume "lv01" created.
[root@django ~]# mkfs.ext4 /dev/vg01/lv01
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1245184 inodes, 4980736 blocks
249036 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2153775104
152 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
	4096000

Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

[root@django ~]# mount /dev/vg01/lv01 /test/

centos7rm centos7rm-rf删除目录恢复_文件系统_17

centos7rm centos7rm-rf删除目录恢复_文件系统_18

开始测试

centos7rm centos7rm-rf删除目录恢复_标识符_19

lvm 卷 不能恢复? 直接说格式不对

centos7rm centos7rm-rf删除目录恢复_django_20

再买了一块盘测试 这回没有做lvm

[root@django ~]# fdisk -l

磁盘 /dev/vda:42.9 GB, 42949672960 字节,83886080 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000b2d99

   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048    83875364    41936658+  83  Linux

磁盘 /dev/vdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

[root@django ~]# fdisk /dev/vdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0xb27699d1 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):p

磁盘 /dev/vdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xb27699d1

   设备 Boot      Start         End      Blocks   Id  System

命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):
将使用默认值 41943039
分区 1 已设置为 Linux 类型,大小设为 20 GiB

命令(输入 m 获取帮助):t
已选择分区 1
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@django ~]# mkfs.ext4 /dev/vdb1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1310720 inodes, 5242624 blocks
262131 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2153775104
160 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
	4096000

Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

[root@django ~]# mount /dev/vdb
vdb   vdb1
[root@django ~]# mount /dev/vdb1 /test/
[root@django ~]# cd te
-bash: cd: te: 没有那个文件或目录
[root@django ~]# lscd ^C
[root@django ~]# cd /test/
[root@django test]# ls
lost+found
[root@django test]#

centos7rm centos7rm-rf删除目录恢复_标识符_21

centos7rm centos7rm-rf删除目录恢复_django_22

尬住 测试了几次 都不行。。我都是删除了就umout了 要么就是inode找不到删除的文件

报错Bad magic number in super-block when trying to open filesystem,经查证extundelete工具不能对xfs文件系统进行数据恢复.已知该工具能够对ext4文件系统进行数据恢复 测试好像也不是所有ext4 都可以

工具2 testdisk

恢复失败 测试的磁盘格式为xfs

yum -y install bzip2
cd /opt
wget https://www.cgsecurity.org/testdisk-7.2-WIP.linux26-x86_64.tar.bz2
bzip2 -d testdisk-7.2-WIP.linux26-x86_64.tar.bz2
tar xvf testdisk-7.2-WIP.linux26-x86_64.tar
cd testdisk-7.2-WIP

mkdir /srv/test
echo a > /srv/test/a.txt
fdisk -l
df -h 
# 删除文件之后 下掉对应磁盘 
rm -rf /srv/test && umount  /srv/
df -h

恢复失败 测试的磁盘格式为ext4

工具3 foremost
yum install https://forensics.cert.org/centos/cert/7/x86_64//foremost-1.5.7-13.1.el7.x86_64.rpm -y
touch 123.zip
 # 删除文件测试
 rm -rf 123.zip
 # 这里recovery文件夹必须为空
 foremost  –I /dev/vda  -o /recovery3/

centos7rm centos7rm-rf删除目录恢复_文件系统_23

恢复完成之后 找不到删除的txt 只能恢复固定格式的文件 感觉一般 测试了3次 失败2次。没有生成我删除的文件 这些doc文件也没有验证

avi, bmp, dll, doc, exe, gif, htm, jar, jpg, mbd, mov, mpg, pdf, png, ppt, rar, rif, sdw, sx, sxc, sxi, sxw, vis, wav, wmv, xls, zip

centos7rm centos7rm-rf删除目录恢复_标识符_24

工具4 scalpel
yum -y install scalpel
# 查看支持恢复的文件格式  这个好像也不支持txt格式
cat /etc/scalpel.conf

centos7rm centos7rm-rf删除目录恢复_文件系统_25

scalpel  -c /etc/scalpel.conf  /dev/sda2 -o /pngrecovery/

centos7rm centos7rm-rf删除目录恢复_centos7rm_26

centos7rm centos7rm-rf删除目录恢复_centos7rm_27

恢复出来也不是我想要的

centos7rm centos7rm-rf删除目录恢复_标识符_28