Backup literal de un dispositivo Android

Realizar una ‘Copia literal completa’ (mibackup.dd)

Al marguen de los programas de backup que realizan copias de seguridad de ciertas particiones, existe una manera de hacer una copia total de la memoria de un dispositivo Android. Siempre hay más de una manera correcta de obtener la información y de hacer las cosas que aquí se detallarán, aunque sólo se describirá una de ellas.

Convendría previamente echar un ojo al Artículo Particiones en un dispositivo Android.

Se va a necesitar lo siguiente:

En el PC

En el dispositivo Android

Además el dispositivo deberá tener activado el modo de ‘Depuración de USB’.

Lo que se va a hacer es extraer todo el sistema de particiones (mmcblk0) con sus contenidos, empleando para ello el comando de linux ‘DD‘.

El fichero que se genere (el backup), será un fichero RAW que ocupará bastante. El ejemplo se realizará sobre un Motorola Moto G (XT-1032), y el backup ocupará entorno a 7 GBytes.

Al usar este dispositivo para la prueba, se plantea un problema adicional dado que no dispone de SD-Card externa, por lo que hay que hacer ‘algo’ para que el volcado lo haga en otro sitio con espacio suficiente. De haber tenido una SD-Card externa se podría hacer el backup allí, sin intermediación del PC.

Para eso es lo que se usará NetCat. Y gracias a él, el volcado se realizará directamente al PC a través del cable USB con el que estará conectado.

En el PC se descomprime el paquete mínimo de ADB (del link de arriba) en una ‘carpeta de trabajo’. Se abre una ventana de comandos en esa carpeta, y se procede a ejecutar los siguientes comandos:

  • En el emulador de terminal del dispositivo escribir:
    su
    nc -l -p 2222 -e dd if=/dev/block/mmcblk0
  • Inmediatamente después en la ventana de comandos del PC escribimos:
    adb forward tcp:2222 tcp:2222
    nc 127.0.0.1 2222 > mibackup.dd

Tras 20 min, se obtiene en la carpeta de trabajo del PC, el fichero ‘mibackup.dd’ de algo más de 7 GBytes, el cual es una copia ‘literal’ de todo el dispositivo, bit a bit.

Restaurar la ‘Copia literal completa’ (mibackup.dd)

Se partimos de la siguiente situación:

  • Smartphone con bootloader liberado y recovery accesible.
  • El recovery que sea TWRP, ya que permite detectar el dispositivo en modo vivo.
  • SO Linux en el PC, con Java, Android SDK y NetCat (y configurado para detectar el terminal).
  • Backup-literal (mibackup.dd) realizado con anterioridad, alojado en el PC en la carpeta de trabajo en la que abriremos una ventana de comandos.

1º Arrancar el dispositivo en modo Recovery
2º Conectar el dispositivo al PC a través de un cable USB
3º Abrir 2 ventanas de comandos en la carpeta de trabajo
4º Comprobar que el PC reconoce al dispositivo conectado:
adb devices

Si como resultado de este comando, se obtiene un mensaje del estilo…
List of devices attached
TA1234ABC recovery

Es que el PC ha detectado que tiene conectado un dispositivo en modo Recovery (en lugar de recovery puede poner ‘device’, y sería porque lo detecta en modo vivo completo).

5º Escribir los siguientes comandos en cada una de las ventanas:

VENTANA1
adb forward tcp:2222 tcp:2222
adb shell
nc -l -p 2222 -e dd bs=1 of=/dev/block/mmcblk0

y seguido en la otra…
VENTANA2
adb forward tcp:2222 tcp:2222
dd if=mibackup.dd bs=1 | nc 127.0.0.1 2222

6º Ahora toca “esperar” y un buen rato. Ya que si la copia tardó 20 min (son unas 7.2 Gbytes)… esta restauración la hará algo más lenta para hacerla más segura.

Si el dispositivo posee SD Card-Externa, se puede acelerar enormemente el proceso, copiando el backup a dicha memoria externa, y así realizar la restauración desde allí, en una sola Ventana de comandos ejecutamos lo siguiente:

adb shell
dd if=/extSdCard/mibackup.dd of=/dev/block/mmcblk0

y tras un buen rato, pero mucho menos que de la otra manera, se realizará el proceso.

En ambos casos, tras finalizar el proceso, en el dispositivo no se notará nada pues se está en el Recovery en la RAM. Bastará con elegir la opción de reinicio ‘normal’, para que el dispositivo se inicie en el estado en el que se le hizo el ‘backup-literal’. ;-)

Si durante el proceso saltase algún aviso de lseek64, se ignora.