Compilar OpenWrt
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.
Contenido
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 grupobase-devel
y en Debian y amigosbuild-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
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.