Hier ist die (viel einfachere) Antwort, jetzt, dass ldmtool
existiert.
ldmtool
liest LDM-Metadaten (auch bekannt als Windows Dynamic Disks) und erstellt (unter anderem) Device-Mapper-Einträge für die entsprechenden Laufwerke, Partitionen und RAID-Arrays, sodass Sie später darauf zugreifen und sie mounten können, genau wie andere Blockgeräte in Linux. P>
Das Programm hat einige Einschränkungen, die hauptsächlich darauf zurückzuführen sind, dass es LDM-Metadaten überhaupt nicht ändert. Sie können also keine LDM-Festplatten unter Linux erstellen (verwenden Sie dafür Windows), und Sie sollten keine RAID-Volumes im Lese-/Schreibmodus mounten, bei denen Festplatten fehlen. (ldmtool
wird die Metadaten nicht ändern, um zu zeigen, dass dies passiert ist, und das nächste Mal, wenn Windows das RAID-Array zusammenstellt, werden Probleme auftreten, da nicht alle Laufwerke synchron sind.)
Hier sind die zu befolgenden Schritte:
- Zur Installation von
ldmtool
Geben Sie auf Debian- und Ubuntu-Systemenapt-get install ldmtool
ein . Auf den meisten anderen neueren Linux-Distributionen sollte es ähnlich einfach sein. - Führen Sie
ldmtool create all
aus . - Du solltest jetzt eine Menge neuer Einträge in /dev/mapper haben. Suchen Sie das richtige (in meinem Fall ein RAID1-Array, also
/dev/mapper/ldm_vol_VOLNAMEHERE-Dg0_Volume2
) und mounten Sie es einfach mit etwas wiemount -t ntfs /dev/mapper/ldm_vol_VOLNAMEHERE-Dg0_Volume2
.
Damit dies beim Booten automatisch geschieht, müssen Sie wahrscheinlich einen Aufruf an ldm create all
einfügen an der richtigen Stelle in der Bootsequenz, vor dem Inhalt von /etc/fstab
montiert. Eine gute Möglichkeit, den Anruf zu tätigen, wäre:
[ -x /usr/bin/ldmtool ] && ldmtool create all >/dev/null || true
Aber wie Sie dieses Snippet zum richtigen Zeitpunkt während des Bootens ausführen können, hängt stark von der verwendeten Distribution ab. Für Ubuntu 13.10 habe ich diese Zeile in /etc/init/mountall.conf
eingefügt , direkt vor dem exec mountall ...
Aufruf am Ende des Skriptabschnitts. Und ich kann jetzt meine Windows LDM RAID1-Partition in /etc/fstab
mounten . Viel Spaß!
In Ordnung, ich werde auf meine eigene Frage antworten, um anderen denselben Schmerz zu ersparen.
0. ACHTUNG
Falls Sie eine Wiederherstellung durchführen, KOPIEREN SIE IMMER IHRE DATEN und arbeiten Sie an der Kopie. Ändern Sie NICHT die ursprünglichen „defekten“ Daten. Lesen Sie weiter.
1. Ihre Partition sieht aus wie ...
Installieren Sie das Sleuth-Kit und die Testdisk. Hoffentlich gibt es Pakete für Ihre Distribution :)
# 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
Hinweis:testdisk gibt Ihnen dieselben Informationen mit weniger Details # testdisk /list LUN01
2. Festplatten-Metadaten extrahieren
Alle Informationen über die Festplattenreihenfolge, Datengröße und andere verschlüsselte Attribute der Partition finden sich in der LDM-Metadatenpartition. W2k8 hat sich seit diesem Dokument [2] nicht so sehr verändert, obwohl einige Größen unterschiedlich sind und einige Attribute neu (und offensichtlich unbekannt) sind ...
# dd if=LUN01 skip=33 count=2048 |xxd -a > lun01.metadata
# less lun01.metadata
In Zeile 0002410 sollten Sie den Namen des Servers sehen. Beruhigend? Aber wir sind nach der Plattenreihenfolge und der Platten-ID. Scrollen Sie nach unten.
2.1. Festplattenreihenfolge
In Zeile 0003210 sollten Sie „Disk1“ gefolgt von einer langen Zeichenfolge sehen.
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..............
Das bedeutet, dass die erste Festplatte dieses Volumes durch die folgende eindeutige ID (UID) identifiziert wird:79e80293-6eb1-11df-88dc-0026b9835db3 Aber im Moment wissen wir nicht, welche der Festplatten diese UID hat! Wechseln Sie also zu Disk2 Eintrag und notieren Sie sich die UID usw. für alle Festplatten, die Sie in Ihrem Volume hatten. Hinweis:Nach meiner Erfahrung ändern sich nur die ersten 8 Zeichen, der Rest bleibt gleich. Tatsächlich scheint W2k8 die ID um 6 zu erhöhen. $ ist ein Trennzeichen.
Z.B. :
Windows Disk1 UID : 79e80293-6eb1-11df-88dc-0026b9835db3
Windows Disk2 UID : 79e80299-...
Windows Disk3 UID : 79e8029f-...
2.2. Festplatten-UID finden
Gehen Sie zu Zeile 00e8200 (lun01.metadata). Sie sollten „PRIVHEAD“ finden.
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 ................
Was wir suchen, ist die Festplatten-UID dieser bestimmten Festplatte. Wir sehen:- Datenträger-ID:79e80299-6eb1-11df-88dc-0026b9835db3 - Host-ID:1b77da20-c717-11d0-a5be-00a0c91db73c - Datenträgergruppen-ID:891d0e8f-d929-11e0-a8a7-0026b9835db5
Diese Festplatte mit der UID 79e80299-... ist also die Windows-Festplatte 2, aber für uns war sie die physische Festplatte 1. Tatsächlich finden Sie diese UID in der oben gefundenen Festplattenreihenfolge. Hinweis:Es gibt keine logische Reihenfolge. Ich meine, Windows entscheidet, wie die Festplattenreihenfolge eingerichtet wird, nicht Sie. Es gibt also KEINE menschliche Logik und erwarten Sie nicht, dass Ihre erste Festplatte Disk1 ist.
Gehen Sie also nicht davon aus, dass die obige Reihenfolge irgendeiner menschlichen Logik folgt. Ich empfehle Ihnen, alle LDM-Daten Ihrer Festplatten durchzugehen und deren UID zu extrahieren. (Sie können den folgenden Befehl verwenden, um einfach die PRIVHEAD-Informationen zu extrahieren:dd if=LUNXX skip=1890 count=1 |xxd -a)
zB:
(Windows) Disk1 : 79e80293-... == Physical disk 2
(Windows) Disk2 : 79e80299-... == Physical disk 1
(Windows) Disk3 : 79e8029f-... == Physical disk 3
Ich bin mir sicher, dass Sie irgendwo in den LDM-Metadaten den Typ des Volumes finden können (überspannt, RAID0, RAIDX und die zugehörigen Stripe-Größen). Ich habe es jedoch nicht ausgegraben. Ich habe eine "Try and Retry"-Methode verwendet, um meine Daten zu finden. Wenn Sie also wissen, wie Sie Ihre Konfiguration vor dem Drama einrichten, sparen Sie sich viel Zeit.
3. Finden Sie das NTFS-Dateisystem und Ihre Daten
Jetzt interessieren wir uns für den großen Datenblock, den wir wiederherstellen möchten. In meinem Fall sind es ~512 GB an Daten, also werden wir nicht das ganze in ASCII konvertieren. Ich habe nicht wirklich gesucht, wie Windows den Anfang seiner NTFS-Partition findet. Aber was ich gefunden habe, ist, dass es logischerweise mit dem folgenden Schlüsselwort beginnt:R.NTFS. Lassen Sie uns das finden und den Offset finden, den wir später anwenden müssen, um unser NTFS FS zu sehen.
06: 02 0000262178 1048576966 1048314789 LDM data partition
In diesem Beispiel beginnen die Daten bei 262178 und sind 1048314789 Sektoren lang
Wir haben oben festgestellt, dass Disk1 (der Volume-Gruppe) tatsächlich die 2. physische Festplatte ist. Wir werden einige seiner Informationen extrahieren, um herauszufinden, wo die NTFS-Partition beginnt.
# 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....
Hier können wir sehen, dass NTFS bei 00fbc00 beginnt. Da wir also wissen, dass wir beginnen können, unsere Daten aus Sektor 262178 + 00fbc00 Bytes zu extrahieren. Lassen Sie uns auch ein wenig Hexadezimal-Dezimal-Konvertierung mit Bytes-zu-Sektor-Konvertierung durchführen.
0xfbc00 Bytes =1031168 Bytes =1031168/512 Sektoren =2014 Sektoren
Unsere NTFS-Partition beginnt also bei 262178 + 2014 =264192 Sektoren. Dieser Wert wird ein Offset sein, den wir später auf allen Festplatten verwenden werden. Nennen wir es den NTFS-Offset. Offensichtlich wird die Gesamtgröße durch den Offset geschrumpft. Die neue Größe ist also:1048314789 - 2014 =1048312775 Sektoren
4. Versuchen Sie, die Daten zu mounten/zu sehen
Von nun an funktioniert es entweder sofort, weil Ihre NTFS-Partition in Ordnung ist, oder nicht, weil Sie dies tun, um einige Daten wiederherzustellen. Der folgende Prozess ist unabhängig von Ihrem Status derselbe. Alles Folgende basiert auf [1] (siehe Links unten)
Ein übergreifendes Volumen füllt ein Volumen nach dem anderen. Wobei ein Striped (RAID0) einen Datenblock über viele Festplatten kopiert (auch bekannt als eine Datei, die über viele Festplatten verteilt ist). In meinem Fall wusste ich nicht, ob es sich um ein übergreifendes oder gestreiftes Volume handelte. Der einfachste Weg, um festzustellen, ob Ihr Volume nicht voll ist, besteht darin, zu überprüfen, ob Sie am Ende aller Ihrer Volumes viele Nullen haben. Wenn das der Fall ist, dann ist es gestreift. Denn wenn es überspannt ist, wird es die erste Platte füllen, dann die zweite. Ich bin mir da nicht 100% sicher, aber so habe ich es beobachtet. Fügen Sie also eine Reihe von Sektoren vom Ende der LDM-Datenpartition hinzu.
4.0 Vorbereitungen für den Zugriff auf Ihre Daten
Mounten Sie zuerst Ihre dd-Datei oder Ihr Gerät über ein Loopback-Gerät mit dem NTFSoffset und der Größe, die wir oben berechnet haben. Offset und Größe müssen jedoch in Bytes liegen, die nicht in Sektoren liegen, die mit losetup.offset =264192*512 =135266304size =1048312775*512 =536736140800 verwendet werden sollen
# losetup /dev/loop2 DDFILE_OR_DEVICE -o 135266304 --size 536736140800
# blockdev --getsize /dev/loop2
1048312775 <---- total size in sectors, same number than before
Hinweis:Sie können '-r' hinzufügen, um im schreibgeschützten Modus zu mounten.
Führen Sie die obigen Schritte für alle physischen Laufwerke Ihres Volumes aus. Zeigen Sie das Ergebnis mit:losetup -aHinweis:Wenn Sie nicht genügend Loop-Geräte haben, können Sie einfach weitere erstellen mit:# mknod -m0660 /dev/loopNUMBER b 7 NUMBER &&chown root.disk /dev/loopNUMBER
Überprüfen Sie Ihre Ausrichtung, indem Sie die erste Festplatte der Gruppe (zB:Disk2) öffnen, um zu sehen, ob die erste Zeile R.NTFS ist. Wenn nicht, dann ist Ihre Ausrichtung falsch. Überprüfen Sie Ihre obigen Berechnungen und versuchen Sie es erneut. Oder Sie sehen sich nicht die 1. Windows-Festplatte an
zB:
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 ........?.......
Alles gut. Kommen wir zum lästigen Teil :)
4.1 Überspannt
Übergreifende Festplatten sind eigentlich eine Kette von Festplatten. Sie füllen die erste, dann verwenden Sie die zweite und so und so weiter. Erstellen Sie eine Datei, die so aussieht, zB :
# 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
Hinweise:- Denken Sie daran, die gute Festplattenreihenfolge zu verwenden (die Sie zuvor gefunden haben). zB:Physical Disk2, gefolgt von Physical Disk1 und Physical Disk3- 2096625550 =2*1048312775 und offensichtlich, wenn Sie eine vierte Festplatte haben, wird es die 3-fache Größe für den Offset für die 4. Festplatte sein.
4.2 Gestreift
Das Problem mit dem Striped-Modus (auch bekannt als RAID0) ist, dass Sie Ihre Stripesize kennen müssen. Anscheinend sind es standardmäßig 64 KB (in meinem Fall waren es 128 KB, aber ich weiß nicht, ob es vom Windows-Systemadministrator eingestellt wurde:). Wie auch immer, wenn Sie es nicht wissen, müssen Sie einfach alle möglichen Standardwerte ausprobieren und sehen, welcher Ihnen ein mögliches funktionsfähiges NTFS-Dateisystem gibt.
Erstellen Sie eine Datei wie die folgende für 3 Laufwerke mit einer Chunk-Größe von 128 KB
.---+--> 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
/!\ :Die Größe des Volumes entspricht nicht genau der zuvor berechneten Größe. dmsetup benötigt eine Volume-Größe, die durch die Chunk-Größe (auch bekannt als Stripe-Größe) UND durch die Anzahl der Festplatten im Volume teilbar ist. Also in unserem Fall. Wir haben 3 Festplatten mit 1048312775 Sektoren. Die 'normale' Größe ist also 1048312775*3=3144938325 Sektoren, aber aufgrund der obigen Einschränkung berechnen wir die Größe neu und runden sie # echo "3144938325/128*128" | bc3144938240 Sektoren
So 3144938240 is the size of your volume in a striped scenario with 3 disk and
128 chunks (aka stripes)
4.3 Montieren.
Jetzt fassen wir alles zusammen mit dmsetup :
# dmsetup create myldm /path/myconfigfile
# dmsetup ls
myldm (253, 1)
# mount -t ntfs -o ro /dev/mapper/myldm /mnt
Wenn es nicht montiert wird. Dann können Sie testdisk verwenden:
# 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. Fazit
Das obige hat bei mir funktioniert. Ihr Kilometerstand kann variieren. Und es gibt vielleicht einen besseren und einfacheren Weg, dies zu tun. Wenn ja, teilen Sie es, damit sich niemand sonst diesen Ärger machen muss :) Außerdem sieht es vielleicht schwer aus, ist es aber nicht. Solange Sie Ihre Daten irgendwohin kopieren, versuchen Sie es einfach immer wieder, bis Sie etwas sehen können. Ich habe 3 Tage gebraucht, um zu verstehen, wie man alle Teile zusammenfügt. Hoffentlich hilft Ihnen das Obige, keine 3 Tage zu verschwenden.
Hinweis:Alle obigen Beispiele wurden erfunden. Trotz meiner Gründlichkeit gibt es vielleicht einige Ungereimtheiten zwischen den Beispielen;)
Viel Glück.
6. Links
- [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/