domingo, diciembre 02, 2012

Poniéndonos técnicos: Flasheando un dispositivo android desde linux.

En ocasiones, llega el momento en que nuestro tablet android no funciona todo lo bien que debiera o, simplemente, queremos dejarlo como recién salido de fábrica para eliminar toda la basurilla que podamos haber dejado en el sistema.

En estos casos, el fabricante pone a disposición de los usuarios un archivo con una copia virtual del disco duro de la tablet, esto es, un archivo que consiste en un volcado de la memoria flash interna de la tablet que, al ser "enchufada" lo dejará como un sistema recién instalado. Para todos aquellos que hayan realizado instalaciones masivas de un sistema, sería como plataformar ordenadores usando Norton Ghost.

El fabricante, en mi caso, me daba para descarga un archivo de tipo VHD (virtual hard disk) pero en otros casos, como el de Airis, es un tipo de archivo IMG. Además, indica un proceso no muy complicado que incluye descargar el archivo de imagen, un programa llamado "WinImage", e inyectar la imagen al tablet.

Un proceso en apariencia sencillo pero que cuenta con algunos inconvenientes:
  1. WinImage es un programa para windows. Propietario aunque se puede descargar una versión de evaluación de 30 días.
  2. En mi caso, tengo una versión de Windows 7 64 Bits que uso para casos en los que no me queda más remedio (se supone que éste era uno de esos casos).
  3. El mayor inconveniente que me encontré es que el programa no funciona. Simple y llanamente, al intentar copiar la imagen en una tarjeta SD para instalarla en el tablet, se produce un error como el que muestro en la imagen a continuación y de ahí no pasa.

Tras realizar una búsqueda por google me di cuenta de que no soy la única persona a la que le ocurre ésto. Las soluciones que aportan los fabricantes son, usar una versión más antigua del WinImage, reiniciar el equipo, probar con otro ordenador. Ninguna que me parezca aceptable.

Así que, me decido a hacerlo desde linux, el problema es encontrar un programa que haga lo que WinImage en el sistema del pingüino. ¿Lo hay?. Pues sí, se llama "dd" y sirve para transferir datos en bruto de un soporte a otro.

El problema reside que DD trabaja, exclusivamente con archivos RAW, es decir, los que no contienen más que los datos en sí, mientras que VHD, VPI o IMG, pueden contener metadatos que no serán interpretados por dd.

Así pues, se nos plantea otro problema: ¿cómo convierto mi archivo de imagen a un archivo con datos en bruto?. La respuesta la encontramos en el paquete VirtualBox, una máquina vírtual que nos permite arranca sistemas operativos completos dentro de nuestro linux. Por lo tanto habrá que buscar "VirtualBox" con nuestro gestor de paquetes:
En Opensuse:

sudo zypper install VirtualBox

Es el momento de convertir la imagen. Suponiendo que nuestra imagen está en la carpeta Descargas

VBoxManage clonehd --format raw /home/dhouard/Descargas/sd.vhd /home/dhouard/Descargas/sd.raw

De esta manera, creamos un disco en formato raw que podrá ser usado por dd. Ahora debemos saber cual es el dispositivo referente a la tarjeta sd. Para ello, insertamos la tarjeta en nuestro lector y usamos la orden "fdisk" para saber cual es.

su -c "fdisk -l"

Tras preguntarnos por la contraseña de root tendremos un listado, más o menos, como éste.

dhouard@minas-morgul:~> su -c "fdisk -l"
Contraseña:

Disk /dev/sda: 320.1 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders, 625142448 sectores en total
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identificador del disco: 0x9fca1fd5

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sda1            2048   188749731    94373842    7  HPFS/NTFS/exFAT
/dev/sda2   *   188749732   230677335    20963802   83  Linux
/dev/sda3       230677336   604551167   186936916    f  W95 Ext'd (LBA)
/dev/sda4       604551168   625135615    10292224    c  W95 FAT32 (LBA)
/dev/sda5       230677398   231721559      522081   82  Linux swap / Solaris
/dev/sda6       231721623   604525949   186402163+  83  Linux

Disco /dev/sdb: 1973 MB, 1973420032 bytes
8 heads, 44 sectors/track, 10949 cylinders, 3854336 sectores en total
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identificador del disco: 0x935a0558
Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sdb1            2048     3854335     1926144    c  W95 FAT32 (LBA)

Como vemos, la tarjeta se encuentra en /dev/sdb (el número 1 es sólo para indicar el número de partición). Por lo tanto la orden que tendremos que hacer es

dd if=/home/dhouard/Descargas/sd.raw of=/dev/sdb

Y tras un rato, ya tendremos nuestra tarjeta SD preparada para introducirla en el tablet y reinstalar el sistema. El proceso dependerá ya de cada fabricante, por ejemplo, en mi NVSBL Sirius se realiza pulsando, con el tablet apagado, [Retroceso]+[Encendido]

Y nada más, espero que, a pesar de ser muy técnico, lo haya dejado lo suficientemente sencillo para que todos podamos llevar a cabo esta tarea.

2 comentarios:

anthony dijo...

Gracias de verdad, puede esta perfecto y ademas es de mucha ayuda ya que no hay ningún tutorial que explicara esto.

Anónimo dijo...

El error en Windows 7 se produce porque debes ejecutar el programa como administrador.
Si lo abres así, funcionará sin problemas.