[Tip] Montar partición que está dentro de un dump de disco

En el desarrollo de sw/fw embebido, es habitual hacer un diskdump del contenido de la memoria flash o disco duro una vez está listo para salir.

Con esta imagen hecha, es sencillo replicar dicha configuración software para producción de más equipos.

Puede ocurrir que sea necesario acceder a dichos ficheros para consulta, generación de una nueva versión, etc.

Con software para equipos embebidos suele resultar difícil o imposible acceder al rootfs desde el propio sistema.

Voy a explicar un procedimiento que uso para poder montar dichas particiones desde cualquier equipo con GNU/Linux a partir del «dumpeo» de disco creado mediante DD.
Básicamente lo que vamos a hacer es localizar donde es probable que empiece nuestra partición y luego crear un dispositivo loopback aplicando un offset donde posiblemente empiece dicha partición.

Para localizar la partición haremos uso de la utilidad scandrive de Stephen J. Frield. Esta utilidad busca la palabra mágica que representa un header de ext2 (0xEF53). Además, y esto es casi lo más importante, localiza un potencial inodo-root (vamos, el directorio raiz). Esto sirve para intentar idefintificar correctamente donde comienza nuestra partición. ¿Cómo? Miramos el offset donde se encuentra el header de ext2 justo anterior a la localización del directorio raiz (depende del tamaño del disco, es posible que nos encontremos con muchos «falsos positivos»).

He modificado la utilidad scandrive, para que nos de el posible offset real para hacer el montaje correcto. Dicha posición se calcula restando al offset donde se encuentra el header de partición, los 1024 bytes de offset donde se encuentra el superbloque.

Este seria el procedimiento:

1º) Ejecutar
            % scandrive /v <dumpfile>
  Os saldrá algo parecido a esto:

scandrive 1.01 - 2009-11-08 - http://unixwiz.net/tools/
I/O buffer: 256 sectors of 512 bytes
Device disk_dump_final is open
Loop 0: scanning sector 0...
Found ptable magic at sector 0
Found ptable magic at sector 63
Found ptable magic at sector 78372
Found ptable magic at sector 85352
Found ptable magic at sector 90764
Found ptable magic at sector 94740
Found ptable magic at sector 96924
Found ext2 magic at offset 50359296 (part in: 50358272, size 669973493)
Loop 806: scanning sector 206336...
Found ext2 magic at offset 131089408 (part in: 131088384, size 179172)     
---> Found ext2 root dir at sector 259800 ***
Found ext2 magic at offset 138658816 (part in: 138657792, size 179172)
Found ext2 magic at offset 138970112 (part in: 138969088, size 179172)
---> Found ext2 root dir at sector 271664 ***
Found ext2 magic at offset 139101184 (part in: 139100160, size 179172)
Found ext2 magic at offset 139183104 (part in: 139182080, size 179172)
Found ext2 magic at offset 139342848 (part in: 139341824, size 179172)
---> Found ext2 root dir at sector 272344 ***
Found ext2 magic at offset 139449344 (part in: 139448320, size 179172)
Found ext2 magic at offset 139510784 (part in: 139509760, size 179172)
Found ext2 magic at offset 139682816 (part in: 139681792, size 179172)
(recortado)
Found ext2 magic at offset 265306112 (part in: 265305088, size 179172)
Loop 2167: scanning sector 554752...
Found ptable magic at sector 842680
Found ptable magic at sector 862888
Loop 3558: scanning sector 910848...
Found ext2 magic at offset 533741568 (part in: 533740544, size 179172)
Found ptable magic at sector 1167464
Loop 4919: scanning sector 1259264...
Found ptable magic at sector 1328685
Found ptable magic at sector 1499456
Found ext2 magic at offset 802177024 (part in: 802176000, size 179172)
Found ptable magic at sector 1583125
Loop 6281: scanning sector 1607936...
Found ptable magic at sector 1634968
Loop 7673: scanning sector 1964288...
Got EOF on sector 1966080
Finished scanning.
 2º)  Localizar el primer «–> Found ext2 root dir» (Marcado en rojo en el ejemplo)
 3º)  Si hay una entrada ext2 header anterior, es muy probable que el inicio de partición se encuentre en -1024 bytes (En el ejemplo, seria un offset de 131088384)
 4º) Llamar a:
           % losetup -o<offset-dado-por-scandrive> /dev/loop0 <dumpfile>
 5º) Hacer el mount normal
           % mount /dev/loop0 /mnt
Aquí teneis «scandrive.cpp«
Hasta otra!