これが(はるかに簡単な)答えです。ldmtool
存在します。
ldmtool
このプログラムにはいくつかの制限がありますが、そのほとんどは、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
のようなものでマウントするだけです .
起動時にこれを自動的に行うには、おそらく ldm create all
への呼び出しを挿入する必要があります /etc/fstab
のコンテンツの前のブート シーケンスの適切なポイント 搭載されています。呼び出しを行う良い方法は次のとおりです:
[ -x /usr/bin/ldmtool ] && ldmtool create all >/dev/null || true
ただし、このスニペットを起動時に適切なタイミングで実行する方法は、使用しているディストリビューションによって大きく異なります。 Ubuntu 13.10 の場合、上記の行を /etc/init/mountall.conf
に挿入しました 、 exec mountall ...
の直前 スクリプト セクションの最後で呼び出します。 /etc/fstab
に Windows LDM RAID1 パーティションをマウントできるようになりました .お楽しみください!
わかりました、他の人に同じ苦痛を与えるのを避けるために、私は自分の質問に答えます。
0.警告
リカバリを行う場合は、常にデータをコピーし、そのコピーで作業してください。元の「壊れた」データを変更しないでください。そうは言っても、読み続けてください。
1.パーティションは次のようになります...
調査キットとテストディスクをインストールします。あなたのディストリビューション用のパッケージがあることを願っています:)
# 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 メタデータ パーティションにあります。 W2k8 は、このドキュメント [2] 以来あまり変わっていませんが、一部のサイズが異なり、一部の属性が新しい (そして明らかに不明な) ものです...
# 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 [email protected]
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 [email protected]
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 メタデータのどこかにボリュームのタイプ (スパン、RAID0、RAIDX、および関連するストライプ サイズ) が見つかるはずですが、まだ掘り下げていません。データを見つけるために「試行と再試行」の方法を使用しました。したがって、ドラマの前に構成をセットアップする方法を知っていれば、多くの時間を節約できます。
3. NTFS ファイルシステムとデータを見つける
ここで、復元したいデータの大きな塊に関心があります。私の場合、それは最大 512 GB のデータなので、inASCII 全体を変換しません。 Windows が NTFS パーティションの先頭をどのように検出するかについては、あまり調べていません。しかし、私が見つけたのは、論理的に次のキーワードで始まるということです:R.NTFS.これを見つけて、NTFS FS を確認するために後で適用する必要があるオフセットを見つけましょう。
06: 02 0000262178 1048576966 1048314789 LDM data partition
この例では、データは 262178 から始まり、1048314789 セクターの長さです
上記で、(ボリューム グループの)Disk1 が実際には 2 番目の物理ディスクであることがわかりました。その情報の一部を抽出して、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 バイトからデータを抽出できることがわかりました。 16 進数から 10 進数への変換と、バイトからセクターへの変換も行いましょう。
0xfbc00 バイト =1031168 バイト =1031168/512 セクター =2014 セクター
したがって、NTFS パーティションは 262178 + 2014 =264192 セクターから始まります。この値は、後ですべてのディスクで使用するオフセットになります。これを NTFS オフセットと呼びましょう。明らかに、合計サイズはオフセットによって縮小されます。したがって、新しいサイズは次のようになります:1048314789 - 2014 =1048312775 セクター
4.データをマウント/表示してみてください
これからは、NTFS パーティションが正常なためそのままで機能するか、一部のデータを回復するためにこれを行っているために機能しません。次のプロセスは、ステータスが何であれ同じです。以下はすべて [1] に基づいています (下部のリンクを参照)
スパン ボリュームは、次々とボリュームを埋めます。ストライプ (RAID0) は、多くのディスクにデータのチャンクをコピーします (別名、ファイルは多くのディスクに分散されます)。私の場合、それがスパン ボリュームなのかストライプ ボリュームなのかわかりませんでした。ボリュームがいっぱいになっていないかどうかを知る最も簡単な方法は、すべてのボリュームの最後に多数のゼロがあるかどうかを確認することです。その場合は、ストライプ化されています。スパンされている場合は、最初のディスクがいっぱいになり、次に 2 番目のディスクがいっぱいになるためです。私はそれを100%確信しているわけではありませんが、それは私が観察したことです.そのため、LDM データ パーティションの末尾から一連のセクターを追加します。
4.0 データにアクセスするための準備
最初に、NTFSoffset と上記で計算したサイズを使用して、ループバック デバイスを介して dd ファイルまたはデバイスをマウントします。ただし、オフセットとサイズは、losetup.offset =264192*512 =135266304size =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 スパン
スパン ディスクは、実際にはディスクのチェーンです。最初のものを埋めてから、2番目のものを使用します。次のようなファイルを作成します。例:
# 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 で、明らかに 4 番目のディスクがある場合は、4 番目のディスクのオフセットのサイズの 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
/!\ :ボリュームのサイズは、前に計算したサイズと正確には一致しません。 dmsetup には、チャンク サイズ (別名ストライプ サイズ) とボリューム内のディスク数で割り切れるボリューム サイズが必要です。だから私たちの場合。 1048312775 セクターの 3 つのディスクがあるため、「通常の」サイズは 1048312775*3=3144938325 セクターですが、上記の制約により、サイズを再計算して丸めます。 bc3144938240 セクター
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.リンク
- [1] :http://www.kernel.org/doc/Documentation/filesystems/ntfs.txt
- [2] :http://russon.org/ntfs/ldm/technical/index.html
- [3] :http://svnweb.freebsd.org/base/stable/9/sys/geom/part/g_part_ldm.c
- [4] :http://ntfs.com/ldm.htm
- [5] :http://sourceforge.net/projects/linux-ntfs/files/LDM%20Documentation/