好吧,我会回答我自己的问题,以免给别人带来同样的痛苦。
0. 警告
如果您正在进行恢复,请始终复制您的数据并处理副本。不要更改原始的“损坏”数据。说了这么多,继续看下去。
1.您的分区看起来像...
安装 sleuth kit 和 testdisk。希望有适合您的发行版的软件包:)
# mmls -t gpt LUN01
GUID Partition Table (EFI)
Offset Sector: 0
Units are in 512-byte sectors
Slot Start End Length Description
00: Meta 0000000000 0000000000 0000000001 Safety Table
01: ----- 0000000000 0000000033 0000000034 Unallocated
02: Meta 0000000001 0000000001 0000000001 GPT Header
03: Meta 0000000002 0000000033 0000000032 Partition Table
04: 00 0000000034 0000002081 0000002048 LDM metadata partition
05: 01 0000002082 0000262177 0000260096 Microsoft reserved partition
06: 02 0000262178 1048576966 1048314789 LDM data partition
07: ----- 1048576967 1048576999 0000000033 Unallocated
注意:testdisk 将为您提供相同的信息,但细节较少 # testdisk /list LUN01
2.提取磁盘元数据
有关分区的磁盘顺序、数据大小和其他加密属性的所有信息都将在 LDM 元数据分区中找到。自本文档 [2] 以来,W2k8 并没有太大变化,尽管有些尺寸不同,有些属性是新的(显然是未知的)......
# dd if=LUN01 skip=33 count=2048 |xxd -a > lun01.metadata
# less lun01.metadata
在第 0002410 行,您应该看到服务器的名称。放心?但我们是在磁盘顺序和磁盘 ID 之后。向下滚动。
2.1。磁盘顺序
在第 0003210 行,您应该看到 'Disk1' 后跟一个长字符串。
0003200: 5642 4c4b 0000 001c 0000 0006 0000 0001 VBLK............
0003210: 0000 0034 0000 003a 0102 0544 6973 6b31 ...4...:...Disk1
0003220: 2437 3965 3830 3239 332d 3665 6231 2d31 $79e80293-6eb1-1
0003230: 3164 662d 3838 6463 2d30 3032 3662 3938 1df-88dc-0026b98
0003240: 3335 6462 3300 0000 0040 0000 0000 0000 35db3....@......
0003250: 0048 0000 0000 0000 0000 0000 0000 0000 .H..............
这意味着该卷的第一个磁盘由以下唯一 ID (UID) 标识:79e80293-6eb1-11df-88dc-0026b9835db3 但目前,我们不知道哪个磁盘有这个 UID!因此,移动到 Disk2 条目并记下它的 UID 等,以了解您在卷中拥有的所有磁盘。注意:根据我的经验,只有前 8 个字符发生了变化,其余的保持不变。实际上,W2k8 似乎将 ID 增加了 6。$ 是一个分隔符。
例如。:
Windows Disk1 UID : 79e80293-6eb1-11df-88dc-0026b9835db3
Windows Disk2 UID : 79e80299-...
Windows Disk3 UID : 79e8029f-...
2.2. 查找磁盘 UID
转到第 00e8200 行 (lun01.metadata)。您应该找到“PRIVHEAD”。
00e8200: 5052 4956 4845 4144 0000 2c41 0002 000c PRIVHEAD..,A....
00e8210: 01cc 6d37 2a3f c84e 0000 0000 0000 0007 ..m7*?.N........
00e8220: 0000 0000 0000 07ff 0000 0000 0000 0740 ...............@
00e8230: 3739 6538 3032 3939 2d36 6562 312d 3131 79e80299-6eb1-11
00e8240: 6466 2d38 3864 632d 3030 3236 6239 3833 df-88dc-0026b983
00e8250: 3564 6233 0000 0000 0000 0000 0000 0000 5db3............
00e8260: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00e8270: 3162 3737 6461 3230 2d63 3731 372d 3131 1b77da20-c717-11
00e8280: 6430 2d61 3562 652d 3030 6130 6339 3164 d0-a5be-00a0c91d
00e8290: 6237 3363 0000 0000 0000 0000 0000 0000 b73c............
00e82a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00e82b0: 3839 3164 3065 3866 2d64 3932 392d 3131 891d0e8f-d929-11
00e82c0: 6530 2d61 3861 372d 3030 3236 6239 3833 e0-a8a7-0026b983
00e82d0: 3564 6235 0000 0000 0000 0000 0000 0000 5db5............
00e82e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
我们需要的是这个特定磁盘的磁盘 UID。我们看到: - 磁盘 ID:79e80299-6eb1-11df-88dc-0026b9835db3 - 主机 ID:1b77da20-c717-11d0-a5be-00a0c91db73c - 磁盘组 ID:891d0e8f-d929-11e0-a8a7-0026b9835db
所以这个 UID 为 79e80299-... 的磁盘是 Windows Disk2 但对我们来说它是物理磁盘 1。确实可以按照上面找到的磁盘顺序找到这个 UID。注意:没有逻辑顺序。我的意思是 Windows 决定如何设置磁盘顺序,而不是你。所以没有人为的逻辑,不要指望你的第一个磁盘是 Disk1。
所以不要假设上面的顺序会遵循任何人类逻辑。我建议您检查磁盘的所有 LDM 数据并提取它们的 UID。(您可以使用以下命令仅提取 PRIVHEAD 信息:dd if=LUNXX skip=1890 count=1 |xxd -a)
例如:
(Windows) Disk1 : 79e80293-... == Physical disk 2
(Windows) Disk2 : 79e80299-... == Physical disk 1
(Windows) Disk3 : 79e8029f-... == Physical disk 3
我确信在 LDM 元数据的某个地方,您可以找到卷的类型(跨区、RAID0、RAIDX 和相关的条带大小)但是,我还没有挖掘它。我使用“尝试并重试”方法来查找我的数据。因此,如果您知道如何在戏剧之前设置您的配置,您将节省大量时间。
3. 找到 NTFS 文件系统和你的数据
现在我们对要恢复的大量数据感兴趣。在我的情况下,它是 ~512GB 的数据,所以我们不会将整个数据转换为 ASCII。我还没有真正搜索过 Windows 如何找到其 NTFS 分区的开头。但我发现它在逻辑上以以下关键字开头:R.NTFS。让我们找到它并找到稍后我们必须应用的偏移量才能看到我们的 NTFS FS。
06: 02 0000262178 1048576966 1048314789 LDM data partition
在此示例中,数据从 262178 开始,长度为 1048314789 个扇区
我们在上面发现 Disk1(属于卷组)实际上是第二个物理磁盘。我们将提取其中的一些信息来查找 NTFS 分区的起始位置。
# dd if=LUN02 skip=262178 count=4096 |xxd -a > lun02.DATASTART-4k
# less lun02.DATASTART-4k
0000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................
*
00fbc00: eb52 904e 5446 5320 2020 2000 0208 0000 .R.NTFS .....
00fbc10: 0000 0000 00f8 0000 3f00 ff00 0008 0400 ........?.......
00fbc20: 0000 0000 8000 8000 ffaf d770 0200 0000 ...........p....
在这里我们可以看到 NTFS 从 00fbc00 开始。所以知道我们可以开始从扇区 262178 + 00fbc00 字节中提取我们的数据。让我们用字节到扇区的转换来做一些十六进制到十进制的转换。
0xfbc00 字节 = 1031168 字节 = 1031168/512 扇区 = 2014 扇区
所以我们的 NTFS 分区从 262178 + 2014 = 264192 个扇区开始。该值将是我们稍后将在所有磁盘上使用的偏移量。我们称它为 NTFS 偏移量。显然,总大小被偏移量缩小了。所以新的大小是:1048314789 - 2014 = 1048312775 个扇区
4.尝试挂载/查看数据
从现在开始,它要么开箱即用,因为你的 NTFS 分区是健康的,要么因为你这样做是为了恢复一些数据,所以它不会。无论您的状态如何,以下过程都是相同的。以下所有内容均基于[1](请参阅底部的链接)
一个跨越的卷,将一个接一个地填充一个卷。条带化(RAID0)将在许多磁盘上复制数据块(也就是一个文件分布在许多磁盘上)。就我而言,我不知道它是跨区卷还是条带卷。知道卷未满的最简单方法是检查所有卷的末尾是否有很多零。如果是这样的话,那就是条纹。因为如果它是跨越的,如果将填充第一个磁盘,那么第二个。我不是 100% 确定这一点,但这就是我观察到的。所以从 LDM 数据分区的末尾 dd 一堆扇区。
4.0 准备访问您的数据
首先通过具有 NTFS 偏移量和我们上面计算的大小的环回设备挂载您的 dd 文件或设备。但是,偏移量和大小必须以字节为单位,而不是在与 losttup 一起使用的扇区中。偏移量 = 264192*512 = 135266304 大小 = 1048312775*512 = 536736140800
# losetup /dev/loop2 DDFILE_OR_DEVICE -o 135266304 --size 536736140800
# blockdev --getsize /dev/loop2
1048312775 <---- total size in sectors, same number than before
注意:您可以添加“-r”以只读模式挂载。
对卷的所有物理磁盘部分执行上述操作。使用以下命令显示结果: losttup -a 注意:如果您没有足够的循环设备,您可以使用以下命令轻松创建更多设备:# mknod -m0660 /dev/loopNUMBER b 7 NUMBER && chown root.disk /dev/loopNUMBER
通过打开该组的第一个磁盘(例如:Disk2)来检查您的对齐情况,以查看第一行是否为 R.NTFS。如果不是,那么您的对齐方式是错误的。验证上面的计算并重试。或者您没有查看第一个 Windows 磁盘
例如:
First disk of the volume has been mounted on /dev/loop2
# xxd /dev/loop2 |head
0000000: eb52 904e 5446 5320 2020 2000 0208 0000 .R.NTFS .....
0000010: 0000 0000 00f8 0000 3f00 ff00 0008 0400 ........?.......
都好。让我们转到烦人的部分:)
4.1 跨越
跨区磁盘实际上是一个磁盘链。您填写第一个,然后使用第二个,依此类推。创建一个看起来像这样的文件,例如:
# Offset into Size of this Raid type Device Start sector
# volume device of device
0 1048312775 linear /dev/loop2 0
1048312775 1048312775 linear /dev/loop1 0
2096625550 1048312775 linear /dev/loop3 0
注意: - 记得使用好磁盘顺序(你之前找到的)。例如:物理磁盘 2 后跟物理磁盘 1 和物理磁盘 3 - 2096625550 = 2*1048312775 显然,如果您有第四个磁盘,它将是第四个磁盘偏移量的 3 倍。
4.2 条纹
条带模式(又名 RAID0)的问题是您必须知道您的条带大小。显然默认情况下它是 64k(在我的情况下是 128k,但我不知道它是否由 Windows 系统管理员调整:)。无论如何,如果您不知道,您只需要尝试所有可能的标准值,看看哪一个可以为您提供可行的 NTFS 文件系统。
为 3 个 128k 块大小的磁盘创建如下文件
.---+--> 3 chunks of 128k
0 3144938240 striped 3 128 /dev/loop2 0 /dev/loop3 0 /dev/loop1 0
`---> total size of the volume `----------+-----------+---> disk order
/!\ :卷的大小不完全是我们之前计算的大小。dmsetup 需要一个可被块大小(又名条带大小)和卷中磁盘数量整除的卷大小。所以在我们的例子中。我们有 3 个 1048312775 个扇区的磁盘所以“正常”大小是 1048312775*3=3144938325 个扇区,但由于上述限制,我们将重新计算大小并将其舍入 # echo "3144938325/128*128" | 公元前 3144938240 个扇区
So 3144938240 is the size of your volume in a striped scenario with 3 disk and
128 chunks (aka stripes)
4.3 安装它。
现在让我们将所有内容与 dmsetup 聚合在一起:
# dmsetup create myldm /path/myconfigfile
# dmsetup ls
myldm (253, 1)
# mount -t ntfs -o ro /dev/mapper/myldm /mnt
如果没有挂载。然后你可以使用 testdisk :
# testdisk /dev/mapper/myldm
--> Analyse
----> Quick search
------> You should see the volume name (if any). If not it seems compromised :)
--------> Press 'P' to see files and copy with 'c'
5. 结论
以上对我有用。你的旅费可能会改变。也许有更好、更简单的方法来做到这一点。如果是这样,请分享它,这样其他人就不必经历这个麻烦了 :) 此外,它可能看起来很难,但事实并非如此。只要您将数据复制到某个地方,只需尝试并重试,直到您可以看到某些内容。我花了 3 天的时间来理解如何将所有部分放在一起。希望以上内容可以帮助您不要浪费3天。
注:以上示例均为编造。尽管我很彻底,但示例之间可能存在一些不一致;)
祝你好运。
6. 链接