可以在Linux中读取Windows 2008 LDM分区吗?
我们有五个512GB的LUN通过ISCSI输出到一个死的Windows 2008,这个盒子不再需要它们了。 Windows认为他们现在是原始设备…所以我想用Linux读取分区。 我正在使用最新的Ubuntu试图保存至less一些数据。 问题是迄今为止我发现的所有文档似乎已经过时了(经常谈到w2k或者XP的逻辑磁盘pipe理器(LDM),但是我认为现在和2008年不一样了。
testing盘[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中的每一个都有相同的分区表。
在许多文献中[1],他们都在谈论ldminfo,它不返回任何有用的信息。 我怀疑它现在已经过时,只是因为它很难find:)因为它不工作,我猜想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 (eg /dev/sda, not /dev/sda1)? Or the other way around? # echo Poo.
所以还是没有NTFS文件系统🙂
有没有人有任何想法,我怎么可以从那里提取数据或给我一些指针?
这里(更容易)的答案,现在ldmtool
存在。 ldmtool
读取LDM(又称Windows动态磁盘)元数据,(除其他外)为相应的驱动器,分区和RAID阵列创建设备映射器条目,以便随后访问和装载它们,就像Linux中的其他块设备一样。
该程序确实有一些限制,主要是由于它根本不修改LDM元数据。 因此,您不能在Linux中创建LDM磁盘(使用Windows),而且您不应以读写模式挂载缺少磁盘的RAID卷。 ( ldmtool
不会修改元数据以反映这种情况的发生,而且下一次Windows组装RAID阵列时,问题会随之而来,因为不是所有的驱动器都会同步)。
以下是要遵循的步骤:
ldmtool
。 在Debian和Ubuntu系统上,输入apt-get install ldmtool
。 在其他大多数最新的Linux发行版上,它也应该是相似的。 ldmtool create all
。 /dev/mapper/ldm_vol_VOLNAMEHERE-Dg0_Volume2
),只是像mount -t ntfs /dev/mapper/ldm_vol_VOLNAMEHERE-Dg0_Volume2
一样mount -t ntfs /dev/mapper/ldm_vol_VOLNAMEHERE-Dg0_Volume2
。 要在启动时自动完成此操作,可能需要在挂载/etc/fstab
的内容之前插入一个对ldm create all
的调用。 这样做的好方法是:
[ -x /usr/bin/ldmtool ] && ldmtool create all >/dev/null || true
但是,如何让这个片段在引导过程中的正确时间运行将取决于您使用的分布。 对于Ubuntu 13.10,我在/etc/init/mountall.conf
插入了这行代码,就在脚本部分末尾的exec mountall ...
调用之前。 我现在可以将我的Windows LDM RAID1分区安装在/etc/fstab
。 请享用!
好吧,我会回答我自己的问题,以避免同样的痛苦给别人。
如果您正在进行恢复,请始终复制数据并复制副本。 不要改变原始的“损坏”的数据。 那东西说,继续读。
安装sleuth套件和测试磁盘。 希望有你的发行包:)
# 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
有关磁盘顺序,数据大小和有关分区的其他加密属性的所有信息都可以在LDM元数据分区中找到。 W2k8并没有太大的改变,因为这个文档[2]尽管有些尺寸是不同的,有些属性是新的(显然是未知的)…
# dd if=LUN01 skip=33 count=2048 |xxd -a > lun01.metadata # less lun01.metadata
在行0002410你应该看到服务器的名称。 放心? 但是我们在磁盘顺序和磁盘ID之后。 向下滚动。
在第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-...
转到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-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
我确信在LDM元数据中的某处可以找到卷的类型(spanned,RAID0,RAIDX和相关的条带大小)。但是,我还没有挖出它。 我使用了“尝试和重试”方法来查找我的数据。 所以如果你知道如何在戏剧之前设置你的配置,你将会节省很多时间。
现在我们对我们想要恢复的大量数据感兴趣。 在我的情况下,它是〜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个行业
从现在开始,要么是因为你的NTFS分区是健康的,或者不会,因为你正在这样做来恢复一些数据。 以下过程与您的状态相同。 以下全部基于[1](参见下面的链接)
一个跨越的音量,将会一个接一个地填充音量。 作为一个条带(RAID0)将复制大量的数据在许多磁盘(又名一个文件分布在许多磁盘)。 在我的情况下,我不知道这是一个跨越式或条纹卷。 要知道,如果你的卷没有满的最简单的方法是检查你是否有大量的零在所有卷的末尾。 如果是这样的话,那就是条纹了。 因为如果跨越,如果将填充第一个磁盘,然后第二个。 我不是100%肯定的,但是这就是我所观察到的。 因此,从LDM数据分区的末尾开始一连串的扇区。
4.0准备访问您的数据
首先通过NTFS偏移量和上面计算的大小的环回设备来挂载您的dd文件或您的设备。 但是,偏移量和大小必须以字节为单位,而不是与losetup一起使用的扇区。 offset = 264192 * 512 = 135266304 size = 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'以只读模式挂载。
为所有物理磁盘的一部分进行上述操作。 显示结果: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 ........?.......
都好。 让我们转到讨厌的部分:)
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文件系统。
为128个块大小的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
/!\:卷的大小并不完全是我们之前计算的大小。 dmsetup需要卷大小(又称为条带大小)和卷中磁盘的数量。 所以在我们的情况。 我们有1048312775扇区的3个磁盘所以'正常'的大小是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)
4.3安装它。
现在让我们用dmsetup把所有东西聚合在一起:
# dmsetup create myldm /path/myconfigfile # dmsetup ls myldm (253, 1) # mount -t ntfs -o ro /dev/mapper/myldm /mnt
如果没有安装。 那么你可以使用测试磁盘:
# 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'
上面的工作对我来说。 你的旅费可能会改变。 而且也许有更好更简单的方法来做到这一点。 如果是这样,分享它,所以没有人会经过这个麻烦:)而且,它可能看起来很难,但事实并非如此。 只要您将数据复制到某个地方,只需尝试重试,直到您看到某些内容。 我花了3天的时间才明白如何把所有的东西放在一起。 希望以上将帮助你不浪费3天。
注意:以上所有示例均已组成。 尽管我的全面,但在这些例子之间可能有些不一致;)
祝你好运。
这是我从上面的答案中收集的,并参考[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字节块..