11

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

我们有五个通过 ISCSI 导出到死机 Windows 2008 的 512GB LUN,这个盒子不再需要它们了。Windows 认为它​​们现在是原始设备......所以我想用 Linux 读取分区。我正在使用最新的 Ubuntu 来尝试至少保存一些数据。问题是到目前为止我发现的所有文档似乎都已过时(经常谈论 w2k 或 XP Logical Disk Manager (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]

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

在cgssecuritykernel.org等许多文档中,他们谈论 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'

然后,我尝试用 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.

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

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

4

3 回答 3

31

这是(更容易)的答案,现在已经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

但是如何让这个代码片段在启动期间在正确的时间运行会因您使用的发行版而异。对于 Ubuntu 13.10,我在脚本部分末尾的调用/etc/init/mountall.conf之前插入了该行。exec mountall ...我现在可以将我的 Windows LDM RAID1 分区挂载到/etc/fstab. 享受!

于 2014-03-01T00:59:33.647 回答
10

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

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. 链接

于 2011-12-19T04:49:55.500 回答
2

Windows 动态卷 5x 磁盘,跨越,总共 8TB。

这是我从上面的答案中收集到的,并通过引用 [1] 和 [2]。

我发现元数据分区中不仅仅是磁盘顺序 GUID 信息。有一个清晰的结构,包含跨度卷内的大小、偏移量和偏移量。

使用上面第 {2.1} 和 {2.2} 部分的答案来确定驱动器的顺序。

我的 4x 磁盘从 3ware 9650se 控制器的单个 RAID5 阵列导出为 4x 2tb 块和 1x 更小的块。每个磁盘的格式为;

/dev/sdX1 = LDM metadata partition (~1mb)
/dev/sdX2 = Reserved msoft partition (~100mb)
/dev/sdX1 = LDM data partition (~1.99TB/20GB)

来自 'xxd -a -l 65535 /dev/sdd1 | 更多'我得到

0002800: 5642 4c4b 0000 000c 0000 000e 0000 0001  VBLK............
0002810: 0000 4033 0000 0031 0109 0844 6973 6b31  ..@3...1...Disk1
0002820: 2d30 3100 0000 0000 0000 0000 0000 0b00  -01.............
0002830: 0000 0000 0007 de00 0000 0000 0000 0004  ................
                     ^---^ Note 07 de (offset)
0002840: fffb f000 0108 0102 0000 0000 0000 0000  ................
         ^-------^ Note fffb f000 (size)
0002850: 0000 0000 0000 0000 0000 0000 0000 0000  ................
*
0002880: 5642 4c4b 0000 000d 0000 000f 0000 0001  VBLK............
0002890: 0000 4033 0000 0031 010a 0844 6973 6b32  ..@3...1...Disk2
00028a0: 2d30 3100 0000 0000 0000 0000 0000 0b00  -01.............
00028b0: 0000 0000 0007 de00 0000 00ff fbf0 0004  ................
                     ^---^ Offset   ^--------^ Now see spanned offset
00028c0: fffb f000 0108 0103 0000 0000 0000 0000  ................
         ^-------^ note size again!
00028d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
*
0002900: 5642 4c4b 0000 000e 0000 0010 0000 0001  VBLK............
0002910: 0000 4033 0000 0031 010b 0844 6973 6b33  ..@3...1...Disk3
0002920: 2d30 3100 0000 0000 0000 0000 0000 0b00  -01.............
0002930: 0000 0000 0007 de00 0000 01ff f7e0 0004  ................
                     ^---^ Offset   ^--------^ Now see spanned offset
0002940: fffb f000 0108 0104 0000 0000 0000 0000  ................
         ^-------^ note size again!
0002950: 0000 0000 0000 0000 0000 0000 0000 0000  ................
*
0002980: 5642 4c4b 0000 000f 0000 0011 0000 0001  VBLK............
0002990: 0000 4033 0000 0031 010c 0844 6973 6b34  ..@3...1...Disk4
00029a0: 2d30 3100 0000 0000 0000 0000 0000 0b00  -01.............
00029b0: 0000 0000 0007 de00 0000 02ff f3d0 0004  ................
                     ^---^ Offset   ^--------^ Now see spanned offset
00029c0: fffb f000 0108 0105 0000 0000 0000 0000  ................
         ^-------^ note size again!
00029d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
*
0002a00: 5642 4c4b 0000 0010 0000 0012 0000 0001  VBLK............
0002a10: 0000 4033 0000 0031 010d 0844 6973 6b35  ..@3...1...Disk5
0002a20: 2d30 3100 0000 0000 0000 0000 0000 0b00  -01.............
0002a30: 0000 0000 0007 de00 0000 03ff efc0 0004  ................ 
                     ^---^ Offset   ^--------^ Now see spanned offset
0002a40: 17b7 d000 0108 0106 0000 0000 0000 0000  ................ 
         ^-------^ And my final drive is the smallest
0002a50: 0000 0000 0000 0000 0000 0000 0000 0000  ................

因此,从上面您可以清楚地看到数据段的大小、分区内的偏移量和跨区卷内的偏移量。所以让我们做数学;

Disk1:
Size of block = fffb f000 = 4294701056
Start offset = 07 de = 2014
Partition offset = 00 0000 00 = 0

Disk2:
Size of block = fffb f000 = 4294701056
Start offset = 07 de = 2014
Partition offset = 00ff fbf0 00 = 4294701056

Disk3:
Size of block = fffb f000 = 4294701056
Start offset = 07 de = 2014
Partition offset = 01ff fbf0 00 = 8589402112

Disk4:
Size of block = fffb f000 = 4294701056
Start offset = 07 de = 2014
Partition offset = 02ff fbf0 00 = 12884103168

Disk5:
Size of block = 17b7 d000 = 397922304
Start offset = 07 de = 2014
Partition offset = 03ff fbf0 00 = 17178804224

*Note: Use Excel, hex2dec() function*

这用 dmraid 翻译为:

# File /etc/ntfsvolume
#offset into    Size of this    Raid    Device          Start sector
# volume                        type                    in volume
0               4294701056      linear  /dev/sdd3       2014
4294701056      4294701056      linear  /dev/sdc3       2014
8589402112      4294701056      linear  /dev/sdf3       2014
12884103168     4294701056      linear  /dev/sde3       2014
17178804224     397922304       linear  /dev/sdg3       2014

然后可以通过以下方式直接安装:

$ dmsetup create myvolume /etc/ntfsvolume
$ sudo mkdir /media/volume/
$ mount -t ntfs-3g /dev/mapper/myvolume /media/volume
$ sudo mount -t ntfs-3g -o ro /dev/mapper/myvolume /media/volume (mount read-only)

这需要模块:

dmraid
ntfs-3g

警告!

在安装读写之前,请绝对确保您的所有偏移量、磁盘大小和跨度偏移量都是正确的。如果偏移量错误,ntfs-3g 将挂载,并且您的文件内容将不正确。

一个很好的双重检查是使用 windows 检查磁盘并在最后的额外信息处循环。注意分配单元的总数,乘以块大小(我的是 4096)然后除以 512(正常扇区大小)。这应该与报告的窗口大小相匹配。

我的分区大小报告错误,比上述元数据表指示的大小小 4096 字节。我假设分区大小四舍五入为偶数。我计算 2197090816,windows 说 2197090815,4096 字节块..

参考

于 2012-07-20T11:40:46.453 回答