V – OpenWRT: Modificacion, compilacion e instalacion

Autor: acki, sERASEr

Ahora que tenemos shell en nuestro router, vamos a instalar OpenWRT. Paso a paso.

Primero de todo, descargaremos:

- OpenWRT backfire 10.03 aqui
- Parche para incluir nuestro router en OpenWRT aqui

MODIFICACIONES:

Descomprimir los fuentes de OpenWRT. Despues aplicaremos nuestro parche:

Código:
# patch -p0 < livebox2_backfire.patch

COMPILACION DE OPENWRT:

En primer lugar, asegurarse que no tenemos en nuestro $PATH el toolchain que usamos para compilar el kernel. En otro caso, no compilara. Avisados estais.

Si preferis añadir mas paquetes a los pocos que yo inclui, haceis:

Código:
# make menuconfig

Y simplemente elegid los que querais.

Aparte de esto, para compilar simplemente es cuestion de hacer:

Código:
# make

Deberia compilar perfectamente (despues de hora y media o 2 horas, dependiendo de vuestra CPU y velocidad de conexion), pero yo os aconsejaria hacer esto:

Código:
# make V=99

De esta forma, la compilacion no sera silenciosa. Un monton de mensajes de compilacion, descarga, etc apareceran en vuestro terminal, pero en caso de error -esperemos que no- sera mas facil detectar donde.

Una vez la compilacion ha finalizado, encontrareis lo siguiente en el directorio bin/ de los fuentes del OpenWRT:

Código:
# ls -l
total 21040
-rw-rw-r-- 1 acki acki  2359296 2011-11-18 18:06 livebox2-root.jffs2-128k
-rw-rw-r-- 1 acki acki  2359296 2011-11-18 18:06 livebox2-root.jffs2-64k
-rw-rw-r-- 1 acki acki  1441792 2011-11-18 18:06 livebox2-root.squashfs
-rwxrwxr-x 1 acki acki  2012248 2011-11-18 18:06 livebox2-vmlinux.elf
-rw-rw-r-- 1 acki acki      229 2011-11-18 18:06 md5sums
-rw-rw-r-- 1 acki acki 13322032 2011-11-18 18:06 OpenWrt-ImageBuilder-livebox2-for-Linux-x86_64.tar.bz2
drwxrwxr-x 2 acki acki     4096 2011-11-18 18:06 packages
#

Estos ficheros son: Dos imagenes jffs2  (alineadas a 64k y 128k) y una imagen squashfs; un kernel “fantasma” que podemos borrar con total tranquilidad, porque nosotros vamos a usar “el nuestro”, el ImageBuilder, que nos servira para crear imagenes sin tener que recompilar, y un fichero con los md5 de los anteriores. Tambien un directorio con todos los paquetes que hayais elegido.

INSTALANDO Y (DES)CONFIGURANDO OPENWRT:

Ahora vamos a instalar OpenWRT en nuestro router. Tecnicamente, deberia hacerse desde el u-boot, pero nuestros intentos fueron baldios. Asi que lo haremos de una forma mas heterodoxa, pero prefectamente funcional.

Encendamos el router y arranquemos nuestro shell. Veamos esto:

Código:
# cat /proc/mtd
dev:    size           erasesize    name
mtd0: 000a0000 00020000 "boot"
mtd1: 00200000 00020000 "kernel"
mtd2: 00d60000 00020000 "jffs2"
#

Esto que vemos son las particiones de la flash. Una para el boot, otra para el kernel y otra que dedicaremos para nuestra imagen, que como podemos ver se corresponde con mtd2.
Bien, copiemos el fichero livebox2-root.jffs2-128k a un lapiz USB (o a un disco, como prefirais). Como vereis, al conectarlo, el router mostrara mensajes reconociendo el dispositivo como sda, y con una particion (si es que teneis solo una), sda1. Creamos un punto de montaje y la montamos:

Código:
# mkdir /mnt
# mount /dev/sda1 /mnt

Ahora, vamos a “volcar” el fichero sobre el dispositivo correspondiente, en nuestro caso el /dev/mtdblock2 (OJO, no confundirse o tendreis un hermoso brick):

Código:
# dd if=/mnt/livebox2-root.jffs2-128k of=/dev/mtdblock2

Facil, ¿Verdad?. Bien, vamos a comprobar que ha funcionado. Vamos a montar esta particion, de nuevo creando un punto de montaje antes:

Código:
# mkdir /jffs2
# mount -t jffs2 /dev/mtdblock2 /jffs2

Vereis que se produce un warning, no pasa nada, podeis ignorarlo. Id al directorio y ved los contenidos:

Código:
# ls /jffs2
bin      etc      lib      overlay  rom      sbin     tmp      var
dev      init     mnt      proc     root     sys      usr      www
#

Ahora lo que vamos a hacer es copiar el /dev del CRAMFS al Openwrt, es decir de SDRAM a FLASH. Tecnicamente, esto no deberia ser necesario dado que OpenWRT provee las 3 formas conocidas de /dev dinamico, pero yo no fui capaz de hacer funcionar ninguna. Si lo conseguis, postearlo aqui, por favor.

Se que podria usar cp, pero voy a usar el tar a la antigua usanza:

Código:
# tar cvf /tmp/devs.tar *

Ahora simplemente “des-tareamos” en /jffs2/dev

Código:
# cd /jffs2/dev
# tar xvf /tmp/devs.tar

Bueno, a partir de aqui, si se es un experto en OpenWRT probablemente sabras hacer esto mucho mejor que yo, pero sino, asi es como yo lo hice. Por pasos:

1.- Borraremos los contenidos de /jffs2/etc/modules y /jffs2/lib/modules/2.6.15 (si hay alguno). Recordemos que hemos compilado el kernel por separado. Este paso no es estrictamente necesario para que arranque, pero os aconsejo que lo hagais.
2.- Renombrad /jffs2/lib/firewall/uci_firewall.sh. Esto evitara un monton de errores en consola. Ademas, si ni siquiera tenemos lan, para que necesitamos un firewall ?
3.- Editar el /jffs2/etc/preinit y cambiar pi_suppress_stderr y pi_init_suppress_stderr de ‘n’ a ‘y’. De nuevo, esto no es necesario para que arranque, pero mejor no suprimir mensajes de stderr por si hubiera algun problema.
4.- Ir a /jffs2/lib/preinit y modificar los scripts para evitar que /dev se monte dinamicamente… o simplemente sobreescribir con mis modificaciones. Si podeis hacerlo mejor, posteadlo aqui.

Y nada mas. Todo lo que resta es compilar nuestro kernel de nuevo, comentando o eliminando primero la linea del .config donde hacemos referencia a la ubicacion de nuestro CPIO: CONFIG_INITRAMFS_SOURCE. Pues eso, compilamos e instalamos de nuevo el kernel (ver el hilo correspondiente si no recordamos).

(OPCIONAL) CAMBIAR EL PARTICIONADO DE LA FLASH:

Podeis cambiar el particionado de la flash si os apetece, o encontrais una buena razon para ello. Solamente es cuestion de ir a los fuentes del kernel y editar el fichero drivers/mtd/maps/livebox2.c. Particularmente, esta parte:

Código:
static struct mtd_partition fusiv_mtd_partitions[] = {
    {
      .name = "boot",
      .offset = 0x00000000,
      .size = 0x000a0000,
      .mask_flags = MTD_WRITEABLE, /*read only*/
    },{
      .name = "kernel", 
      .offset = MTDPART_OFS_APPEND,
      .size = 0x00200000,
      .mask_flags = MTD_WRITEABLE,
    },
#if defined CONFIG_SAGEM_LBV2ULT || defined CONFIG_SAGEM_BOXER
    ,{
      .name = "jffs2", 
      .offset = MTDPART_OFS_APPEND,
      .size = 0x00d60000,       
      .mask_flags = 0,
    },
#endif

Pero solamente si estais muy seguros de lo que haceis. No es necesario decir que hay que tener MUCHO CUIDADO

COMENTARIO FINAL:

Antes de embarcarme en este proyecto, tenia CERO PATATERO conocimiento de OpenWRT (y no es que tenga mucho ahora tampoco), y la documentacion es…hmmm… dejemoslo pasar Wink

En cualquier caso, sed comprensivos.

EPILOGO:

Para automatizar el arranque completamente, vamos al prompt delu-boot y escribimos:

Código:
setenv bootcmd 0x002a0000
setenv bootdelay 5
saveenv

Logicamente, el delay lo elegis vosotros.