Jugando con el código fuente de la Fonera
Hace pocos días que publicaron el código fuente de la fonera (la blanca, la chiquitina), así que me lo descargué para ver que ofrecía.
Esta paginilla relata mis experiencias con el tema :)
Un poco de información previa
Antes de nada, déjame decirte que no, no soy un experto programador de Linux.
He programado en muchos lenguajes para, muchos sistemas.
He hecho programas para mí, programas para un único cliente, programas para uso masivo, he programado mucho, pero sobre todo he programado siempre chismes, instalaciones, máquinas, programas para usar con máquinas, etc... no me motiva la programación... digamos 'administrativa' o de gestión... más bien la aborrezco por lo tediosa y aburrida.
pero, jamás he programado nada para Linux.
Con esto quiero decir, que si esperais encontrar aquí un análisis profundo acerca de los fuentes de la fonera... pues no, no se trata de eso... sólo se trata de cacharrear un poquito, y de dar a conocer cosillas, no en plan análisis profundo, sino más bien en plan divulgación.
Acerca de los fuentes
Bien pasemos a la acción.
Una vez descargados (se trata de un fichero comprimido) y descomprimido, vemos que se trata de una variación de las fuentes de la distribución OpenWRT
La OpenWRT es una distibución de Linux en la que prima la reducción de espacio ocupado por los paquetes que alberga y, la proliferación de los drivers más comunes usados en estos chismes capaces de contener un linux en unos pocos chips.
El fichero que contiene las fuentes que distribuye Fon, contiene no sólo las fuentes de la Fonera, sino que contiene todo un completo sistema de desarrollo para la Fonera.
¿Que quiere decir esto?, bien, primero necesitamos saber cómo se generan los programas que ejecuta la fonera, vereis es algo muy sencillo.
En casi cualquier linux de escritorio, los programas pueden ser compilados a partir de sus fuentes y, con la ayuda de una serie de programas como compiladores, enlazadores, etc.
El compilador utilizado, no sé, pongamos el gcc para compilar código escrito en C, por ejemplo, debe ser capaz de generar código compatible con el microprocesador que ejecutará dicho programa.
Es decir, no es lo mismo compilar un programa para un sistema PC, es decir, para un microprocesador Pentium (por ejemplo) que para un microprocesador Power Pc o un Motorola nosecuantos.
Además de esta premisa, necesitamos lo que se viene a llamar una 'tool chain' completa.
Es decir, no sólo necesitamos un compilador que genere código compatible con el micro a utilizar, necesitamos también el resto de librerias y de parafernalia asociada al sistema y, por supuesto, que todas estas librerias sean compatibles con el micro destino.
En un PC de escritorio, esto no suele ser problema... es decir, el mismo ejecutable que estás generando, toma como 'bases' las librerías y demás cosillas que tú ya estas usando en tu máquina, sin embargo, a la hora de desarrollar programas para otro chisme (por ejemplo, en este caso, la fonera), necesitamos algo que nos permita compilar programas que luego se puedan ejecutar en un microprocesador y un hardware diferente al que estamos usando.
Esta técnica es llamada 'compilación cruzada', es decir, yo en mi PC con un pentium, estoy ejecutando un compilador gcc preparado específicamente para que lo que salga del compilador sea ejecutado en otro microprocesador (el Mips de la Fonera, en este caso).
Pues bien, las fuentes de la fonera, como digo, contienen todo un sistema de desarrollo, capaz de crear en tu Linux de escritorio (no sé, una Debian, una Ubuntu, una Gento... etc) todo un sistema de desarrollo para la fonera, es decir: crea un gcc compatible con el micro de la fonera (que es un Mips), así como toda la toolchain necesaria para poder compilar todos los paquetes de la distribución OpenWRT ó, nuestros propios programillas escritos en C.
Suena fascinante, ¿no? :) ¿será verdad que funciona?, ¿será verdad que puedo yo, un simple usuario montar todo este tinglao en mi Kubuntu o en mi Gentoo? jejeje pues pude hacerlo, si, vamos a ello:
Generando el entorno de desarrollo de la OpenWRT de la fonera
Bien, al descomprimir las fuentes, vemos un ficherin del tipo ReadME, con este contenido:
This is the buildsystem for the OpenWrt Linux distribution Please use "make menuconfig" to configure your appreciated configuration for the toolchain and firmware. You need to have installed gcc, binutils, patch, bzip2, flex, bison, make, gettext, pkg-config, unzip, libz-dev and libc headers. Simply running 'make' will build your firmware. It will download all sources, build the cross-compile toolchain, the kernel and all choosen applications. You can use scripts/flash.sh for remotely updating your embedded system via tftp. The buildroot system is documented in docs/buildroot-documentation.html. Building your own firmware you need to have access to a Linux system. Sunshine! Your OpenWrt Project http://openwrt.org
Es decir, nos avisa de ciertas cosillas importantes.
Nos dice que hay un subdirectorio en el que se encuentra una pequeña documentación acerca del sistema "BuidRoot" de la OpenWRT (es decir, del sistema de desarrollo) y unas cosillas más.
Bien, tras leer un pcoo la documentación, llegamos a la conclusión de que debemos generar todo el sistema, para lo cual, antes, debemos configurarlo (aunque se supone que las fuentes proporcionadas por fon, ya tendrán todas las cosas configuradas y listas para compilar).
El sistema de configuración de la distribucion, bueno, más bien de la imagen que queremos generar para nuestra fonera, tiene una estética similar a cuando hacemos una configuración de un kernel de Linux, es decir, el famoso make menuconfig, en el que aparece un programa hecho con una interface ncurses en el que se van escogiendo y configurando todas las opciones.
Esta es la pinta del programa de configuración de la OpenWRT proporcionada en los fuentes de la fonera:
Antes de nada, me gustaría pediros que no me inundeis de emails si no conseguís compilar todo... como digo por ahí arriba, no soy un experto en Linux, y, aunque a mi me han salido algunos problemillas al intentarlo, el ser usuario de Gentoo Linux durante unos añitos y haberme construido desde cero unas cuantas instalaciones, me han hecho casi un semi-experto de pacotilla en conseguir que un programa compile, analizando sus mensajes de error, y haciendo chapucillas mil, pero entiendo que no soy un buen punto de referencia para ésto.
Tras haber hecho nuestras selecciones (o bien sin tocar nada, para compilar todo tal como viene de Fon), basta con hacer un make para que comience a compilarse todo... tanto las librerías y utilidades, como el gcc preparado para compilacion cruzada como todos los paquetes que irán a parar a la fonera.
En este paso, tuve unos cuántos problemillas con la Kubuntu en la que lo intenté, debido a que, como bien te avisa el ReadMe, es tu responsabilidad tener instalados en tu Linux todos los paquetes necesarios para la compilación.
El gcc, y los headers típicos yo ya los tenía instalados, debido a que la instalación del VMWare así lo requería, sin embargo, cada 5 minutos, la compilación se me paraba, soltando algún que otro error por falta de algún programilla.
Yo que recuerde tuve que instalar los siguientes paquetes en mi kubuntu:
Y creo recordar que con todo esto ya pude completar la compilación.
Una vez terminado el proceso, se supone que tenemos una copia del contenido de la fonera en el directorio: /fonera/build_mips/root (siendo fonera el directorio donde descomprimí las fuentes).
Así que mi primera obsesión era el comprobar si efectivamente, lo que yo había generado allí tenía algo que ver con lo que hay en mi fonera... esto me daría la seguridad de que todo los pasos que dí eran los correctos.
Entonces, lo primero que hice fué comparar binariamente el contenido de uno de los ejecutables de la fonera con el que yo habia generado, y, sorpresa, coincidian.
Esta prueba no sé hasta que punto es fiable... pues puede que dependiendo de la versión de gcc y librerias de mi sistema puede que el resultado fuese diferente... no lo sé con seguridad..., en fin, para mi sería una de esas situaciones de 'falso negativo' , es decir, si hubieran sido diferentes, el siguiente paso habria sido probarlo realemente en la fonera, a ver si es capaz de ejecutarlo, lo que si está claro es que si los dos ficheros eran iguales byte a byte había muuuuchas posibilidades de que mi sistema de desarrollo funcionase como debía hacerlo :)
Personalizaciones y cosas a conseguir (con calma, eso sí) ;)
Bien, mi objetivo actual es hacer que la fonera pueda mapear uno de mis discos ethernet.
Tengo dos discos
de la firma LaCie, que tienen este aspecto:
En realidad es un modelo ligeramente diferente que compré creyendo que eran la bomba, (tremenda desilusión).
Es un modelo que tiene 2 interfaces: USB y Ethernet.
Estos discos usan también un Linux Embebido, (del cual no hay mucha información, a diferencia de la fonera), el cual proporciona acceso al disco duro tanto a través de un puerto USB como a través de la red ethernet y lo ofrecen bajo unos cuántos protocolos: SMB (para acceder desde chismes Windows), Mac, Ftp y hasta http.
Es decir, yo tengo dos bichos de estos pinchados en mi red, que me dan una capacidad de almacenamiento éxtra de unas 500 Gigas.
Son muy útiles, pero yo no recomendaría estos modelos, porque son un poco caros y lentos, la verdad, y aunque están muy bien como almacen de backups, o de películas (mientras las recibes por bittorrent o las compartes y están a la espera de que yo las vea y, o bien pasan a DVDs o bien las borro de malas que son, lo cual suele ocurrir últimamente en uan propoción de 50:1 )
La idea es poder acceder a estos discos desde la fonera... ¿para que?, pues bueno, es el primer paso si queremos usar la fonera para algo más... tenemos que dotarla de más almacenamiento.
Posibilidades: que haga de servidor Web para alojar paginillas, poder dejar descargando ficheros por ftp, o por http o quien sabe si se podrá compilar fácilmente un cliente de bittorrent y controlarlo por el servidor web de la fonera...
Así que el siguiente paso es intentar meter con calzador el cliente samba que tiene la propia distribución OpenWRT...