硬盘数据误删恢复

简介

最近有个朋友的硬盘数据误删了要恢复,大概研究了一下。

涉及到挺多因素的:

  • 系统平台
  • 是否有图形界面
  • 硬盘接口
  • 文件系统
  • 要恢复的文件大小,像代码之类的小文件恢复概率大,视频之类的大文件恢复概率小
  • 是否被擦写
  • 擦写量的大小,擦写量越大,恢复概率越小
  • 是否有阵列
  • 阵列的策略,除非是RAID0,其他策略要把多块硬盘拿出来一起恢复

在数据删除之后,首先要卸载被删除数据所在的磁盘或是分区,如果是系统根分区遭到误删除,就需要进入单用户模式下,将根分区以只读的方式挂载。

原因:因为文件删除之后,仅仅是将文件的inode节点中的扇区指针清零,实际上文件还存在磁盘上面,如果磁盘以读写方式挂载,这些删除的数据块可能会被系统从新分配出去,这些数据块被覆盖之后,这些数据就真的丢失了,所以以只读的方式挂载,尽可能避免数据被覆盖。

参考以下链接:

图形界面

有图形界面的,常用的两款软件有:R-Studio(不是统计常用的那个R Studio)和UFS。R-Studio比较易用,也支持多种文件系统,和多种磁盘阵列。

  1. 连接硬盘,打开R-Studio

    image-20220312170042494

    选中要扫描的硬盘盘符,扫描

  2. 扫描有三种策略,详细、简单和无

    image-20220312170423778

  3. 扫描的时候,下方有进度条和剩余时间

    image-20220312170450603

  4. 扫描完成后,F:recognized是按找到的目录结构显示,并标明哪些是恢复不了,哪些是恢复得了的;原始文件则是R-Studio会按照文件类型进行归类,方便我们选择具体哪些类型进行恢复

    image-20220312171023152

  5. 最后是选择某个文件夹来存放要恢复的文件

命令行

命令行有以下几个软件:

  • extundelete
  • foremost
  • ext3grep,不确定支不支持ext4
  • debugfs

看下来,还是extundelete最容易用,也支持的比较多。

extundelete

  1. 安装

    sudo apt install extundelete

    image-20220312175237527

  2. 先从根分区inode找起,根分区的inode为2

    extundelete /dev/sda5 --inode 2

  3. 接着往下找

    extundelete /dev/sda5 --inode 24641537

  4. 继续

    extundelete /dev/sda5 --inode 24903688

  5. 继续

    extundelete /dev/sda5 --inode 24904454

  6. 数据恢复,恢复指定目录,以当前分区为根分区进行路径设定,项目名进行掩盖

    extundelete /dev/sda5 --restore-directory /webapps/xxxx/upload

    因为磁盘数据一直在读写,所以有些文件之前的 inode 已经被重新分配了,导致部分数据无法恢复,数据最后会告诉我们有多少文件没有恢复。

    软件会在当前目录生成一个目录 RECOVERED_FILES 里面就是我们恢复的数据。

    恢复全部数据可以使用命令:

    extundelete /dev/sda5 --restore-all

相关参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
其中,参数(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,通过指定数据块大小来打开文件系统,一般用于查看已经知道大小的文件。
一分一毛,也是心意。