大家好!
今天,我们想谈谈配置丢失的RAID阵列以及如何从中提取数据。本文将对数字取证专家和数据恢复工程师都有帮助。让我们首先了解什么是RAID。
RAID是什么?
RAID是独立磁盘冗余阵列。系统将其视为具有块访问功能的虚拟存储设备。本质上,RAID是一个虚拟驱动器。

组建RAID的目的是创建具有更高访问速度、更大容量和更高可靠性的存储。
人们为什么使用RAID?家庭用户可能组建阵列来创建备份或存储他们的个人照片和文档档案,以及家庭多媒体库(电影、音乐等)。公司使用RAID作为服务器上的数据存储。这可以是常见的(共享的)文档存储、备份存储、数据库、会计数据等。
简而言之,RAID是用于存储最有价值数据的大容量存储。
那么该如何处理它呢?
RAID镜像制作
制作RAID镜像有两种方法。
第一种是在被检查的机器上获取镜像。
这种方法的主要优点——无需了解阵列的构成方式。然而,这种方法有许多缺点,主要缺点是在运行中的被检查机器上操作是不好的。那么,有哪些可用的选项呢?
-
我们可以启动服务器,并从U盘或Live CD运行一些复制软件;尽管操作系统在工作过程中可能会更改某些内容,这显然是不利的。
-
可以从CD或U盘启动操作系统并运行软件——但不能保证它会工作,因为,例如,许多阵列是软件阵列(包括广泛使用的NAS),因此,要看到RAID,您需要运行相应的软件。此外,如果我们使用这种方法,我们将无法访问RAID中未使用的磁盘区域。
所以,总的来说,我们不能确定数据将保持不变。
第二种方法是分别对每个驱动器制作镜像。然后在只读模式下组装阵列。

这是唯一能确保数据完整性的方法,并且还使我们有机会研究硬盘的所有区域(RAID很可能没有从头到尾使用整个磁盘,而只使用了其内部的某些段。因此,可能存在可以存储隐藏数据的未使用区域)。
这种方法的主要缺点是必须组装阵列,即必须确定其配置。因此,要正确完成所有操作,我们需要定义配置。
RAID组装
要组装RAID,您必须确定:
-
使用了哪些驱动器:有时并非所有磁盘都被使用(可能有备用的或多余的用于"系统"的磁盘),有时磁盘数量不足(1个驱动器可能损坏或被丢弃,但由于冗余,阵列仍然运行)等等。
-
阵列中驱动器的顺序。有时它反映了磁盘在计算机内的放置顺序,但不要指望这一点。
-
RAID级别和算法(如果有的话)
-
用于条带化的块大小
-
RAID中使用的起始和结束LBA(驱动器不一定从0到MaxLBA全部使用)
-
延迟。重复是Compaq和HP阵列的常见特性(HP收购了Compaq)。
为什么定义参数可能是一个问题?答案很简单——所有可能配置的数量是巨大的!仅考虑驱动器顺序,4个驱动器就有几十种变体,5个驱动器有一百多种变体,7个驱动器有数千种变体。我们还有许多其他参数,这些参数会使可能配置的数量成倍增加。

当然,也有简单的情况,例如:
-
具有已知RAID元数据格式的软件阵列
-
成员数量少且级别简单(例如条带或镜像)
所有其他情况对于没有经验的用户来说可能真的很难。此外,在现实生活中,您必须处理使其变得异常复杂的因素:
-
RAID元数据丢失、损坏或不正确(残留在磁盘"先前"的使用中,或者是阵列重新初始化的结果)
-
RAID上的文件系统损坏,很难使用其元数据来定义配置(病毒或恶意破坏者可能损坏了文件系统)
-
某些成员可能未被使用——它们是热备盘或系统盘。
-
另一个关于成员的常见问题——您可能会从许多不同的阵列中得到一堆驱动器。因此,您首先需要弄清楚哪个磁盘来自哪个阵列
-
下一个问题——具有特殊配置的阵列,例如,可能使用了不寻常的磁盘起始偏移或延迟,或其他任何设置。
-
此外,通常需要在破坏性重建后恢复数据——使用不正确参数重建阵列的操作会导致数据损坏(重建本身可能就是调查的原因)
在检查过程中组装RAID是必要的行动。即使这项任务可能非常、非常困难。
成功的关键
什么能帮助我们克服所有困难?这是几种思想和方法的结合:
-
第一种是文件雕刻(Data Extractor中的"RAW Recovery"模式),能够确定文件完整部分的大小
-
第二种是对文件雕刻器找到的结果进行统计处理。单个文件可能给出错误的图像,但它们的集合显示出非常好的结果
-
第三种——快速检查假设的能力——为此我们需要一个工具来执行所有与RAID转换相关的转换,或者换句话说,我们需要实时RAID重建。为每个假设检查构建镜像需要大量时间
接下来,我们将更详细地探讨所有这些内容。
文件雕刻基础
文件雕刻(PC-3000中的"RAW Recovery"模式)是一种在不使用文件系统信息的情况下,利用文件格式知识来查找文件头的方法。最简单和最常用的方法是搜索文件开头的签名。例如,PNG图像在文件开头有签名"%PNG"。对于其他文件类型,签名当然是不同的。

文件格式的知识不仅使我们能够找到文件头,还能从下方估算文件的完整部分。

例如,PNG文件由一系列数据块组成,每个数据块都有签名、大小和校验和。也就是说,我们可以足够可靠地验证它。这意味着如果文件没有损坏或碎片化,我们可以从头到尾检查它,并说它是"完整的",其大小为N字节。
如果文件是碎片化的,或者其一部分被重写,或者其他情况,那么我们可以说这里是文件头,前几个片段是完整的。它们占用了K字节。之后某处存在损坏。可能是K+1字节或K+100字节——未知。但前K字节肯定是完整的。
对于不同类型的文件,检查完整部分的能力和此检查的准确性差异很大。有些地方可以像PNG示例中那样检查整个文件。有些地方我们只能检查开头的几百个字节,例如对于BMP文件,无论它是完整的还是损坏的。
能够查找多种文件类型的文件头并检查其完整部分,是PC-3000 RAID系统的独特功能,其他任何工具都不具备。
在RAID成员上进行文件雕刻
让我们看一个由3个成员组成的简单RAID 5左同步(LS)配置。如果您曾尝试从RAID恢复数据,应该熟悉此配置:

现在让我们看看它的一个成员,例如成员A:

此RAID表描述了转换的重复规则。图片仅显示了2个完整重复和第3个重复的开始。由于它是RAID成员,它存储数据块和冗余块——XOR。数据块不像0, 1, 2, 3, …那样一个接一个地排列,它们有间隔——0, 3, 6, 等等,因为其他块存储在其他成员上。
现在让我们谈谈文件雕刻在RAID成员上是如何工作的。

成员存储阵列的各个块,因此文件的完整部分受块大小的限制。
-
文件可能在数据块内的某个位置开始和结束
-
如果文件很大,它将在块末尾中断,因为文件的另一部分存储在另一个成员上
这里我们看到概率极小的情况:

在RAID成员上文件的完整部分:
-
不能从一个块跨越到另一个块
-
不能在XOR块内部
这种情况当然存在,但它们的数量远少于"正常"情况(如上一张幻灯片所示)
结论是,我们只能在单个数据块内部找到文件的完整部分。
雕刻数据的统计处理
RAID中的数据转换规则是周期性的。在我们的例子中,每3个块中有2个实际上是数据块,最后一个是XOR:

如果我们只是将每个块的每个扇区中的完整部分数量相加,我们会看到类似这样的情况:
-
数据块内部有大量文件的完整部分
-
XOR内部什么都没有
-
您可以看到块之间的边界,因为文件不会跨越块边界
让我们在实践中检验理论。只有PC-3000 RAID系统能够对雕刻数据进行统计处理并以图形方式展示结果。在此屏幕截图中,您可以看到解决实际案例时软件生成的直方图:
图片与上一张非常相似。数据块和"空"的XOR块清晰可见。红线显示了零值和非零值相邻的位置。它们有助于显示潜在的块边界。
这里是3个驱动器一起显示:

我们可以看到XOR块("空"的那个)在不同成员上的位置不同,正如RAID 5应有的那样。块大小等于128个扇区,并在直方图上显示(只是不要忘记LBA是从左到右增加,而不是从上到下。原因是在宽屏显示器上以这种方式查看信息更方便)。
不同周期的直方图
周期大小是磁盘数量乘以块大小和延迟。那么如果我们搞错了呢?我们会得到什么?以下是一些关于同一磁盘在不同周期下直方图外观的真实示例:

-
在第一种情况下,我们在块大小上犯了错误——设置的尺寸是所需大小的一半,得到的周期也小了一半,并且不清楚这是RAID 5
-
第二张图片——所有参数都正确,很清楚这是RAID 5
-
最后一张图片——我们选择了错误的参与者数量——4个而不是3个,我们再次看到直方图是"破碎的"
因此,如果我们用错误的周期构建统计数据,我们将看到错误的直方图。
这可以用作快速直方图测试:计算周期并查看直方图。如果可见空区域(如在XOR块中)——参数设置正确,如果不可见——这可能是错误,或者配置没有任何XOR、RS或HS块。在实际案例中,直方图是即时或在几秒钟内构建的。所以,这确实是一个快速测试。
不同配置示例
现在让我们看看一些不同配置的模式。图片上的所有直方图都基于真实案例。
RAID 5,8个驱动器,块大小128扇区
这里您可以看到构建在8个驱动器上、块大小为128扇区的RAID 5配置:

-
为什么是RAID 5?因为它只有一个"空"块——XOR
-
为什么是8个成员?因为周期由8个块组成
-
此外,128扇区的块大小通过红色辅助线之间的距离清晰可见
另外,您可以在XOR块中看到"噪音"。在那里找到了一些文件,这并非不可能。然而,它们的数量明显少于数据块中的数量。
RAID 6(或5EE),6个驱动器,块大小256扇区,起始LBA有偏移
这是由6个驱动器组成的RAID 6或5EE:

-
为什么是RAID 6?——因为有2个"空"块。一个是XOR,另一个是Reed-Solomon(或者是热备块,如果是5EE的话)
-
6个驱动器,因为周期中有6个块
-
一个"峰"的长度是256个扇区,这是块大小
在这张图片中,您可以看到在开头和结尾有部分块:

这是因为RAID不像前几种情况那样从0开始,它有一些偏移。开头的蓝色部分大小是64个扇区(红线上面有提示)。这意味着RAID从某个LBA开始,应该是这样的:N * 块大小 + 64,N = 0, 1, 2, …。在我们的例子中,它是1088 (= 4*256 + 64)——某些HP和Compaq阵列的典型起始LBA。
RAID 5,4个驱动器,延迟16,块大小128扇区
这里您可以看到延迟值为16的RAID 5:

我们是如何确定这一点的?这里您可以看到最右边的1/4是包含服务数据的区域。有很多红线——这是XOR中找到的小文件产生的"噪音"。总共有4个驱动器,因此我们推测这是一个由4个驱动器组成的RAID 5。(对于由8个驱动器组成的RAID 6,可以看到类似的直方图)。其余区域充满了数据,但可以清楚地看到一个区域内有多个块。让我们放大其中一个区域。
现在您可以看到一个区域内有16个块:

这意味着延迟是16,块大小是128个扇区。
RAID 0(或10或1E),块大小128扇区
这里是RAID 0的示例:

然而,RAID 10或1E,或者如果我们没有确定正确的周期,其他级别看起来也会完全相同。如果您使用此配置,应首先查找RAID-5或6的直方图。然后我们将能够说它是0、10或1E。这些级别没有XOR、Reed-Solomon或HS块,因此我们看不到"空"块。此外,我们无法说出RAID中有多少个磁盘,因为对于不同数量的驱动器,我们看到了类似的模式。
JBOD或非RAID驱动器
现在看看JBOD或仅仅是非RAID驱动器的直方图是什么样子。您可以看到根本没有块:

一个驱动器未使用,一个驱动器丢失
未使用的驱动器是不属于特定RAID阵列的驱动器。它可能是备用驱动器或用于存储操作系统数据的驱动器。
在图片中,您可以看到有4个驱动器属于由5个驱动器组成、块大小为512扇区的RAID 5。最后一个驱动器是陌生的。该驱动器的直方图与所有其他驱动器不同。结论:最后一个驱动器未使用。
我们只有5个成员中的4个,因此有一个成员丢失了。

对于来自不同阵列的驱动器也是同样的道理——它们的直方图会有所不同。
如此,我们看到每个RAID级别都有一个独特的直方图,它可以揭示很多关于配置的信息,甚至可以称为其"指纹"。
我们可以从直方图中得到什么?
因此,仅凭直方图就为我们提供了大量关于阵列的信息:
-
块大小
-
RAID级别
-
成员数量
-
延迟
-
可能的起始LBA集合
-
丢失和未使用的驱动器
但是驱动器顺序呢?
这里是一个由5个成员组成的RAID 5示例以及所有成员的直方图。在您看来,有多少种驱动器顺序是可能的?

所有驱动器的直方图使我们能够设置XOR对角线。总共有4种在RAID 5中使用的算法。对于每种算法,我们可以使用此对角线指定确切的顺序。Data Extractor RAID Edition 有很多方法来找到正确的选项并进行检查。我们不会深入细节,因为这是另一篇文章的主题。但是,简而言之,最简单的方法是尝试所有4个选项。

要做到这一点,您需要能够实时构建RAID,并查看各种配置,而不是为每个配置制作镜像。PC-3000 RAID系统能够快速更改RAID参数并立即观察结果。因此,遍历4种配置只需不到一分钟。
RAID 6和5EE的情况类似,但有更多选项——对于每种算法,您需要选择哪个块——XOR还是RS——先出现。
总而言之,所提出的使用文件雕刻结果统计处理的方法——又称直方图——将数百万种选择减少到少数几种可能。换句话说,它使复杂的RAID数据恢复问题变得简单!
如果您有任何问题,请随时联系ACE Lab的技术支持。