Saltar al contenido

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

Luego de mucho batallar ya dimos con la respuesta de este asunto que algunos de nuestros lectores de esta web han tenido. Si tienes algún dato que aportar puedes compartir tu conocimiento.

Solución:

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

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

El programa tiene algunas limitaciones, principalmente debido al hecho de que no modifica en absoluto los metadatos LDM. Por lo tanto, no puede crear discos LDM en Linux (use Windows para eso), y no debe montar en modo lectura-escritura volúmenes RAID a los que les faltan 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. 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 otras distribuciones recientes de Linux.
  2. Correr ldmtool create all.
  3. Ahora debería tener un montón de nuevas entradas en / dev / mapper. Busque el correcto (en mi caso, una matriz RAID1, por lo que /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 forma 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 ... llamar al final de la sección del script. Y ahora puedo montar mi partición Windows LDM RAID1 en /etc/fstab. ¡Disfrutar!

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, COPIE SIEMPRE SUS DATOS y trabaje en la copia. NO modifique los datos originales “rotos”. Esa cosa dijo, sigue leyendo.

1. Su partición se ve así …

Instale el kit de detective y el disco de prueba. Con suerte habrá paquetes para tu 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. Extrae los metadatos de los 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án en la partición de metadatos LDM. W2k8 no ha cambiado tanto 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 los 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 se identifica con el siguiente ID único (UID): 79e80293-6eb1-11df-88dc-0026b9835db3 ¡Pero por el momento, no sabemos cuál de los discos tiene este UID! Así que vaya a la entrada Disk2 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 el 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 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-0026b9835db5

Así que este disco con el UID 79e80299 -… es Windows Disk2, pero para nosotros era el Disco físico 1. De hecho, busque este UID en el orden de disco que encontró arriba. Nota: no existe un orden lógico. Me refiero a que Windows decide cómo configurar el orden del disco, no tú. Entonces, NO hay lógica humana y no espere que su primer disco sea Disk1.

Así que no asuma que el orden anterior seguirá una lógica humana. Te recomiendo que revises todos los datos LDM de tus discos y extraigas su UID. (Puede usar el siguiente comando para simplemente extraer la información PRIVHEAD: dd if = LUNXX skip = 1890 count = 1 | xxd -a)

p.ej:

(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 investigado. Utilicé 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. Busque 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 el conjunto 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 tarde 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 el desplazamiento NTFS. Obviamente, el tamaño total se reduce por el desplazamiento. Entonces, el nuevo tamaño es: 1048314789 – 2014 = 1048312775 sectores

4. Intente montar / ver los datos

A partir de ahora, funcionará de inmediato 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 cualquiera que 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 gran cantidad de datos en muchos discos (también conocido como un archivo se distribuye en muchos discos). En mi caso, no sabía si era un volumen extendido 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 tiene rayas. Porque si está extendido, llenará el primer disco, luego el segundo. No estoy 100% seguro de eso, pero eso es lo que observé. Entonces, dd 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 loopback con el desplazamiento NTFS y el tamaño que calculamos anteriormente. Sin embargo, el desplazamiento y el tamaño deben estar en bytes, no en sectores para usarse con losetup. desplazamiento = 264192 * 512 = 135266304 tamaño = 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 -a Nota: 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

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

p.ej:

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 expandidos son en realidad una cadena de discos. Usted llena el primero, luego usa 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 utilizar el buen orden de los discos (que encontró antes). Por ejemplo: Disco físico2 seguido de Disco físico1 y Disco físico3 - 2096625550 = 2 * 1048312775 y, obviamente, si tiene un cuarto disco, será 3 veces el tamaño del desplazamiento del cuarto disco.

4.2 Rayas

El problema con el modo rayado (también conocido como RAID0) es que debe saber cuál es el tamaño de su banda. Aparentemente, por defecto es 64k (en mi caso fue 128k pero no sé si fue ajustado por el administrador del sistema 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 la banda) 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 recalcularemos el tamaño y lo redondearemos # echo "3144938325/128 * 128" | bc 3144938240 sectores

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

4.3 Móntelo.

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 se 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ártelo para que nadie más tenga que pasar por este lío 🙂 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. Ojalá lo anterior te ayude a no perder 3 días.

Nota: Todos los ejemplos anteriores han sido inventados. Quizás haya 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/

Disco Windows Dynamic Volume 5x, distribuido, 8 TB en total.

Esto es lo que he recopilado de la respuesta anterior y haciendo referencia [1] y [2].

Lo que descubrí es que hay algo más que el GUID de orden de disco, información en la partición de metadatos. Hay una estructura clara que contiene el tamaño, desplazamiento y desplazamiento dentro del volumen distribuido.

Utilice la respuesta anterior en las secciones 2.1 y 2.2 para determinar el orden de las unidades.

Mis discos 4x se exportan como fragmentos 4x de 2tb y un fragmento más pequeño de una sola matriz RAID5 de un controlador 3ware 9650se. Cada disco tiene el formato de;

/dev/sdX1 = LDM metadata partition (~1mb)
/dev/sdX2 = Reserved msoft partition (~100mb)
/dev/sdX1 = LDM data partition (~1.99TB/20GB)

desde un 'xxd -a -l 65535 / dev / sdd1 | más 'obtengo

0002800: 5642 4c4b 0000 000c 0000 000e 0000 0001  VBLK............
0002810: 0000 4033 0000 0031 0109 0844 6973 6b31  [email protected]
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  [email protected]
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  [email protected]
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  [email protected]
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  [email protected]
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  ................

Entonces, desde arriba, puede ver claramente el tamaño de la sección de datos, el desplazamiento dentro de la partición y el desplazamiento dentro del volumen distribuido. Así que hagamos las matemáticas;

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*

Esto se tradujo con dmraid a:

# 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

que luego se puede montar directamente a través de:

$ 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)

que requiere módulos:

dmraid
ntfs-3g

¡ADVERTENCIA!

Asegúrese de tener todas las compensaciones, el tamaño en el disco y las compensaciones de extensión correctas antes de montar la lectura-escritura. ntfs-3g se montará si las compensaciones son incorrectas y el contenido de su archivo no será correcto.

Una buena verificación es usar el disco de verificación de Windows y hacer un bucle en la información adicional al final. Tenga en cuenta el número total de unidades asignadas, multiplique eso por el tamaño del bloque (el mío era 4096) y luego divídalo por 512 (tamaño normal del sector). esto debe coincidir con el tamaño informado de Windows.

El tamaño de mi partición informa incorrecto en 4096 bytes más pequeño que el tamaño indicado por las tablas de metadatos anteriores. Supongo que el tamaño de la partición se redondea a un número par. Calculo 2197090816, Windows dice 2197090815, 4096 bloques de bytes.

Referencias

  • Elemento de lista
    [1] : http://people.freebsd.org/~ae/LDM/g_part_ldm.c
  • Elemento de lista
    [2] : http://bigli.ch/howto-access-windows-spanned-dynamic-disks-with-ubuntu/

Si entiendes que ha resultado de provecho nuestro artículo, te agradeceríamos que lo compartas con el resto juniors y nos ayudes a difundir esta información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *