Ir a las descargas de OpenWrt y descargar el ImageBuilder para la versión y hardware que vamos a usar, en este momento Attidude Adjustment.
wget http://....OpenWrt-ImageBuilder-ar71xx_generic-for-linux-i486.tar.bz2
tar xf OpenWrt-ImageBuilder-ar71xx_generic-for-linux-i486.tar.bz2
Esta imagen es genérica para todos los ar71xx, es decir los TPLink que usamos normalmente.
Crear un directorio con todos los archivos de configuración que queramos incluir en la imagen.
Por ahora sólo necesitamos la configuración de fstab para automontar el root del sistema y tener más espacio para instalar programas y servir archivos.
git clone git://git.hackcoop.com.ar/MallaCritica.git
Esto clona el overlay dentro del directorio MallaCritica/files/.
Para crear una imagen hay que saber el nombre del perfil para el modelo del router. Con
make info
se pueden ver todos los modelos soportados con los paquetes que incluyen por defecto. Para el TPLink WR703N el nombre de perfil es TLWR703N.
Atención: si se escribe mal el nombre del perfil o de uno que no exista ImageBuilder corre igual pero no devuelve los firmware.bin.
Para crear la imagen por defecto, basta con:
make image PROFILE=TLWR703N
Pero para agregar los paquetes de MallaCritica y los archivos de configuración hay que agregar dos variables más:
make image PROFILE=TLWR703N FILES=MallaCritica/files/ PACKAGES="..."
La lista de paquetes a usar (o no usar, si se prefijan con "-", ej. "-unrar")
se encuentra dentro de files/packages.list. Para pasársela al make
hay que
cargarla en una variable:
PACKAGES="$(cat MallaCritica/packages.list | tr "\n" " ")"
make image PROFILE=TLWR703N FILES=files/ PACKAGES="$PACKAGES"
Luego de correr este último comando, el firmware para MallaCritica debería encontrarse en el directorio bin/ar71xx/.
Flashear el router normalmente o siguiendo las instrucciones de sys.upgrade.
Preparar la tarjeta de memoria para el sistema externo. Se crean dos particiones, la primera de tipo ext4 y la segunda swap. La regla es usar 2 o 4 veces la cantidad de RAM para la swap.
Luego, se descomprime el archivo rootfs.tar.gz en la primera partición. Este archivo contiene el sistema base.
mount /dev/sdb1 /mnt
cd /mnt
tar xf /path/a/imagebuilder/bin/ar71xx/openwrt-ar71xx-generic-rootfs.tar.gz
cd ..
umount /mnt
Una vez que está hecho esto, se conecta la tarjeta de memoria en el router
apagado y se lo enciende. Si todo va bien, al loguearse por telnet, el comando
df -h
debería mostrar el tamaño de la tarjeta para rootfs.
Para compilar los paquetes del directorio packages hay que descargar el SDK y descomprimirlo. Para compilar un paquete, hay que copiar el directorio, por ejemplo package/sundown/, dentro del directorio de paquetes del SDK (package/). Luego se lo compila:
$ make package/sundown/compile
Si la compilación falla, se puede ver el error agregando verborragia:
$ make package/sundown/compile V=99
Los paquetes (.ipk) se guardan dentro del directorio bin/ar71xx/packages/
Si el paquete tiene dependencias que no están incluidas en el firmware original, la compilación va a fallar porque el SDK no va a encontrar las cabeceras. Para incluirlas hay que copiar el directorio del paquete junto con el que se quiere compilar. Los paquetes originales de OpenWrt se encuentran en el git o svn de paquetes. Lo mejor es usar los paquetes de la versión de OpenWrt para la que se está empaquetando.
$ git clone git://git.openwrt.org/12.09/packages.git owrt_packages
$ cp -r package/opentracker sdk/packages/
$ cp -r owrt_packages/lib/libowfat sdk/packages
$ cd sdk
$ make package/opentracker/compile
Con esto se compilan todas las dependencias y el paquete que necesitamos.
Si lo que necesitamos es compilar un módulo del kernel, al parecer no es posible hacerlo desde el SDK sino que hay que compilar OpenWrt desde cero (o al menos esto era cierto la última vez que probé -- fauno).
Para generar la base de datos de paquetes incluyendo los propios, hay que copiar los paquetes al directorio packages/ y correr el siguiente comando del ImageBuilder:
$ cp sdk/bin/ar71xx/packages/* ib/packages/
$ cd ib
$ make package_index
El directorio packages/ del ImageBuilder contiene todos los paquetes distribuidos por OpenWrt, por lo que se puede utilizar como un mirror local si se sirve ese directorio por HTTP con un servidor web y se edita el opkg.conf del router.
Tip: También es posible ahorrarse esos pasos y copiar ib/packages a un directorio servido por web y hacer links simbólicos al ib y al sdk:
$ mv ib/packages /srv/http/
$ rm -r sdk/bin/ar71xx/packages
$ ln -s /srv/http/packages ib/
$ ln -s /srv/http/packages sdk/bin/ar71xx/
Con esto sólo es necesario correr make package_index
desde el ImageBuilder
("ib").
- La partición swap no es montada automáticamente: correr
swapon -f /dev/sda2
. Con esto se ajusta el page size.