Hace unas semanas recibí en un pedido conjunto mi nuevo DreamPlug, un pequeño equipo basado en tecnología ARM de NewIT. Inmediatamente me puse a trabajar con el para ponerlo a funcionar. La idea era sustituir a mi actual GuruPlug, y dejar este último para un trabajo mas liviano y exclusivo con la web de Connectical. En mi primera toma de contacto, una vez arrancado, me encontré con una serie de problemas de software no demasiado graves. Echando un ojo a los foros de NewIT, parece ser que, tal vez por tratarse de un equipo demasiado moderno, todas las unidades vienen con estos problemas de fábrica. Afortunadamente, al tratarse de software, todos ellos tiene fácil solución.

El primer fallo que me encontré nada mas arrancar fue un error conocido en la tabla de particiones y, aunque el equipo funciona correctamente, las particiones aparecen «montadas» unas sobre otras generando errores de bus en el /var/adm/messages. El segundo no es un fallo en si mismo, pero el equipo viene con una Ubuntu 9.04 instalado por defecto, una distribución obsoleta y tal vez no demasiado liviana.

Estos son los pasos que he dado para corregir los errores citados. Comentar que Globalscale no da soporte a las modificaciones que podamos hacer en el sistema base, por lo que si quieres tener tu equipo cubierto, simplemente sigue los primeros pasos de la guía y no sustituyas la distribución, aunque si lo haces que sepas que siempre se puede volver atrás instalando de nuevo la imagen de fábrica.

Paso previo: Comprobación de Hardware.

Algunas unidades de DreamPlug vienen con dos posibles fallos de hardware.

El primero de ellos, el menos problemático, está en el adaptador del enchufe europeo, donde el aparato se conecta con el cable de corriente. En algunos modelos este adaptador viene demasiado holgado y hace que el cable de alimentación se desconecte solo con tocarlo. La solución a esto es sencilla, podemos enviar un reporte para que nos manden un adaptador nuevo o, si tenemos mucha prisa por ponernos a trabajar, pegar el adaptador al cable, lo cual no interfiere para nada con el funcionamiento normal del DreamPlug.

El segundo fallo es mas problemático, y la solución pasa por cambiar el aparato entero. Se trata de un error en la frecuencia de reloj del microprocesador, en algunos modelos esta fijada a 400 Mhz cuando debería de estar a 1.2 Ghz. Para comprobar si nuestro equipo está afectado podemos mirar el /proc/cpuinfo como comentan en este hilo, si los BogoMIPS están en torno a 396 nuestro equipo está en fallo, si por el contrario esta en torno a los 1192 es que está funcionando correctamente. Comentar para vuestra tranquilidad que por ahora ningún equipo europeo vendido por NewIT se ha visto afectado.

Paso 1: Crear un USB arrancable.

El primer paso del proceso es crear un volumen USB seudo-arrancable. Es «seudo» porque aunque en el USB almacenamos un sistema base, el kernel de arranque es el que viene en el propio DreamPlug.

Para crear este sistema base USB podemos utilizar la imagen de fábrica, la imagen Debian que nos proveen los chicos de Globalscale o una imagen Debian modificada por Andrés J Díaz. Será necesario entonces formatear el USB en un sistema ext2, ext3 o ext4 (que son los nativos de Linux que soporta el kernel) y desempaquetar esta imagen dentro. En mi caso he realizado todos los pasos en el propio DreamPlug con la imagen Debian de Golbalscale.

# wget http://l.moire.org/dp_deb_01 http://l.moire.org/dp_deb_02
# cat dreamplug_debian_v0.2.zip.001 dreamplug_debian_v0.2.zip.002 > dp_deb.zip
# unzip dp_deb.zip
# mkfs.ext4 /dev/sdñ1 # Siendo sdñ tu unidad USB
# mount /dev/sdñ1 /mnt
# tar xvzpf dreamplug_debian_v0.2.tar.gz -C /mnt
# cp dreamplug_debian_v0.2.tar.gz /mnt # En caso de querer sustituir el sistema

En este ejemplo asumo que sdñ es la unidad conectada por USB, llavero o similar. Con un dispositivo de 2Gb es suficiente. El último paso solo es necesario realizarlo si planificamos sustituir el sistema base Ubuntu 9.04 por el Debian que hemos descargado.

Paso 2: Arrancar desde el USB

El siguiente paso es arrancar desde el USB para poder realizar operaciones en el «disco interno» del DreamPlug. Para realizar toda esta operativa es necesario tener conectado el módulo JTAG. Sin este módulo nos sería imposible controlar el proceso de arranque de la máquina y no podríamos forzar al U-Boot a usar el USB. La idea es arrancar utilizando el kernel de fábrica que se encuentra en el DreamPlug pero seleccionando como disco de sistema el USB.

Cuando el sistema arranca el la consola del JTAG vemos estas líneas:

88E1121 Initialized on egiga1
Hit any key to stop autoboot: 3

En ese momento pulsaremos cualquier tecla para interrumpir el arranque normal y acceder al U-Boot:

Marvell>>

Entonces se modifica el entorno para que se utilice el sistema raíz del USB:

Marvell>> setenv x_bootargs_root root=/dev/sdc1 rootdelay=15
Marvell>> boot

Es necesario el parámetro «rootdelay» para esperar a que el bus USB se inicie después de la carga del kernel ya que el escaneo de dicho bus es asíncrono. No es posible controlar exactamente este tiempo, ya que depende de diferentes factores, pero 15 segundos es mas que suficiente.

Hay que tener en cuenta que no se realiza un guardado del los cambios en el entorno de arranque, por lo tanto esto no afecta a los siguientes inicios del DreamPlug.

Paso 3: Reconstruir las particiones

Una vez iniciado el sistema nos autenticamos como root con la contraseña por defecto de las imágenes «nosoup4u».

Revisamos la tabla de particiones:

# fdisk -l /dev/sda
Disk /dev/sda: 1967 MB, 1967128576 bytes
61 heads, 62 sectors/track, 1015 cylinders
Units = cylinders of 3782 * 512 = 1936384 bytes
Disk identifier: 0xabcdef

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1016     1920993+   6  FAT16
Partition 1 has different physical/logical endings:
     phys=(54, 61, 61) logical=(1015, 54, 24)
/dev/sdb2              56        1021     1826706   83  Linux

Como se puede observar hay un problema en la tabla. La primera partición FAT16, que es la utilizada para almacenar la imagen del kernel que usa U-Boot para arrancar no tiene el tamaño correcto. La partición debería de ser de 16 Mb o 55 cilindros, por lo que la eliminamos y la creamos de nuevo:

# fdisk /dev/sda
Command (m for help): d
Partition number (1-4): 1
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1015, default 1): 1
Last cylinder, +cylinders or +size{K,M,G} (1-55, default 55): 55

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): 6
Changed system type of partition 1 to 6 (FAT16)

Command (m for help): w
The partition table has been altered!

Syncing disks.

Ahora la primera partición tiene el tamaño correcto, pero la segunda sigue siendo incorrecta. Comienza en el cilindro 56 lo cual está bien, pero termina mas allá del final del disco. Es necesario corregir también esta partición:

# fdisk /dev/sda
Command (m for help): d
Partition number (1-4): 2
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (56-1015, default 56): [enter]
Using default value 56
Last cylinder, +cylinders or +size{K,M,G} (56-1015, default 1015): [enter]
Using default value 1015

Command (m for help): w
The partition table has been altered!

Syncing disks.

Y esto es todo. En este momento ya tenemos las particiones correctamente creadas, el sistema debería de funcionar sin problemas puesto que ya hemos corregido todos los fallos. Solo sería necesario reiniciar, rezar al dios que mas nos convenga, hacer algo de vudú, sacrificar un carnero y construir un falso ídolo.

Paso 4: Debianizar

Si lo que queríamos era simplemente corregir los errores de fábrica del DreamPlug no es necesario realizar los cambios siguientes, pero si queremos disponer de una distribución mas ligera podemos sustituir la Ubuntu 9.04 de la siguiente manera.

En el primer paso habíamos copiado la imagen tar.gz de Debian en nuestro USB. Vamos a utilizarla ahora. Suponemos que ya hemos arrancado desde el USB según el paso 2 y nos hemos autenticado en el sistema. Realizamos ahora el cambio:

# umount /dev/sda2 # Puesto que ha sido montado automáticamente por usbmount
# mkfs.ext4 /dev/sda2 # Formateamos con ext4
# e2label /dev/sda2 root # Etiquetamos la partición como root (opcional)
# mount -t ext4 /dev/sda2 /mnt
# tar xvzpf /dreamplug_debian_v0.2.tar.gz -C /mnt
# sync && sync && sync
# umount /mnt

En este momento ya tenemos instalada la nueva distribución Debian en disco interno del DreamPlug. Solo resta reiniciar y podremos comenzar a trabajar.

Para terminar decir que para aquellos que no os sintáis cómodos con el idioma de Cervantes, tenéis una versión de este artículo en inglés aquí.