Particiones en un dispositivo Android

Revisar las particiones de un dispositivo Android.

Hay varias maneras y cada una de ellas aporta una información similar pero diferente (o bien son comandos linux o aplicaciones linux). De entre toda la información que se obtiene, cabe resaltar los puntos de montaje y el tamaño de cada partición.

Comando LIST:
ls -al /dev/block/platform/msm_sdcc.1/by-name

Con GDISK, podremos ver los sectores de inicio y fin de cada partición con nombre:
gdisk -l /dev/block/mmcblk0

Con PARTX, podremos ver además de los sectores de inicio y fin, la diferencia de ambos, el tamaño de la partición y sus nombres. Muy completito.
partx -s /dev/block/mmcblk0

Y otras muchas…

Así que para no saturarse con tantas posibilidades, se empleará para el ejemplo la información proporcionada únicamente por PARTX.

Para ejecutar PARTX, primero hay que meterlo al dispositivo. PARTX, se puede copiar en /system/xbin/ y asignarle los permisos 755 [rwxr-xr-x] (El propietario lectura, escritura y ejecución; el grupo y otros pueden leer y ejecutar el archivo).

Luego hay 2 posibilidades para realizar la consulta. O lo se hace desde una ventana de comandos en el PC, o se hace desde un Emulador de terminal en el dispositivo. El resultado es idéntico y el proceso sólo se diferencia en que desde el PC debes ejecutar “adb shell” lo primero.

# desde el PC #
adb shell
shell@falcon_umts:/ $ su
su
root@falcon_umts:/ # partx -s /dev/block/mmcblk0

# desde el dispositivo #

Partx

Con esa tabla, se puede relacionar para cada partición su nombre ‘dev-block’ con el ‘amigable’, para lo cual basta con fijarse en la primera columna (NR) y poner el número que le corresponde de esa columna en lugar de la ‘x‘ al final ‘mmcblk0px‘. Por ejemplo, la partición con el nombre amigable Recovery tiene de nombre dev-block mmcblk0p32.

Averiguar el Tamaño de Bloque de la emmc:

Para averiguar el tamaño de bloque de la memoria del dispositivo, se ejecutan desde el PC, o desde el emulador de terminal del dispositivo obviando ‘adb shell’, los comandos siguientes:
adb shell
su
dd if=/dev/block/mmcblk0 count=1 of=/dev/null

Bloque

Se observa que el tamaño del bloque en la emmc del ejemplo es de 512 bytes. Este daño servirá de ayuda para futuras operaciones con ‘DD’.

Que se puede hacer con todo esto:

  • Extraer una partición concreta del dispositivo

Si por ejemplo se quiere extraer la partición Recovery, en los datos obtenidos antes con PARTX se observa que la partición Recovery es el número 32 o lo que es lo mismo, mmcblk0p32. Ahora en el PC desde el una ventana de comandos sobre la ‘carpeta de trabajo’, y con el dispositivo conectado por USB al PC, se ejecutan los siguientes comandos:
adb shell
su
dd if=/dev/block/mmcblk0p23 of=/sdcard/recovery.img

Si se usara el nombre amigable, se obtendría un comando equivalente:
adb shell
su
dd if=/dev/block/platform/msm_sdcc.1/by-name/recovery of=/sdcard/recovery.img

De esta forma, generará un fichero (recovery.img) de 10MBytes, que es una imagen perfecta de la partición recovery.

  • Extraer una partición concreta de un Backup.dd

Si lo que se quiere es extraer la misma partición recovery, pero del BACKUP TOTAL que se ha hecho del dispositivo siguiendo el artículo Backup literal de un dispositivo Android, se tendría que especificar que la extracción de datos la empiece a realizar a partir del punto de montaje de esa partición. Y para calcular el byte en el que se encuentra el punto de montaje se necesita el valor del bloque del dispositivo, y que se ha calculado antes. Y se hacen unos sencillos cálculos.

En este caso, están estos datos:
        NR START  END   SECTORS SIZE NAME
mmcblk0p32 229120 249599 20480   10M  recovery

Como antes se averiguó que el tamaño de bloque de la emmc del ejemplo es de 512 bytes…

Ahora se pasa el punto START del recovery a bytes. Si la partición recovery empieza en el Bloque 229120, y el tamaño de cada bloque es: 512 bytes/bloque.
229120 bloques * 512 bytes/bloque = 117309440 bytes

¡ La partición recovery empieza en el byte número 117309440 !
Y además se sabe que ocupa exactamente 10MBytes.

Entonces ya se puede ejecutar el siguiente comando:

dd if=backup.dd bs=1 skip=117309440 count=10M of=recovery.img

Para cualquier otra partición, los procesos serían similares.

Extraer la Tabla de Particiones del dispositivo:

La tabla de particiones de los dispositivos Android suele denominarse ‘gpt’, y en las Factory Image viene en forma de un fichero llamado ‘gpt.bin’.

El tema es que dicho fichero no existe como tal en un dispositivo, si no que son los 32 primeros KBytes del mmcblk0. Por lo tanto bastará con escribir:

adb shell
su
dd if=/dev/block/mmcblk0 bs=1 count=32K of=/sdcard/gpt.bin

Y si se quiere extraer del Backup.dd, sería:

dd if=backup.dd bs=1 count=32K of=gpt.bin

Restaurar una Partición

Hay particiones que están ‘sueltas’ en forma de ficheros en las Factory Image, y pueden ser restauradas o flasheadas mediante comandos fastboot. Aunque también es posible hacerlo mediante comandos DD, y no sólo esas particiones que vienen ‘sueltas’, si no cualquiera.

Lo más fiable es realizar el proceso desde el Recovery del dispositivo, el cual se carga en RAM, permitiendo incluso sobreescribir el propio Recovery. El Recovery flasheado en el dispositivo debe permitir que el PC reconozca en Modo vivo al dispositivo. Se usará para el ejemplo el Recovery TWRP.

Primero se sube al dispositivo el nuevo recovery.img que se quiere poner.

adb push recovery.img /sdcard/

Y posteriormente se sobreescribirá el actual recovery por el recién subido.

adb shell
dd if=/sdcard/recovery.img of=/dev/block/mmcblk0p32

Bastaría ahora con reiniciar el dispositivo y comprobar que el recovery ha cambiado:

adb reboot recovery