使用Linux恢复Windows跨磁盘(LDM)?

Tho*_*mas 9 linux windows filesystems recovery computer-forensics

是否可以在Linux中读取Windows 2008 LDM分区?

我们有五个512GB LUN通过ISCSI导出到死Windows 2008,这个盒子不再需要它们了.Windows认为它们现在是原始设备......所以我想用Linux读取分区.我正在使用最新的ubuntu来尝试保存至少一些数据.问题是到目前为止我发现的所有文档似乎已经过时了(经常谈论w2k或XP逻辑磁盘管理器(LDM).但我认为现在它与2008年有所不同.

Testdisk [0]给我以下输出

testdisk /list LUN01
TestDisk 6.11, Data Recovery Utility, April 2009
Christophe GRENIER <grenier@cgsecurity.org>
http://www.cgsecurity.org
Please wait...
Disk LUN01 - 536 GB / 500 GiB - CHS 65271 255 63, sector size=512

Disk LUN01 - 536 GB / 500 GiB - CHS 65271 255 63
     Partition                  Start        End    Size in sectors
 1 P MS LDM MetaData               34       2081       2048 [LDM metadata partition]
No FAT, NTFS, EXT2, JFS, Reiser, cramfs or XFS marker
 2 P MS Reserved                 2082     262177     260096 [Microsoft reserved partition]
 2 P MS Reserved                 2082     262177     260096 [Microsoft reserved partition]
 3 P MS LDM Data               262178 1048576966 1048314789 [LDM data partition]
Run Code Online (Sandbox Code Playgroud)

注意:5 LUN中的每一个都具有相同的分区表.

在许多文献[1]中,他们谈论的是ldminfo,它不会返回任何有用的信息.我怀疑它现在已经过时,只是因为它很难找到:)而且因为它不起作用我猜Windows 2008使用不同的格式.

# ldminfo LUN01
Something went wrong, skipping device 'LUN01'
# losetup /dev/loop1 LUN01
# losetup -a
/dev/loop1: [fd00]:14 (/mnt/LUN01)
# ldminfo /dev/loop1 
Something went wrong, skipping device '/dev/loop1'
Run Code Online (Sandbox Code Playgroud)

然后,我尝试用dmsetup连接它们但又没有运气.这就是我使用dmsetup的方式:

# losetup /dev/loop1 LUN01
# losetup /dev/loop2 LUN02
# losetup /dev/loop3 LUN03
# losetup /dev/loop4 LUN04
# losetup /dev/loop5 LUN05
# blockdev --getsize /dev/loop1
1048577000
# cat > w2008.mapping
# Offset into   Size of this    Raid type       Device          Start sector
# volume        device                                          of device
0               1048577000  linear          /dev/loop1       0
1048577000      1048577000  linear          /dev/loop2       0
2097154000      1048577000  linear          /dev/loop3       0
3145731000      1048577000  linear          /dev/loop4       0
4194308000      1048577000  linear          /dev/loop5       0
# dmsetup create myfs w2008.mapping
# mount -t ntfs /dev/mapper/myfs /mnt/final
NTFS signature is missing.
Failed to mount '/dev/loop1': Invalid argument
The device '/dev/loop1' doesn't seem to have a valid NTFS.
Maybe the wrong device is used? Or the whole disk instead of a
partition (e.g. /dev/sda, not /dev/sda1)? Or the other way around?
# echo Poo.
Run Code Online (Sandbox Code Playgroud)

所以仍然没有NTFS文件系统:)

有没有人对如何从那里提取数据或给我一些指示有任何想法?

Chr*_*don 23

这是(更容易)答案,现在ldmtool存在.ldmtool读取LDM(也称为Windows动态磁盘)元数据,(以及其他内容)为相应的驱动器,分区和RAID阵列创建设备映射器条目,允许您随后像Linux中的其他块设备一样访问和安装它们.

该程序确实有一些限制,主要是因为它根本不修改LDM元数据.因此,您无法在Linux中创建LDM磁盘(请使用Windows),并且不应以读写模式安装缺少磁盘的RAID卷.(ldmtool不会修改元数据以反映出现这种情况,并且下次Windows组装RAID阵列时,会出现问题,因为并非所有驱动器都会同步.)

以下是要遵循的步骤:

  1. 安装ldmtool.在Debian和Ubuntu系统上,输入apt-get install ldmtool.在大多数其他最新的Linux发行版中应该同样容易.
  2. ldmtool create all.
  3. 您现在应该在/ dev/mapper中有一堆新条目.找到正确的一个(在我的例子中,是一个RAID1阵列,所以/dev/mapper/ldm_vol_VOLNAMEHERE-Dg0_Volume2),然后用类似的东西安装它mount -t ntfs /dev/mapper/ldm_vol_VOLNAMEHERE-Dg0_Volume2.

要在引导时自动完成此操作,您可能需要ldm create all/etc/fstab挂载内容之前在引导顺序中的正确位置插入一个调用.打电话的好方法是:

[ -x /usr/bin/ldmtool ] && ldmtool create all >/dev/null || true
Run Code Online (Sandbox Code Playgroud)

但是,如何让这个代码段在启动时的正确时间运行会有很大的不同,具体取决于您使用的分发.对于Ubuntu 13.10,我在脚本部分末尾/etc/init/mountall.confexec mountall ...调用之前插入了所述行.我现在可以安装我的Windows LDM RAID1分区了/etc/fstab.请享用!


Tho*_*mas 9

好吧,我会回答我自己的问题,以避免给别人带来同样的痛苦.

0.警告

如果您正在进行恢复,请始终复制您的数据并处理副本.不要改变原来的'破损'数据.那东西说,继续阅读.

你的分区看起来像......

安装sleuth工具包和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
Run Code Online (Sandbox Code Playgroud)

注意:testdisk将为您提供相同的信息,其中包含较少的详细信息#testdisk/list LUN01

2.提取磁盘元数据

有关磁盘顺序,数据大小和有关分区的其他加密属性的所有信息都将在LDM元数据分区中找到.W2k8自本文档[2]以来没有太大变化,虽然有些尺寸不同,有些属性是新的(显然未知)......

# dd if=LUN01 skip=33 count=2048 |xxd -a > lun01.metadata
# less lun01.metadata 
Run Code Online (Sandbox Code Playgroud)

在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..............
Run Code Online (Sandbox Code Playgroud)

这意味着此卷的第一个磁盘由以下唯一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-...
Run Code Online (Sandbox Code Playgroud)

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  ................
Run Code Online (Sandbox Code Playgroud)

我们所追求的是这个特定磁盘的磁盘UID.我们看到: - 磁盘ID:79e80299-6eb1-11df-88dc-0026b9835db3 - 主机ID:1b77da20-c717-11d0-a5be-00a0c91db73c - 磁盘组ID:891d0e8f-d929-11e0-a8a7-0026b9835db5

所以这个带有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
Run Code Online (Sandbox Code Playgroud)

我确信在LDM元数据中的某处你可以找到卷的类型(跨越,RAID0,RAIDX和相关的条带大小)但是,我没有挖它.我使用'try and retry'方法来查找我的数据.因此,如果您知道如何在戏剧之前设置配置,那么您将节省大量时间.

3.找到NTFS文件系统和您的数据

现在我们对我们想要恢复的大块数据感兴趣.在我的情况下,它是〜512GB的数据,所以我们不会用ASCII转换整个数据.我还没有真正搜索Windows如何找到其NTFS分区的开头.但我发现它在逻辑上以以下关键字开头:R.NTFS.让我们找到这个并找到我们稍后要申请查看我们的NTFS FS的偏移量.

06:  02      0000262178   1048576966   1048314789   LDM data partition
Run Code Online (Sandbox Code Playgroud)

在此示例中,数据从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....
Run Code Online (Sandbox Code Playgroud)

在这里我们可以看到NTFS从00fbc00开始.因此我们知道我们可以开始从扇区262178 + 00fbc00字节中提取数据.让我们做一些十六进制到十进制的转换,也可以进行字节到扇区的转换.

0xfbc00字节= 1031168字节= 1031168/512扇区= 2014扇区

所以我们的NTFS分区开始于262178 + 2014 = 264192个扇区.该值将是我们稍后将在所有磁盘上使用的偏移量.我们称之为NTFS偏移量.显然,总尺寸会因偏移而缩小.所以新的规模是:1048314789 - 2014 = 1048312775个行业

4.尝试安装/查看数据

从现在开始,它可以开箱即用,因为你的NTFS分区是健康的,或者它不会,因为你这样做是为了恢复一些数据.以下过程与您的状态无关.以下所有内容均基于[1](参见底部的链接)

跨越的卷,将逐个填充一个卷.条带化(RAID0)将在许多磁盘上复制数据块(也就是说文件分布在许多磁盘上).在我的情况下,我不知道它是一个跨度或条纹卷.最简单的方法是,如果您的音量不满,请检查您所有音量的末尾是否有很多零.如果是这种情况那么它是条纹的.因为如果它是跨越的,如果将填充第一个磁盘,那么第二个.我不是100%肯定,但这是我观察到的.所以dd是LDM数据分区末尾的一堆扇区.

4.0访问数据的准备工作

首先通过具有NTFS偏移量和上面计算的大小的环回设备安装您的dd文件或设备.但是,偏移量和大小必须以字节为单位,而不是与losetup一起使用的扇区.偏移= 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
Run Code Online (Sandbox Code Playgroud)

注意:您可以添加'-r'以只读模式安装.

对卷的所有物理磁盘部分执行上述操作.显示结果:losetup -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  ........?.......
Run Code Online (Sandbox Code Playgroud)

都好.让我们转到讨厌的部分:)

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
Run Code Online (Sandbox Code Playgroud)

注意: - 请记住使用良好的磁盘顺序(您之前找到).例如:物理磁盘2,然后是物理磁盘1和物理磁盘3 - 2096625550 = 2*1048312775,显然如果你有第四个磁盘,它将是第四个磁盘偏移量的3倍.

4.2条纹

条带模式(也称为RAID0)的问题是您必须知道条带大小是多少.显然默认情况下它是64k(在我的情况下它是128k但我不知道它是否由Windows系统管理员调整:).无论如何,如果你不知道它,你只需要尝试所有可能的标准值,看看哪一个给你一个可行的NTFS文件系统.

为具有128k块大小的3个磁盘创建如下文件

                       .---+--> 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
Run Code Online (Sandbox Code Playgroud)

/!\:卷的大小不完全是我们之前计算的大小.dmsetup需要一个可被块大小(也称为条带大小)和卷中磁盘数量整除的卷大小.所以在我们的案例中.我们有3个1048312775扇区的磁盘所以'正常'尺寸是1048312775*3 = 3144938325扇区,但由于上述约束,我们将重新计算尺寸并围绕它#echo"3144938325/128*128"| bc 3144938240个搜索结果

  So 3144938240 is the size of your volume in a striped scenario with 3 disk and
  128 chunks (aka stripes)
Run Code Online (Sandbox Code Playgroud)

4.3安装它.

现在让我们将所有内容与dmsetup一起聚合:

# dmsetup create myldm /path/myconfigfile
# dmsetup ls
myldm       (253, 1)

# mount -t ntfs -o ro /dev/mapper/myldm /mnt 
Run Code Online (Sandbox Code Playgroud)

如果它没有安装.然后你可以使用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'
Run Code Online (Sandbox Code Playgroud)

5.结论

以上对我有用.你的旅费可能会改变.并且可能有更好更简单的方法.如果是这样,分享它,所以没有其他人将不得不经历这个麻烦:)此外,它可能看起来很难,但事实并非如此.只要您在某处复制数据,只需尝试重试,直到看到某些内容为止.我花了3天时间才明​​白如何把所有的东西放在一起.希望以上内容可以帮助您不浪费3天.

注意:上面的所有示例都已组成.尽管我很彻底,但这些例子之间可能存在一些不一致之处;)

祝好运.

6.链接