GNU/Linux >> Linux Esercitazione >  >> Linux

Ripristino di Windows Spanning Disks (LDM) con Linux?

Ecco la risposta (molto più semplice), ora che ldmtool esiste.

ldmtool legge i metadati LDM (noti anche come Windows Dynamic Disks) e (tra le altre cose) crea voci di device-mapper per le unità, le partizioni e gli array RAID corrispondenti, consentendoti successivamente di accedervi e montarli proprio come altri dispositivi a blocchi in Linux.

Il programma ha alcune limitazioni, principalmente dovute al fatto che non modifica affatto i metadati LDM. Quindi non puoi creare dischi LDM in Linux (usa Windows per quello) e non dovresti montare in modalità lettura-scrittura volumi RAID che hanno dischi mancanti. (ldmtool non modificherà i metadati per riflettere ciò che è accaduto e la prossima volta che Windows assembla l'array RAID, ne deriveranno problemi, poiché non tutte le unità saranno sincronizzate.)

Ecco i passaggi da seguire:

  1. Per installare ldmtool sui sistemi Debian e Ubuntu, digitare apt-get install ldmtool . Dovrebbe essere altrettanto facile sulla maggior parte delle altre recenti distribuzioni Linux.
  2. Esegui ldmtool create all .
  3. Ora dovresti avere un sacco di nuove voci in /dev/mapper. Individua quello giusto (nel mio caso, un array RAID1, quindi /dev/mapper/ldm_vol_VOLNAMEHERE-Dg0_Volume2 ), e montalo semplicemente con qualcosa come mount -t ntfs /dev/mapper/ldm_vol_VOLNAMEHERE-Dg0_Volume2 .

Per farlo automaticamente all'avvio, probabilmente dovrai inserire una chiamata a ldm create all al punto giusto nella sequenza di avvio, prima del contenuto di /etc/fstab è montato. Un buon modo per fare la chiamata sarebbe:

[ -x /usr/bin/ldmtool ] && ldmtool create all >/dev/null || true

Ma come far funzionare questo frammento al momento giusto durante l'avvio varierà molto a seconda della distribuzione che stai utilizzando. Per Ubuntu 13.10, ho inserito detta riga in /etc/init/mountall.conf , subito prima del exec mountall ... chiamata alla fine della sezione dello script. E ora posso montare la mia partizione Windows LDM RAID1 in /etc/fstab . Buon divertimento!


Va bene, risponderò alla mia stessa domanda per evitare lo stesso dolore agli altri.

0. ATTENZIONE

Nel caso tu stia effettuando un ripristino, COPIA SEMPRE I TUOI DATI e lavora sulla copia. NON alterare i dati originali "interrotti". Quella cosa ha detto, continua a leggere.

1. La tua partizione è simile a ...

Installa il kit investigativo e il disco di prova. Si spera che ci siano pacchetti per la tua distribuzione :)

# 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

Nota:testdisk ti darà le stesse informazioni con meno dettagli# testdisk /list LUN01

2. Estrai i metadati dei dischi

Tutte le informazioni sull'ordine del disco, la dimensione dei dati e altri attributi cifrati sulla partizione si troveranno nella partizione dei metadati LDM. W2k8 non è cambiato molto da questo documento [2] anche se alcune dimensioni sono diverse e alcuni attributi sono nuovi (e ovviamente sconosciuti)...

# dd if=LUN01 skip=33 count=2048 |xxd -a > lun01.metadata
# less lun01.metadata 

Alla riga 0002410 dovresti vedere il nome del server. Rassicurante? Ma siamo dopo l'ordine dei dischi e l'ID del disco. Scorri verso il basso.

2.1. Ordine dischi

Alla riga 0003210 dovresti vedere 'Disk1' seguito da una lunga stringa.

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

Ciò significa che il primo disco di questo volume è identificato dal seguente ID univoco (UID):79e80293-6eb1-11df-88dc-0026b9835db3Ma al momento non sappiamo quale dei dischi ha questo UID! Quindi spostati su Disk2 entry e prendi nota del suo UID e così via per tutti i dischi che avevi nel tuo volume. Nota:in base alla mia esperienza, cambiano solo i primi 8 caratteri, il resto rimane lo stesso. In effetti, W2k8 sembra incrementare l'ID di 6. $ è un separatore.

Per esempio. :

Windows Disk1 UID : 79e80293-6eb1-11df-88dc-0026b9835db3
Windows Disk2 UID : 79e80299-...
Windows Disk3 UID : 79e8029f-...

2.2. Trova UID disco

Vai alla riga 00e8200 (lun01.metadata). Dovresti trovare "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  ................

Quello che stiamo cercando è l'UID del disco di questo particolare disco. Vediamo:- ID disco:79e80299-6eb1-11df-88dc-0026b9835db3- ID host:1b77da20-c717-11d0-a5be-00a0c91db73c- ID gruppo disco:891d0e8f-d929-11e0-a8a7-0026b9835db5>

Quindi questo disco con l'UID 79e80299-... è Windows Disk2 ma per noi era Physical Disk 1. In effetti trova questo UID nell'ordine del disco che hai trovato sopra. Nota:non c'è un ordine logico. Voglio dire, Windows decide come impostare l'ordine del disco non tu. Quindi NON c'è logica umana e non aspettarti che il tuo primo disco sia Disco1.

Quindi non dare per scontato che l'ordine sopra segua una logica umana. Ti consiglio di esaminare tutti i dati LDM dei tuoi dischi ed estrarre il loro UID. (Puoi usare il seguente comando per estrarre le informazioni PRIVHEAD:dd if=LUNXX skip=1890 count=1 |xxd -a)

es:

(Windows) Disk1 : 79e80293-... == Physical disk 2
(Windows) Disk2 : 79e80299-... == Physical disk 1
(Windows) Disk3 : 79e8029f-... == Physical disk 3

Sono sicuro che da qualche parte nei metadati LDM puoi trovare il tipo di volume (con spanning, RAID0, RAIDX e le dimensioni delle strisce associate) Tuttavia, non l'ho scavato. Ho usato un metodo "prova e riprova" per trovare i miei dati. Quindi, se sai come impostare la tua configurazione prima del dramma, ti risparmierai un sacco di tempo.

3. Trova il filesystem NTFS e i tuoi dati

Ora siamo interessati alla grossa fetta di dati che vogliamo ripristinare. Nel mio caso si tratta di ~ 512 GB di dati, quindi non convertiremo l'intero in ASCII. Non ho davvero cercato come Windows trovi l'inizio della sua partizione NTFS. Ma quello che ho scoperto è che inizia logicamente con la seguente parola chiave:R.NTFS. Troviamo questo e troviamo l'offset che dovremo applicare in seguito per vedere il nostro NTFS FS.

06:  02      0000262178   1048576966   1048314789   LDM data partition

In questo esempio, i dati iniziano da 262178 e sono lunghi 1048314789 settori

Abbiamo scoperto sopra che Disk1 (del gruppo di volumi) è in realtà il secondo disco fisico. Estrarremo alcune delle sue informazioni per trovare dove inizia la partizione 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....

Qui possiamo vedere che NTFS inizia a 00fbc00. Quindi sapendo che possiamo iniziare a estrarre i nostri dati dal settore 262178 + 00fbc00 byte. Facciamo un po' di conversione da esadecimale a decimale anche con la conversione da byte a settore.

0xfbc00 byte =1031168 byte =1031168/512 settori =2014 settori

Quindi la nostra partizione NTFS inizia a 262178 + 2014 =264192 settori. Questo valore sarà un offset che useremo in seguito su tutti i dischi. Chiamiamolo offset NTFS. Ovviamente la dimensione totale viene ridotta dall'offset. Quindi la nuova dimensione è:1048314789 - 2014 =1048312775 settori

4. Prova a montare/vedere i dati

D'ora in poi, o funzionerà immediatamente perché la tua partizione NTFS è sana o non funzionerà perché lo stai facendo per recuperare alcuni dati. Il seguente processo è lo stesso qualunque sia il tuo stato. Tutto quanto segue è basato su [1] (vedi link in fondo)

Un volume con spanning riempirà un volume dopo l'altro. Dove come uno striped (RAID0) copierà pezzi di dati su molti dischi (ovvero un file è distribuito su molti dischi). Nel mio caso, non sapevo se si trattava di un volume con spanning o con striping. Il modo più semplice per sapere se il tuo volume non è pieno è controllare se hai molti zeri alla fine di tutti i tuoi volumi. Se è così, allora è a strisce. Perché se è con spanning, se riempirà il primo disco, poi il secondo. Non ne sono sicuro al 100%, ma è quello che ho osservato. Quindi aggiungi un mucchio di settori dalla fine della partizione dati LDM.

4.0 Preparativi per accedere ai tuoi dati

Per prima cosa monta il tuo file dd o il tuo dispositivo attraverso un dispositivo di loopback con NTFSoffset e la dimensione che abbiamo calcolato sopra. Tuttavia l'offset e la dimensione devono essere in byte e non in settori da utilizzare con 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

Nota:puoi aggiungere '-r' per montare in modalità di sola lettura.

Fai quanto sopra per tutti i dischi fisici che fanno parte del tuo volume. Visualizza il risultato con:losetup -a Nota:se non hai abbastanza dispositivi loop puoi facilmente crearne altri con :# mknod -m0660 /dev/loopNUMBER b 7 NUMBER &&chown root.disk /dev/loopNUMBER

Controlla il tuo allineamento aprendo il primo Disco del gruppo (es:Disco2) per vedere se la prima riga è R.NTFS. In caso contrario, il tuo allineamento è sbagliato. Verifica i tuoi calcoli sopra e riprova. Oppure non stai guardando il primo disco di Windows

es:

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  ........?.......

Tutto bene. Passiamo alla parte fastidiosa :)

4.1 Spanning

I dischi con spanning sono in realtà una catena di dischi. Riempi il primo poi usi il secondo e così via. Crea un file simile a questo, ad esempio :

# 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

Note:- Ricorda di usare il buon ordine del disco (che hai trovato prima). ad esempio:Physical Disk2 seguito da Physical Disk1 e Physical Disk3- 2096625550 =2*1048312775 e ovviamente se hai un quarto disco sarà 3 volte la dimensione per l'offset per il 4 ° disco.

4.2 A righe

Il problema con la modalità a strisce (nota anche come RAID0) è che devi sapere qual è la tua dimensione delle strisce. Apparentemente per impostazione predefinita è 64k (nel mio caso era 128k ma non so se è stato messo a punto dall'amministratore di sistema di Windows:). Ad ogni modo, se non lo sai, devi solo provare tutti i possibili valori standard e vedere quale ti dà un possibile filesystem NTFS valido.

Crea un file come il seguente per 3 dischi con una dimensione del blocco di 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

/!\ :la dimensione del volume non è esattamente quella calcolata in precedenza. dmsetup necessita di una dimensione del volume divisibile per la dimensione del blocco (ovvero la dimensione della striscia) E per il numero di dischi nel volume. Quindi nel nostro caso. Abbiamo 3 dischi di 1048312775 settori Quindi la dimensione 'normale' è 1048312775*3=3144938325 settori ma a causa del suddetto vincolo ricalcoleremo la dimensione e la arrotonderemo# echo "3144938325/128*128" | bc3144938240 settori

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

4.3 Montalo.

Ora aggreghiamo tutto insieme con dmsetup :

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

# mount -t ntfs -o ro /dev/mapper/myldm /mnt 

Se non monta. Quindi puoi usare 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. Conclusione

Quanto sopra ha funzionato per me. Il tuo chilometraggio può variare. E c'è forse un modo migliore e più semplice per farlo. Se è così, condividilo in modo che nessun altro debba affrontare questa seccatura :) Inoltre, potrebbe sembrare difficile ma non lo è. Finché copi i tuoi dati da qualche parte, prova e riprova finché non riesci a vedere qualcosa. Mi ci sono voluti 3 giorni per capire come mettere insieme tutti i pezzi. Speriamo che quanto sopra ti aiuti a non sprecare 3 giorni.

Nota:tutti gli esempi precedenti sono stati inventati. Ci sono forse delle incongruenze tra gli esempi nonostante la mia completezza;)

Buona fortuna.

6. Link

  • [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/

Linux
  1. Partizionare un'unità su Linux con GNU Parted

  2. Come crittografare una partizione con DM-Crypt LUKS su Linux

  3. Emulazione di dischi di grandi dimensioni in Linux con VDO

  4. Come eseguire il dual boot di Windows 10 e MX Linux

  5. Gestisci i dischi con DiskPart

Come eseguire il dual boot di Linux Mint 20 con Windows 10

Come salvare il tuo sistema Windows o Linux con Rescatux

Esegui applicazioni Windows su Linux con Crossover 15

Come clonare dischi con il comando dd di Linux

Come eseguire il software Windows su Linux con Bottles

Installa Windows 10 su Linux con VirtualBox