Compilar OpenWrt

De HackLab
Saltar a: navegación, buscar


OpenWrt es la distro para dispositivos embebidos, especialmente routers. Como el espacio es un problema, se suele compilar lo estrictamente necesario.

Muchas veces no es necesario compilarlo desde cero porque el proyecto mismo lo publica a partir de sus repositorios de desarrollo. Si sólo vas a generar firmwares para los dispositivos, te conviene descargar el ImageBuilder desde estos repositorios y hacete un mirror del target con el que está trabajando con wget --mirror --no-parent url_del_target, porque en la próxima compilación se pierden los paquetes que estabas usando o te generan conflictos.

Desde hace un tiempo OpenWrt solo publica el SDK y el ImageBuilder para 64b, por lo que si estás trabajando en 32b (y si no sabés de qué se trata probablemente estés en 32b, lo podés comprobar con uname -m) vas a tener que compilarlos por tu cuenta sí o sí.

Por todo esto conviene compilar el propio entorno de OpenWrt. Además, si se van a compilar módulos del kernel que no son externos (que vienen en las fuentes de linux pero no son compilados por defecto por OpenWrt), también hay que recompilar OpenWrt.

Estructura de directorios

Guía para ubicarse cuando nos movemos entre directorios:

.
openwrt/        # fuentes de OpenWrt
packages/       # paquetes locales
ib/             # ImageBuilder
sdk/            # SDK
packages-owrt/  # paquetes descargados desde OpenWrt
repo/           # repositorio local (owrt+local)

Obtener los fuentes de OpenWrt

Todo esto necesita las herramientas de compilación de GNU/Linux. En Parabola hay que instalar el grupo base-devel y en Debian y amigos build-essential.

Van a hacer falta unos 10G de espacio en disco para compilar todo.

Clonar el repositorio:

git clone git://git.openwrt.org/openwrt.git
cd openwrt

Se puede empezar con una configuración desde cero con make menuconfig pero nos podemos ahorrar el trabajo usando la configuración que se usa para las versiones de desarrollo. Por ejemplo, para el target ar71xx (el de todos los TP-Link), descargamos:

wget -O .config http://downloads.openwrt.org/snapshots/trunk/ar71xx/config

Y luego editamos el archivo .config directamente o a través de make menuconfig.

Hay que asegurarse que la opción de compilar el SDK esté habilitada. En .config cambiar # CONFIG_SDK is not set por CONFIG_SDK=y:

sed "s/^.*CONFIG_SDK.*/CONFIG_SDK=y/" -i .config

(En el menú de configuración está en la primera pantalla.)

También conviene instalar el paquete ccache y habilitar la opción CONFIG_CCACHE para acelerar el proceso de compilación a partir de la segunda vez.


Compilar

Si ya habíamos compilado antes y estamos actualizando, conviene hacer make dist-clean para eliminar todos los archivos anteriores y empezar con una compilación limpia.

Una vez que estén todas las configuraciones locales hechas, correr make e irse a hacer otra cosa por un par de horas.

make se puede parar y volver a empezar en cualquier momento, el proceso continúa desde donde se lo dejó. Si hubo algún error (aunque es raro), es mejor correrlo con make V=99 aunque la salida va a ser extremadamente verborrágica.


Terminado

Cuando termine la compilación, en el directorio bin/ar71xx/ van a quedar un directorio packages/ con todos los paquetes compilados y una base de datos para usar con opkg. Además van a estar los archivos del SDK y el ImageBuilder.

Estos dos son los más importantes porque con el primero se pueden crear nuevos paquetes y con el segundo se pueden crear nuevos firmwares e incluir los paquetes propios en el repositorio. El ImageBuilder tiene todos los paquetes de packages/ así que con mantener estos dos archivos ya es suficiente :)

Lo demás se puede descartar porque no lo vamos a usar y/o está contenido en los otros directorios.

Los otros paquetes

Dialog-warning-yellow.svg El ImageBuilder ya no incluye todos los paquetes de los repositorios, por lo que si los queremos hay que descargarlos uno por uno usando wget --mirror como dijimos en la introducción



En esta compilación no se incluyeron los paquetes extra de OpenWrt (la mayoría, unos 4000). Para tener los repositorios completos sin tener que compilarlo todo (o seleccionar lo que queremos y compilarlo a mano con el SDK), se puede descargar el ImageBuilder de OpenWrt y extraer los paquetes desde ahí.

wget http://downloads.openwrt.org/snapshots/trunk/ar71xx/OpenWrt-ImageBuilder-ar71xx_generic-for-linux-x86_64.tar.bz2 -O - |
tar --strip-components=1 -vzjf - OpenWrt-ImageBuilder-ar71xx_generic-for-pc-i686/packages/

mv packages packages-owrt

Esto descarga el IB y extrae el directorio packages/ que contiene sin extraer ni guardar nada más.

Como este directorio también contiene paquetes que ya compilamos nosotros, vamos a tener que eliminarlos y darles prioridad a los nuestros.

Extraer el IB y ponerlo en el directorio ib/:

tar xvf openwrt/bin/ar71xx/OpenWrt-ImageBuilder...
mv OpenWrt-ImageBuilder* ib

Mover el directorio de paquetes del IB a la raíz del entorno de trabajo:

mv ib/packages .

Crear el repositorio y vincularlo al IB:

mkdir repo
ln -s ../repo ib/packages

En este momento tenemos tres directorios con paquetes.

packages-owrt/ tiene los paquetes compilados por OpenWrt.

packages/ tiene los paquetes compilados por nosotrxs.

repo/ no tiene nada pero IB espera que tenga algo para poder trabajar.

La idea es mezclar los dos primeros en el tercero, dando prioridad a los locales:

cd repo
ln -s ../packages/* .
ln -s ../packages-owrt/* .

La idea es que si el paquete ya existe el link falle.

Luego de esto se puede recrear el repositorio:

cd ib
make package_index

TODO

  • Hay una forma de manejar distintos perfiles de configuración desde el mismo árbol pero todavía no lo probamos.