使用 Scalpel 查找丢失的文件
作为系统管理员,您的部分职责是帮助用户管理数据。其中最重要的一点是确保您的组织有一个良好的备份计划,并且您的用户要么定期进行备份,要么因为您已经实现了该过程的自动化而不必进行备份。
然而,有时最糟糕的事情还是会发生。文件被误删除、文件系统损坏或分区丢失,无论出于何种原因,备份都不包含您需要的内容。
正如我们在如何防止和恢复 Linux 中意外删除的文件中所讨论的那样,在尝试恢复丢失的数据之前,您必须首先找出数据丢失的原因。用户可能只是放错了文件,或者用户不知道有备份。但如果用户确实删除了没有备份的文件,那么您就知道需要恢复已删除的文件。但是,如果分区表变得混乱,那么文件实际上根本没有丢失,您可能需要考虑使用 TestDisk 来恢复分区表或分区本身。
如果您的文件或分区恢复不成功,或者只成功了一部分,会发生什么情况?那么就该使用Scalpel了。Scalpel 根据描述独特文件类型的模式执行文件雕刻操作。它根据二进制字符串和正则表达式查找这些模式,然后相应地提取文件。
此工具目前尚未维护,但它始终可靠,编译和运行完全符合预期。如果您运行的是Red Hat Enterprise Linux (RHEL) 7、RHEL 8 或Fedora,则可以 libtre
从klaatu.fedorapeople.org下载 Scalpel 的 RPM 安装程序及其依赖项。
从手术刀开始
Scalpel 附带了全面的文件类型列表及其最独特的识别功能。有时,可以通过文件头部和尾部的可预测文本来识别文件:
htm n 50000 <html </html>
而在其他时候,看起来神秘的十六进制代码是必要的:
jpg y 200000000 \xff\xd8\xff\xe0\x00\x10 \xff\xd9
Scalpel 希望您重复 /etc/scalpel.conf
编辑副本,以包含您希望恢复的文件类型,并排除您不需要的文件类型。例如,如果您知道自己没有或不关心.fws
文件,则将该行从文件中注释掉。这样做可以加快恢复过程并减少误报。
在配置文件中,文件定义的格式从左到右如下:
- 文件的扩展名。
- 页眉和页脚是否区分大小写(
y
或n
)。 - 您希望 Scalpel 找到的最小和最大文件大小。
- 标识文件开头的标准标头。
- 标识文件结尾的标准页脚。
此footer
字段是可选的。如果没有提供页脚,Scalpel 将提取您设置为文件类型最大值的字节数。
您可能会发现恢复工作只能挽救文件的一部分,例如这个大部分恢复的 JPG:
这个结果意味着您可能需要增加文件的边界最大值,然后重新扫描,以便也可以恢复文件的末尾:
定义新的文件类型
首先,复制一份 Scalpel 配置文件。如果所有用户都生成类似的数据,那么整个组织可能只需要一个配置文件。或者,您可能会发现每个部门一个配置文件会更好。
要将您自己的文件类型添加到 Scalpel 配置中,请先进行一些调查取证。
对于文本文件,理想情况下,您可以预测一些可预测的结构。例如,XML 文件可能以 开头<xml
并以 结尾</xml
。二进制文件同样可以预测。使用hexdump
命令,您可以查看要定义的文件类型的典型标头。以下是 XCF(GIMP 的默认分层图形文件)的结果:
$ head --bytes 8 example.xcf | hexdump --canonical
00000000 67 69 6d 70 20 78 63 66 |gimp xcf|
00000008
此输出来自Red Hat Enterprise Linux 8系统。在较旧的系统上,可能需要较旧的语法:
$ head --bytes 8 example.xcf | hexdump -C
00000000 67 69 6d 70 20 78 63 66 |gimp xcf|
00000008
的规范输出hexdump
在最左边一列显示地址,在最右边显示解码后的值。中间一列是 XCF 文件第一行的前 8 个字节的十六进制字节。
中的大多数二进制文件/etc/scalpel.conf
看起来与该输出非常相似,只是这些值以转义序列开头,\x
以表示数字实际上是十六进制数字。例如,JPG 文件在配置文件中如下所示:
jpg y 200000000 \xff\xd8\xff\xe0\x00\x10 \xff\xd9
scalpel.conf
将该值与系统上任何 JPG 文件的前 6 个字节(因为这是其 JPG 定义中包含的字节数)的测试十六进制转储进行比较:
$ head --bytes 6 example.jpg | | hexdump --canonical
00000000 ff d8 ff e0 00 10 |......|
00000006
将页脚与最后 2 个字节进行比较,以匹配配置文件显示的内容:
$ tail --bytes -2 example.jpg | hexdump --canonical
00000000 ff d9 |..|
00000002
这些值是匹配的,因此您可以确信有效的 JPG 文件可能都以可预测的序列开始和结束。
注意:文件中的 Ogg 条目scalpel.conf
具有误导性,因为它缺少\x
转义序列。如果您需要恢复 Ogg 文件,请修复此问题或替换其定义。
去上班
现在,要对所有需要恢复的文件(例如上例中的 XCF)获得相同的置信度。重申一下,这是定义受害驱动器常见的二进制文件类型的工作流程:
- 使用命令获取文件类型的前几个字节的十六进制值
head --bytes n
。 - 使用命令获取最后几个字节
tail --bytes -n
。 - 对同一类型的几个不同文件重复此过程以确认该模式的一致性,并根据需要调整页眉和页脚模式的长度。
- 将页眉和页脚值输入到您的自定义 Scalpel 配置中,使用
\x
符号将每个字节标识为十六进制字符。
对于您需要恢复的每种重要的二进制文件类型,请按照此顺序进行操作。
如果文件是纯文本,请提供通用的页眉和页脚,例如#!/bin/sh
对于 shell 脚本#
(后面的空格#
很重要)、对于具有 h1 级别标题的 markdown 文件、<xml
对于 XML 文件等等。
当您准备好运行 Scalpel 时,请创建一个目录来放置您救出的文件:
$ mkdir /run/media/seth/rescuer/scalped
注意:不要在包含丢失数据的同一卷上创建此目录。
如果受害驱动器尚未安装,请安装它,然后运行 Scalpel:
$ scalpel -c my-scalpel.conf \
-o /run/media/seth/rescuer/scalped \
/run/media/seth/victim
您还可以在磁盘映像上运行 Scalpel:
$ scalpel -c my-scalpel.conf \
-o ~/scalped ~/victim.img
当 Scalpel 完成后,检查指定救援目录中的文件。
总而言之,最好进行备份,这样您就可以完全避免进行文件恢复。但是,如果发生最坏的情况,请尝试使用 Scalpel 并小心地进行雕刻。