GNU/Linux >> Tutoriales Linux >  >> Linux

¿Restauración de discos distribuidos de Windows (LDM) con Linux?

Aquí está la respuesta (mucho más fácil), ahora que ldmtool existe

ldmtool lee metadatos LDM (también conocido como discos dinámicos de Windows) y (entre otras cosas) crea entradas de mapeador de dispositivos para las unidades, particiones y arreglos RAID correspondientes, lo que le permite acceder y montarlos como otros dispositivos de bloque en Linux.

El programa tiene algunas limitaciones, principalmente debido al hecho de que no modifica los metadatos LDM en absoluto. Por lo tanto, no puede crear discos LDM en Linux (use Windows para eso), y no debe montar volúmenes RAID en modo lectura-escritura a los que les falten discos. (ldmtool no modificará los metadatos para reflejar que esto sucedió, y la próxima vez que Windows ensamble la matriz RAID, surgirán problemas, ya que no todas las unidades estarán sincronizadas).

Estos son los pasos a seguir:

  1. Para instalar ldmtool en los sistemas Debian y Ubuntu, escriba apt-get install ldmtool . Debería ser igualmente fácil en la mayoría de las distribuciones de Linux recientes.
  2. Ejecutar ldmtool create all .
  3. Ahora debería tener un montón de nuevas entradas en /dev/mapper. Ubique el correcto (en mi caso, una matriz RAID1, entonces /dev/mapper/ldm_vol_VOLNAMEHERE-Dg0_Volume2 ), y simplemente móntelo con algo como mount -t ntfs /dev/mapper/ldm_vol_VOLNAMEHERE-Dg0_Volume2 .

Para que esto se haga automáticamente en el momento del arranque, es probable que deba insertar una llamada a ldm create all en el punto correcto de la secuencia de arranque, antes del contenido de /etc/fstab esta montado. Una buena manera de hacer la llamada sería:

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

Pero cómo hacer que este fragmento se ejecute en el momento adecuado durante el arranque variará mucho según la distribución que esté utilizando. Para Ubuntu 13.10, inserté dicha línea en /etc/init/mountall.conf , justo antes del exec mountall ... call al final de la sección del script. Y ahora puedo montar mi partición Windows LDM RAID1 en /etc/fstab . ¡Disfrútalo!


Muy bien, responderé a mi propia pregunta para evitar el mismo dolor a los demás.

0. ADVERTENCIA

En caso de que esté haciendo una recuperación, SIEMPRE COPIE SUS DATOS y trabaje en la copia. NO altere los datos 'rotos' originales. Eso dicho, sigue leyendo.

1. Su partición se parece a...

Instale el kit de detección y el disco de prueba. Esperemos que haya paquetes para su distribución :)

# 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 le dará la misma información con menos detalles# testdisk /list LUN01

2. Extraer metadatos de discos

Toda la información sobre el orden del disco, el tamaño de los datos y otros atributos cifrados sobre la partición se encontrará en la partición de metadatos LDM. W2k8 no ha cambiado mucho desde este documento [2] aunque algunos tamaños son diferentes y algunos atributos son nuevos (y obviamente desconocidos)...

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

En la línea 0002410 debería ver el nombre del servidor. ¿Tranquilizador? Pero buscamos el orden de los discos y la identificación del disco. Desplácese hacia abajo.

2.1. Orden de discos

En la línea 0003210 debería ver 'Disk1' seguido de una cadena larga.

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

Esto significa que el primer disco de este Volumen está identificado por la siguiente ID Única (UID):79e80293-6eb1-11df-88dc-0026b9835db3 Pero por el momento, ¡no sabemos cuál de los discos tiene este UID! Así que vaya al Disco 2 entrada y tome nota de su UID y así sucesivamente para todos los discos que tenía en su volumen. Nota:Según mi experiencia, solo cambian los primeros 8 caracteres, el resto permanece igual. De hecho, W2k8 parece incrementar la ID en 6. $ es un separador.

P.ej. :

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

2.2. Buscar UID de disco

Vaya a la línea 00e8200 (lun01.metadata). Debería encontrar '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  ................

Lo que buscamos es el UID del disco de este disco en particular. Vemos:- Id. de disco:79e80299-6eb1-11df-88dc-0026b9835db3- Id. de host:1b77da20-c717-11d0-a5be-00a0c91db73c- Id. de grupo de discos:891d0e8f-d929-11e0-a8a7-00d6b5983

Entonces, este disco con el UID 79e80299-... es el Disco 2 de Windows, pero para nosotros era el Disco físico 1. De hecho, encuentre este UID en el orden de disco que encontró arriba. Nota:No hay un orden lógico. Me refiero a que Windows decide cómo configurar el orden del disco, no usted. Por lo tanto, NO hay lógica humana y no espere que su primer disco sea el Disco 1.

Así que no asumas que el orden anterior va a seguir alguna lógica humana. Le recomiendo que revise todos los datos LDM de sus discos y extraiga su UID. (Puede usar el siguiente comando para simplemente extraer la información de PRIVHEAD:dd if=LUNXX skip=1890 count=1 |xxd -a)

por ejemplo:

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

Estoy seguro de que en algún lugar de los metadatos de LDM puede encontrar el tipo de volumen (distribuido, RAID0, RAIDX y los tamaños de banda asociados). Sin embargo, no lo he desenterrado. Usé un método de 'intentar y reintentar' para encontrar mis datos. Entonces, si sabe cómo configurar su configuración antes del drama, se ahorrará mucho tiempo.

3. Encuentre el sistema de archivos NTFS y sus datos

Ahora estamos interesados ​​en la gran cantidad de datos que queremos restaurar. En mi caso, son ~ 512 GB de datos, por lo que no convertiremos todo en ASCII. Realmente no he buscado cómo Windows encuentra el comienzo de su partición NTFS. Pero lo que encontré es que lógicamente comienza con la siguiente palabra clave:R.NTFS. Encontremos esto y encontremos el desplazamiento que tendremos que aplicar más adelante para ver nuestro NTFS FS.

06:  02      0000262178   1048576966   1048314789   LDM data partition

En este ejemplo, los datos comienzan en 262178 y tienen una longitud de 1048314789 sectores

Encontramos arriba que Disk1 (del grupo de volumen) es en realidad el segundo disco físico. Extraeremos parte de su información para encontrar dónde comienza la partición 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....

Aquí podemos ver que NTFS comienza en 00fbc00. Entonces, sabiendo que podemos comenzar a extraer nuestros datos del sector 262178 + 00fbc00 bytes. Hagamos un poco de conversión de hexadecimal a decimal con conversión de bytes a sector también.

0xfbc00 bytes =1031168 bytes =1031168/512 sectores =2014 sectores

Entonces, nuestra partición NTFS comienza en 262178 + 2014 =264192 sectores. Este valor será un desplazamiento que usaremos más adelante en todos los discos. Llamémoslo desplazamiento NTFS. Obviamente, el tamaño total se reduce por el desplazamiento. Entonces el nuevo tamaño es:1048314789 - 2014 =1048312775 sectores

4. Intenta montar/ver los datos

De ahora en adelante, funcionará de manera inmediata porque su partición NTFS está en buen estado o no lo hará porque está haciendo esto para recuperar algunos datos. El siguiente proceso es el mismo sea cual sea su estado. Todo lo siguiente se basa en [1] (ver enlaces en la parte inferior)

Un volumen distribuido, llenará un volumen tras otro. Donde como un rayado (RAID0) copiará una porción de datos en muchos discos (es decir, un archivo se distribuye en muchos discos). En mi caso, no sabía si era un volumen expandido o rayado. La forma más fácil de saber si su volumen no está lleno es verificar si tiene muchos ceros al final de todos sus volúmenes. Si ese es el caso, entonces está rayado. Porque si está extendido, llenará el primer disco, luego el segundo. No estoy 100% seguro de eso, pero eso es lo que observé. Así que agregue un montón de sectores desde el final de la partición de datos LDM.

4.0 Preparativos para acceder a sus datos

Primero monte su archivo dd o su dispositivo a través de un dispositivo de bucle invertido con el NTFSoffset y el tamaño que calculamos anteriormente. Sin embargo, el desplazamiento y el tamaño deben estar en bytes y no en sectores para usarse 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:puede agregar '-r' para montar en modo de solo lectura.

Haga lo anterior para todos los discos físicos que forman parte de su volumen. Muestre el resultado con:losetup -aNota:si no tiene suficientes dispositivos de bucle, puede crear más fácilmente con :# mknod -m0660 /dev/loopNUMBER b 7 NUMBER &&chown root.disk /dev/loopNUMBER

Verifique su alineación abriendo el primer Disco del grupo (por ejemplo:Disco2) para ver si la primera línea es R.NTFS. Si no, entonces su alineación es incorrecta. Verifique sus cálculos anteriores y vuelva a intentarlo. O no está mirando el primer disco de Windows

por ejemplo:

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

Todo está bien. Pasemos a la parte molesta :)

4.1 Extendido

Los discos distribuidos son en realidad una cadena de discos. Llenas el primero, luego usas el segundo y así sucesivamente. Cree un archivo que se vea así, por ejemplo:

# 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

Notas:- Recuerde usar el buen orden de disco (que encontró antes). por ejemplo:Disco físico 2 seguido de Disco físico 1 y Disco físico 3:2096625550 =2 * 1048312775 y, obviamente, si tiene un cuarto disco, tendrá 3 veces el tamaño del desplazamiento del cuarto disco.

4.2 A rayas

El problema con el modo rayado (también conocido como RAID0) es que debe saber cuál es su tamaño de banda. Aparentemente por defecto es 64k (en mi caso fue 128k pero no sé si fue sintonizado por el administrador de sistemas de Windows :). De todos modos, si no lo sabe, solo tiene que probar todos los valores estándar posibles y ver cuál le brinda un posible sistema de archivos NTFS viable.

Cree un archivo como el siguiente para 3 discos con un tamaño de fragmento de 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

/!\ :El tamaño del volumen no es exactamente el tamaño que calculamos antes. dmsetup necesita un tamaño de volumen divisible por el tamaño del fragmento (también conocido como tamaño de franja) Y por la cantidad de discos en el volumen. Entonces en nuestro caso. Tenemos 3 discos de 1048312775 sectores. Entonces, el tamaño 'normal' es 1048312775*3=3144938325 sectores, pero debido a la restricción anterior, volveremos a calcular el tamaño y lo redondearemos.# echo "3144938325/128*128" | bc3144938240 sectores

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

4.3 Montarlo.

Ahora agreguemos todo junto con dmsetup:

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

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

Si no monta. Entonces puedes usar 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. Conclusión

Lo anterior funcionó para mí. Su experiencia puede ser diferente. Y tal vez haya una manera mejor y más fácil de hacerlo. Si es así, compártalo para que nadie más tenga que pasar por esta molestia :) Además, puede parecer difícil, pero no lo es. Siempre que copie sus datos en algún lugar, intente y vuelva a intentarlo hasta que pueda ver algo. Me tomó 3 días entender cómo juntar todas las partes. Con suerte, lo anterior te ayudará a no perder 3 días.

Nota:Todos los ejemplos anteriores han sido inventados. Puede haber algunas inconsistencias entre los ejemplos a pesar de mi minuciosidad;)

Buena suerte.

6. Enlaces

  • [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. Particionar una unidad en Linux con GNU Parted

  2. Desbloquee discos encriptados en Linux automáticamente

  3. Cómo cifrar una partición con DM-Crypt LUKS en Linux

  4. Emulación de discos grandes en Linux con VDO

  5. Clonar partición de Windows desde Linux

Cómo hacer un arranque dual de Linux Mint 20 con Windows 10

Cómo rescatar su sistema Windows o Linux con Rescatux

Ejecute aplicaciones de Windows en Linux con Crossover 15

Cómo clonar discos con el comando dd de Linux

Cómo ejecutar el software de Windows en Linux con botellas

Instalar Windows 10 en Linux con VirtualBox