[Lugro-mesh] armando paquetes pàra mips y otras yerbas

martin campff lugro-mesh@lugro.org.ar
Mon, 27 Aug 2007 21:13:23 -0300


Encontre esto que es para la fonera pero que aplica a nosotros ya que es el
mismo hard lo que vi tambien de interesante es que usan apt de debian ya que
el ipkg descarga bases de datos que ocupan lugar en memoria que es muy
preciada en nuestro caso...

http://blogantastico.blogspot.com/2006_12_01_archive.html 

extraje esto:

Compilación cruzada, portando aplicaciones a la fonera
 
Extracto biogénico de la mente de Nitz a las 16:41     
Bien, como lo prometido es deuda, he montado un server SOLO para programar y
portar cosillas a la fonera. Esto se llama compilación cruzada.

¿Por qué he montado un server en vez de montar el entorno de desarrollo en
mi portatil o en mi otro server?

Pues:
- Mi portatil no ha llegado aún: cagonlaputa de ACER ¬¬
- Mi otro server cuando volqué los datos solo tenia instalado windows y no
tenia tiempo de instalar una distro antes de que viniera el mensajero para
recojer el tatil. Y además, no pienso jugar ahora con las particiones :D

Bueno, paso a contar las características técnicas de mi servidor (ojo, que
cuando yo digo "servidor" me refiero a cacharros destinados a hacer mil y
una pruebas, nada de servir webs ni emule ni nada).

A ver, tengo un...
- Pentium 1 a 166 mhz
- 64mb de RAM (SDRAM)
- Disco duro de 1.2Gb para el sistema y 1.7Gb para el entorno de desarrollo
de la fonera
- Linux Debian Sarge 2.4.27-3-386

Le he quitado el raton y el monitor (el teclado lo he de dejar puesto ya que
la BIOS no me deja entrar sin él). Y para controlarlo uso un servidor ssh :)

Comenzando

Resulta que los de fon han publicado el código fuente de la fonera (más que
nada porque es GPL y tienen la OBLIGACIÓN de hacerlo). No es la versión
completa, le faltan cosas, pero bueno, nos servirá para lo que queremos.

El código lo podemos bajar de aquí
http://download.fon.com/firmware/fonera/latest/fonera.tar.bz2

Son 90 megas, así que vamonos a tomar algo y luego venimos.

Este paquete no solo trae el código fuente de la fonera, sino que incluso
incorpora un kit de desarrollo de aplicaciones, con su propio gcc listo para
compilar sobre mips y alguna que otra libreria (muchas sobran).

Instalando

Yo lo he bajado en /mnt/hdb1 y lo descomprimo en /mnt/hdb1/fonera-fuente
aunque tu puedes hacerlo donde quieras:
$ mkdir fonera-fuente
$ mv fonera.tar.bz2 fonera-fuente
$ cd fonera-fuente
$ tar -xvjf fonera.tar.bz2

Ok, primero de todo hacemos:
$ make menuconfig

(Hace falta tener instalado svn [no se porqué pero sale un mensajito y yo
prefiero instalarlo], así que hacemos un apt-get install subversion y au)

Podeis (debeis) investigar cada opción que trae ese menú, pero si lo
guardais tal cual, sin tocar nada, también funciona.

Seguimos:
$ make

Seguramente la compilación petará porque necesitamos instalar algunos
paquetes. Yo he necesitado instalar solamente zlib1g-dev, pero depende de la
distribución que uses o de los paquetes que ya tengas instalados esto puede
variar.

Yo para instalar esto solo he tenido que hacer
$ apt-get install zlib1g-dev

Bien, pues si nos vamos a tomar un café y volvemos encontraremos que ha
acabado de compilar y habrá pillado espacio a sus anchas. En total serán
unos 1.3Gb.

Además, si vais a ./build_mips/root/ encontrareis una copia exacta de los
archivos de la fonera (ahí podreis experimentar :D).

Nuestro primer programa

No voy a probar si funciona el sistema portando algun programa, sino que
haré alguno sencillito y a ver que tal.

El mio por ejemplo es:
#include <stdio.h>
int main(){
printf("Hola fonmundo!");
}

Lo guardamos por ejemplo en /mnt/hdb1/ejemplo.c y ahora toca compilarlo.

El primer paso es redifinir la variable del entorno PATH. Tenemos que usar
las librerias y compiladores del sistema que acabamos de instalar.
$ export PATH=$PATH:/mnt/hdb1/fonera-fuente/staging_dir_mips/bin

ATENCION: Que si tu no has instalado el sistema en /mnt/hdb1/fonera-fuente
pues lo cambias y listo.

Bien, ahora vamos a crear finalmente el ejecutable para la fonera:
$ mips-linux-uclibc-gcc ejemplo.c -o ejemplo
¿Lo probamos en la fonera?

Hay varias maneras de poder subirlo a la fonera (estas son tres de ejemplo):
1) Montando un servidor http en nuestro PC y descargarlo desde la fonera con
wget
2) Utilizando el módulo cifs.o para compartir archivos por SAMBA (véase
excelente artículo de KaR]V[aN)
3) Netcat roolz

Voy a explicar este último método ya que es de los mejores cuando te sientes
vago y no quieres montar ningún servidor de ningún tipo.

En nuestro ordenador ejecutamos:
$ nc -vv -l -p 4321 < ejemplo

Sustituyendo "4321" por el puerto que queramos y "ejemplo" por el nombre del
ejecutable.

Y en la fonera:
# nc 192.168.1.135 4321 > ejemplo

Sustituyendo "192.168.1.135" por la IP de tu ordenador, "4321" por el puerto
que antes hayas usado y "ejemplo" por el nombre del archivo.

Bien, ya lo hemos recibido, vamos a ejecutarlo:
# ./ejemplo
Hola fonmundo!

Funciona :D

----------------------------------------------------------------------------
----------------------------------------------------------------------------
Portando aplicaciones

Yo portaré el aircrack ya que me hace bastante falta un chip atheros entre
mi colección de wireless capaz de vulnerar la seguridad de MIS redes (para
probar ;).

En nuestro PC compilaremos el aircrack y después lo moveremos a la fonera
para probar.

Descargamos las fuentes de aircrack-ng
(http://download.aircrack-ng.org/aircrack-ng-0.6.2.tar.gz)

Normalmente para compilar algo hacen falta dos comandos: ./configure y make.
El configure crea un archivo Makefile con toda la información necesaria para
ejecutar luego el make.

PROBLEMA: No existe ningun ejecutable configure. Los de aircrack ya te dan
el Makefile hecho -_-'

Vale, pues voy a separar las dos opciones que tenemos cuando pase esto:
1) Si tenemos un configure para ejecutar, lo tenemos que ejecutar así:
$ ./configure CC=mips-linux-uclibc-gcc

Después hacemos el make y listo

2) Si no tenemos el configure pero SÍ que tenemos un Makefile: editamos el
Makefile y en la linea
CC = gcc

Sustituimos "gcc" por "mips-linux-uclibc-gcc". Guardamos y
$ make

Como aircrack no tenia un configure pero SÍ un Makefile, pues hacemos el
paso 2.

Ahora veremos que en ese mismo directorio ha creado los binarios ejecutables
:DDDD

Estos son:
aircrack-ng
airdecap-ng
aireplay-ng
airodump-ng
ivstools
kstats
makeivs
packetforge-ng

Bien, los pasamos a la fonera y probamos en ejecutar el aircrack-ng:
# ./aircrack-ng
./aircrack-ng: can't load library 'libpthread.so.0'

Plonk! Pues nada, instalamos la libreria:
# ipkg install
http://fon.rogue.be/lafonera-experimental/libpthread_0.9.28-8_mips.ipk
Downloading
http://fon.rogue.be/lafonera-experimental/libpthread_0.9.28-8_mips.ipk
Installing libpthread (0.9.28-8) to root...
Configuring libpthread
Done.

(La url del paquete la sé gracias a mi script fpt
http://tools.assembla.com/OpenFon/browser/apps/fpt/data/bin/fpt?format=txt
;)

Finalmente, vemos que funciona:
# ./aircrack-ng
(se muestra el manual de ayuda


Perfect :D

PD: De aquí a algún tiempo (lo siento pero he de estudiar -_-') empaquetaré
con ipkmake todos los binarios y haré un paquete ipk precompilado ;)
2 opiniones irrelevantes más 
Palabras clave: Fonera, Linux 

----------------------------------------------------------------------------
---------------------------------
Bueno, pues aún no teniéndola leo todo lo que pillo sobre el tema.

Para empezar, podemos decir que la fonera tiene un procesador de 32bits MIPS
de clase R4Kc (fuente http://karman.homelinux.net/ ) y un Linux 2.4.32
compilado especialmente para ese procesador. Por eso mismo no podemos usar
programas compilados en una plataforma x86, sino que hay que compilarlos
para la fonera (de eso hablaré otro día ;). Lo que sí que podemos hacer por
el momento es crear bash scripts y ejecutarlos.

El problema viene a la hora de crear scripts que dependan de otros archivos
(como por ejemplo mi fpt, que dependía de que el directorio /var/cache/fpt y
el archivo /etc/fpt/sources.list estubieran creados). O tambien cuando
intentamos instalar una libreria ¿Dónde la dejamos?. Para eso existen los
paquetes ipk ;)

¿Como podemos hacer un paquete con todo lo necesario? Pues siguiedo estos
pasos...

Para mi practica voy a empaquetar mi propio script, con los directorios y
los archivos necesarios.

Empecemos preparando el entorno

Creamos un directorio que será nuestra raiz de trabajo. Por ejemplo, en
~/paquete-fpt:

    $ cd ~
    $ mkdir paquete-fpt
    $ cd paquete-fpt/
    $ pwd
    /home/user/paquete-fpt

Ahora meteremos todos los archivos que hagan referencia a nuestro programa,
pero siempre en una estructura de directorios como la de la fonera (osea,
que si el archivo X va en el directorio /var/run/ de la fonera, crearemos el
directorio ~/paquete-fpt/var/run/ y lo meteremos ahí).

Por otra parte, crearemos un archivo llamado "debian" donde introduciremos
toda la información que haga referencia a nuestro paquete (version,
dependencias, autor...).

Vamos por pasos tomando como ejemplo mi script ya comentado:


Los archivos de nuestro programa

Ahora creamos los directorios donde metermos nuestros archivos. En total
serán:

    * bin/ - Aquí meteremos el script
    * var/cache/fpt/ - Aquí no meteremos nada, ya que el script usa ese
directorio solo para depositar los ipk descargados
    * etc/fpt/ - En este directorio meteremos el sources.list con la lista
de directorios.

Procedamos:

    $ mkdir bin
    $ mkdir -p var/cache/fpt
    $ mkdir -p etc/fpt


Con todos los directorios creados, vamos a crear ahora el sources.list. ¿Qué
url's quereis poner? Yo pondre las mias, que son casi las únicas que conozco
por el momento (origen de porqué las conozco) (pensad que aún no tengo la
fonera ;)

    $ cd etc/fpt
    $ echo http://fon.rogue.be/lafonera-experimental > sources.list
    $ echo http://fon.rogue.be/lafonera/ >> sources.list
    $ echo http://olsrexperiment.de/sven-ola/fonera >> sources.list


(Lo sé, estos tres "echo" podiamos haberlos evitado con echo -e
http://fon.rogue.be/lafonera-experimental\nhttp://fon.rogue.be/lafonera/\nht
tp://olsrexperiment.de/sven-ola/fonera").

¡Archivo de repositorios creado! Ahora copiamos el script a su respectivo
directorio (bin/):
(suponiendo que esté en ~/codes/fpt el original)

    $ cd ../..
    $ pwd
    /home/user/paquete-fpt
    $ cd bin
    $ cp ~/codes/fpt .


Hecho ;)

El archivo "debian"

Esta parte es la más dificil (comparada con las dos tonterias que hemos
hecho antes). Aquí tenemos que definir todo nuestro paquete. Vamos de nuevo
a nuestro directorio de trabajo:

    $ cd ~/paquete-fpt


Ahora hay que crear un archivo con todo lo necesario. Iremos por partes.

1) El nombre del paquete. Vamos a llamarlo "fpt", así que creamos la primera
linea del archivo:

    $ echo Package: fpt > debian


2) La versión. En el momento de escribir este articulo andaba por la 0.1.2,
así que la introducimos en la siguiente linea:

    $ echo Version: 0.1.2 >> debian


3) Dependencias. Mmm... como mucho depende de wget y de ipkg (pero poner que
depende de ipkg en un paquete ipk que se abre con ipkg es una paradoja, así
que solo ponemos wget)

    $ echo Depends: wget >> debian


ATENCION: Aunque nuestro script no dependa de nada, tenemos que poner
almenos una linea Depends vacia, por ejemplo:

    $ echo Depends: >> debian


4) El código fuente. Esto es opcional, pero si queremos aportar al software
libre un granito de arena podemos poner una url o algo. Yo no pongo nada
(más que nada porque el mismo script es el código).

    $ echo Source: >> debian


5) Sección. ¿A qué rama pertenece tu programa? ¿Es una aplicación? ¿Una
libreria?. Mi script es una aplicación, así que la pondré en apps.

    $ echo Section: apps >> debian


6) Prioridad. Le podemos poner "opcional":

    $ echo Priority: optional >> debian


7) Mantenimiento. ¿Quien mantiene tu script? El mio lo mantiene Nitz, de
OpenFon Team, un tio algo feo, pero bueno, supongo que servirá para el
cargo.

    $ echo Maintainer: Nitz, OpenFon Team >> debian


8) La arquitectura. Todo lo que hagamos para la fonera debe tener una
arquitectura mips, por lo tanto:

    $ echo Architecture: mips >> debian


9) Descripción del programa. Algo así como "Utilidad para instalar paquetes
precompilados".

    $ echo Description: Utilidad para instalar paquetes precompilados. >>
debian


Fin :D

Empaquetando y sirviendo al cliente

Ahora toca comprimir todo y finalmente crear el .ipk.

Para ello yo uso mi debian, que trae por defecto el programa dpkg-deb:

    dpkg-deb -b ~/paquete-fpt


Y ¡zas! ¡En toda la boca! Ya tenemos nuestro paquete, solo hace falta
renombrar su extensión .deb a .ipk :)