Mostrando entradas con la etiqueta fon. Mostrar todas las entradas
Mostrando entradas con la etiqueta fon. Mostrar todas las entradas

jueves, agosto 09, 2007

La fonera casi esta lista

Llevo sin escribir desde el martes, y aunque desde hace dos días no me he dedicado mucho a la fonera desde mi último post ya ha llovido mucho, hasta el punto de que la fonera está casi lista para funcionar, está prácticamente acabada. Ya funciona el netboot, el script está hecho (aunque hay que cambiarle una cosa) y luego solo quedaría averiguar la parte idónea donde colocar el script, porque interesa que sea lo antes posible, para que así es proceso sea mas rápido. Os cuento un poco mas despacio como ha ido todo.

Lo primero que hice fue averiguar como era el funcionamiento del arranque pxe, viendo los archivos que descargué de ubuntu (netboot.tar.gz), averigüé como era (bueno y con unos conocimientos previos mínimos que adquirí gracias a google). Hacen falta 4 ficheros, os los pongo junto a una breve explicación de que son y para que sirven cada uno de ellos:

-pxelinux.0: esta es la piedra angular del pxe, es el archivo que llama el dhcp cuando recibe una solicitud de arranque vía red (tiene que estar configurado en el servidor dhcp, en mi caso, dnsmasq). Exactamente no puedo contaros el procedimiento que realiza ni nada porque no lo he averiguado.
-pxelinux.cfg/default: es el archivo de configuración, indica los parámetros del arranque y demás (bootsplash, si se muestra algún archivo, si pasa algo al pulsar las teclas f1, f2...). En esa carpeta se pueden configurar diferentes archivos si se quiere para cuando se reciba una petición de una determinada mac se use ese archivo. En mi caso no me interesa eso porque no conozco las MACs de los pc, además quiero que se válido con cualquier máquina. Luego comento este fichero mas despacio y las configuraciones que yo he usado.
-linux: este es el kernel linux que voy a usar, realmente se le puede poner cualquier nombre, pero tiene que estar configurado en el archivo anterior. El kernel que estoy usando yo lo he sacado de una imagen iso de guadalinex para instalación remota, para centros tic. En esa imagen hay tanto un kernel e initrd de v3 como de 2004.
-initrd.204: este es el fichero initrd, necesario para el arranque y que proporcionará un entorno de trabajo básico. Yo una vez mas he hecho uso del de guadalinex 2004, obtenido del mismo sitio que el kernel. Por qué se llama initrd.204? simplemente porque era el nombre que tenía en la imagen iso y no lo he cambiado, al contrario que el kernel que no lo cambié, realmente tanto el kernel como este archivo podéis llamarlos como queráis, eso si hay que configurar bien el pxelinux.cfg.

Bueno sabiendo eso solo queda saber como configurar el pxelinux.cfg/default. En la página web del autor se puede ver como se configura, en cualquier caso si sabéis usar syslinux también sabéis usar pxe, la sintaxis y los comandos son los mismos y es muy sencillo.

Os cuento como lo he configurado yo, la imagen iso de la que no paro de hablaros usa syslinux para su arranque, así que he usado el mismo fichero (no lo pongo aquí por su tamaño), pero le he cambiado algunas cosas, el timeout, que sea 0, es decir sin límite (tiempo de espera), el default local también lo quité, porque significa que cumplido el timeout arrancará desde el disco duro (local), y también elimine el label local, que es realmente quien indica lo del arranque local. Por último también eliminé el label Instalav3, porque no tengo ese kernel e initrd en la fonera. Lo demas lo dejé así. En cualquier caso, eso lo cambiaré. Dejaré una sola opción (default) que arranque el kernel y el initrd, y le pondré timeout 1, para que automáticamente cuando pase un segundo arranque el solo.

Ya solo falta una cosa para que la fonera sirve de pxe server, configurar en el servidor dhcp el archivo que tiene que enviar. Una vez mas editamos el archivo /etc/dnsmasq.conf, la línea que nos faltaba por terminar:

dhcp-boot=pxelinux.0

Simplemente tenemos que indicar el fichero, porque el servidor tftp ya esta configurado, así como su directorio raíz:

enable-tftp
tftp-root=/mnt/tftp

Con esa configuración yo ya lo tenía todo para la primera prueba, prueba que hice en el server, este initrd yo todavía no lo tenia modificado, así que no iba a quitar ninguna contraseña automáticamente, en este momento lo que me interesaba era probar si funcionaba o no, si podía arrancar desde la fonera, además lo hice en mi servidor porque yo sabía de antemano que no se me iba a borrar el disco duro ni nada parecido, ya que previamente había arrancado la imagen iso en vmware, y en cierto momento intentaba conectarse con rsync a 192.168.4.254, y esa ip no existe en mi red, por lo que ahí se paraba el arranque. Sabiendo eso conecté la fonera al server por ethernet y reinicio, el server comenzó a arrancar... desde la fonera!! funcionó! pero sabéis lo que pasó cuando llego ese momento en el cual se para el arranque? pues que me dio una shell! si una shell! así que yo monte la partición / y edité el fichero /etc/shadow y quité la contraseña de root, reinicio arrancando desde el disco duro y cuando llega la pantalla de login pongo root y ya esta! sin contraseña, funcionó! pude quitar la contraseña. También probé en el portátil y también le quité la contraseña, pero claro esto fue a mano, ejecutando comandos en esa shell, ahora se trata de hacer un script e integrarlo en el initrd, para que se ejecute todo automáticamente.

Ahora comienza otra odisea, en realidad todo sería muy sencillo con los conocimientos necesarios, pero en mi caso muchos de ellos los estoy adquiriendo especialmente para la ocasión, así que he tenido que ir poco a poco, a prueba y error. Ahora viene la parte de hacer el script y modificar el initrd, comencé con lo del script lógicamente. Hacer el script tenía una complicación añadida, tengo que averiguar en que partición se encuentra el archivo shadow, en mi prueba manual yo sabía que partición montar, pero el script tendrá que averiguarlo. Os voy a contar como lo hice la primera vez, y como lo estoy haciendo ahora.

Mi primera idea fue esta, os pongo el script que la plasma y ahora os la describo:

#!/bin/bash
PARTICIONES=$(ls /dev | grep "hd..")
mkdir /media
for i in $(echo $PARTICIONES)
do
mkdir /media/$i
mount /dev/$i /media/$i
done
SHADOW=$(find /media -name shadow | grep "/media/hd../etc/")
cp $SHADOW $SHADOW.bak
cat $SHADOW | grep root | sed -r 's/|[$][^:]ls /dev | grep hd | grep "hd.."+//g' > $SHADOW
cat $SHADOW.bak | grep -v root >> $SHADOW

Lo primero que hace es ver las particiones que tiene el sistema, y lo almacena en la variable PARTICIONES, mira en el directorio /dev, y filtra la salida con grep a lo que sea hd**, explico, como todos sabéis en linux los discos duros son ficheros que están en /dev, por ejemplo /dev/hda, y las particiones se indican, añadiendo un número al nombre del disco duro, así pues la primera partición del primer disco duro será /dev/hda1. Y esto a que viene? pues que un disco duro no lo puedes montar, montas sus particiones, por eso en vez de hacer un grep hd, que filtraría tanto discos duros como particiones, lo que hago es filtrar solo las particiones, mandando a grep que solo seleccione lo que empiece por hd y sigan dos carácteres cualesquiera, de esta forma entraría hda2 pero no hda, por lo que me ahorro errores a la hora de montar.

Después crea el directorio /media, donde se montaran todas las particiones. A continuación viene un bucle (for) que va tomando uno por uno todos los valores de la variable PARTICIONES, crea un directorio con ese nombre y monta ahí esa partición y se repite hasta que ha acabado con la variable PARTICIONES. Ejemplo, coge el primer valor hda1, crea el directorio /media/hda1 y monta en la partición /dev/hda1.

Ahora viene la parte clave del script, la que localiza el archivo shadow y lo edita. Lo primero que hace es asignarle un valor a la variable SHADOW, ese valor es la ruta del archivo /etc/shadow, para encontrarlo lo que hace es buscar en /media algo que se llame shadow, realmente así buscamos en todo el disco duro, porque todas las particiones están montadas en ese directorio, mas tarde esto supondrá un problema, pero lo veremos después. Lo siguiente que hace es un backup del fichero. Y las dos ultimas líneas son las que modifican el fichero y quitan el password de root, es posible y probable que haya un procedimiento mejor que el que yo he usado, pero no he sabido hacerlo de otra manera. Lo que hace la primera de las dos líneas es pasarle a sed la línea del fichero que corresponde a root, este último comando selecciona la parte de la contraseña y la elimina, el resultado va al propio fichero shadow, después para añadir las líneas correspondientes a los demás usuarios del sistema hago un grep -v root, consiguiendo que devuelva como resultado todo excepto la línea de root, para acabar se añade (>>) al fichero shadow.

Ese era el primer script que se me ocurrió, y en teoría parecía buena idea (al menos a mi), y parecía que funcionaría. Sin embargo yo no contaba con una cosa, en el caso de mi servidor el find busca en mas de 110 GB, y en el caso de mi portátil en unos 75 GB, cuando se ejecutó el script tardó increíblemente en acabar, y además no funcionó, pero de todas formas no me moleste en intentar arreglarlo, porque no se cuanta información almacenaran las laptops del instituto, pero no puedo estar 5 minutos esperando a que find termine de rastrear el disco duro, así que toca cambiar el algoritmo.

Al igual que antes os pongo el nuevo script y luego comento:

#!/bin/bash
PARTICIONES=$(ls /dev | grep "hd..")
mkdir /media
for i in $(echo $PARTICIONES)
do
mkdir /media/$i
mount /dev/$i /media/$i
SHADOW=$(ls /media/$i/etc/shadow)
SHADOW2=/media/$i/etc/shadow
if [ $SHADOW ==$SHADOW2 ]
then
cp $SHADOW $SHADOW.bak
cat $SHADOW | grep root | sed -r 's/|[$][^:]+//g' > $SHADOW
cat $SHADOW.bak | grep -v root >> $SHADOW
else
done
fi
done
shutdown -r now

Las primeras líneas son claras, se crea el directorio /media y se asigna un valor a la variable PARTICIONES, después viene un bucle for igual que antes, pero cambia la tarea que realiza, el procedimiento es este: crea un directorio, monta la partición en ese directorio, luego crea la variable SHADOW, lo que hace es un ls en busca del archivo shadow, si devuelve resultado es que el fichero existe, y la ruta se almacena, si no hay resultado el fichero no existe y la variable se queda en blanco. Lo siguiente es una "variable de control" que nos permitirá ver si $SHADOW tiene el valor correcto, simplemente es la ruta que debería tener el fichero shadow en caso de que existiera. A continuación mediante un if se comprueba si SHADOW es igual a SHADOW2, si es igual se deduce que el fichero shadow existe en esa partición, si no son iguales entonces no hay shadow. Si no hay shadow se acabó, si hay shadow se le quita el password y se le hace un backup con el mismo procedimiento que en el script anterior. Lo único que cambia en este script es el procedimiento de búsqueda del shadow. Cuando acaba reinicia la máquina.

Tengo que aclarar que el script no funciona, se ejecuta aparentemente bien, pero alguna parte debe fallar porque luego cuando se reinicia root sigue con pass, tendré que averiguar que parte va mal, pero el algoritmo yo creo que esta bien pensado, pienso que es un problema de implementación, habré codeado algo mal, ya pensaré como lo arreglo.

Por último vamos a ver la parte que nos falta, como se modifica el initrd. Un initrd normal está comprimido al máximo con gzip, por lo tanto lo primero que hay que hacer es descomprimirlo:

gzip -dc initrd.204 > initrd.204.img

Con eso tendremos nuetro initrd descomprimido en el fichero initrd.204.img. Ver su contenido es muy sencillo, simplemente lo montamos con la opción loop:

mount initrd.204.img /mnt -o loop

Con eso podremos ver en /mnt el contenido de nuestro fichero, sin embargo tenemos un problema, no podemos modificarlo, no dirá que es un sistema de ficheros de solo lectura, y razón lleva, el initrd tiene un sistema de ficheros cramfs, y este sistema es de solo lectura. Entonces que hacemos? pues es sencillo copiar todo el contenido a otra carpeta, modificarlo a nuestro gusto y después empaquetarlo todo y crear nuestro propio initrd. Este procedimiento (el de copia) primero pensé en hacerlo con cp, el comando para copiar archivos, sin embargo se me complico porque no copiaba los enlaces simbólicos, por lo tanto yo obtenía un resultado diferente al original y que seguramente no funcionaría bien después, así que descarté esta opción, es posible que hubiera alguna opción de cp que lo solucionara, pero a mi se me ocurrió otra cosa, usar rsync, si un paquete que te crea una copia literal del original, vamos que "sincroniza" los directorios origen y destino, esta era la mejor solución, el comando que ejecuté fue este:

rsync -av /mnt /media/almacen/pxe/initrd/

Y se copió todo. Hecho esto me fui al directorio que contiene los script de inicio (/etc/init.d) y añadí mi script en el lugar adecuado. A ver os cuento, hay dos ficheros, functions y rcS, el primero contiene las funciones propiamente dichas, yo añadí la mía al final:

# delete root's password
delete_password() {
aqui va mi script
}

Y el fichero rcS es el que llama las funciones, simplemente es una lista con las funciones, yo coloqué la mía justo antes de la que paraba el arranque (la que ejecutaba un rsync, que al no poderse hacer se paraba todo):

[...]
if [ ! -z $FLAMETHROWER_DIRECTORY_PORTBASE ]; then
get_flamethrower_directory
fi

delete_password

get_boel_binaries_tarball
beep
[...]

Hecho esto guardo los cambios y ahora me tocaba averiguar como crear el initrd propiamente dicho, porque yo ahora mismo lo que tengo es un árbol de directorios con una serie de ficheros... nada que ver con un initrd que es un sólo fichero cramfs. Lo primero que se me ocurrió fue usar mkinitrd, comando que se usa para eso, para crear ficheros initrd, lo ejecuté:

mkinitrd -r initrd/ -o initrd.204

El -r indica el directorio que tiene que usar y el -o el fichero de salida. Aparentemente todo bien, pero ya me doy cuenta de que algo ha ido mal cuando que el fichero de salida pesa mas de 5 MB!!! y el del cga era de unos 500k!! diez veces menos! pensé que comprimiendo a lo mejor, pero me parecía excesivo que se fuera a reducir tanto:

gzip -9 initrd.204

Seguía pesando 5MB! bueno pues entonces lo monté para ver que tenía que lo había hecho crecer 10 veces, porque yo solo le añadí tres o cuatro líneas en un script, no era lógico ese aumento de tamaño. Lo monté y me encontré con algo que no esperaba para nada, muchas cosas repetidas: bin/, bin2/, dev/, dev2/; scripts que antes no había: linuxrc, linuxrc.conf, script. En fin que no se parecía en nada al oringal, y mucho menos a lo que yo tenía en mi directorio /media/almacen/pxe/initrd/.

Que hago ahora? pues caballeros, lo que se me ocurrió fue hacer uso de 2 libertades que me otorga el software libre: acceso al código fuente, y modificación del mismo. Realmente puede que exista alguna opción que simplemente creara el sistema de ficheros cramfs sin modificar nada, pero yo no la encontré, así que mediante apt (apt-cache show initrd-tools) averigüé donde esta el paquete initrd-tools, que es el que contiene la utilidad mkinitrd, veo la ruta del fichero en el repositorio, y con firefox me voy a la url del repositorio, a la ruta correspondiente y me bajo el código fuente del paquete. Descomprimo el paquete (es un tar.gz), y veo el paquete mkinitrd, ejecuto file mkinitrd para ver que es eso y es un script, así que nada, less mkinitrd y a leer, veo que para crear el sistema de ficheros cramfs usa el paquete mkcramfs, el script ademas comprueba algunas cosas, añade ficheros... el caso es que yo ya tenía la solución ante mis ojos, simplemente tengo que usar el paquete mkcramfs para que cree el sistema de ficheros y ya está, sin que altere nada. Ejecuto:

mkcramfs initrd/ initrd.204

Con lo que indico que tome los ficheros del directorio initrd/ y cree el archivo initrd.204. Hecho esto ya estaba todo solucionado, se lo mando a la fonera y puedo empezar a hacer pruebas. Cada vez que quiero cambiar algo simplemente lo modifico en initrd/, creo de nuevo el initrd con mkcramfs y lo subo a la fonera.

Pues lo único que me queda ahora es conseguir que el script funcione bien, seguiré investigando y trabajando con el, creo que acabaré pronto, lo que pasa es que estos dos últimos días no he hecho casi nada porque tenia en mldonkey descargando a toda velocidad y no quería pararlo, y hacer muchas pruebas en el portátil tampoco me gusta porque mientras no puedo hacer nada, si las hago en el server mientras arranca, reinicia, vuelve arrancar, vuelve a fallar... puedo seguir con el portátil haciendo cosas.

Y nada mas, solo decir que gracias a los que hayáis llegado hasta aquí, porque este post me ha salido bastante largo :P

PD: Intentaré publicar posts mas cortos con mas frecuencia, en vez de post tan largos cada cierto tiempo, porque la verdad este post es muy largo y creo que su lectura puede hacerse pesada.

martes, agosto 07, 2007

Progresos con la fonera

Grandes y buenas noticias sobre la fonera, ya he conseguido que el tftp "funcione" y el dhcp también va bien. Ya solo me queda preparar los ficheros del pxe y estará todo listo. Voy a contaros todo con detalle, empezaré con el tftp:

El tftp es lo primero que he conseguido hacer funcionar, aunque me ha dado algún que otro problema, finalmente ha funcionado lo necesario. En mi fichero de configuración dnsmasq.conf, las líneas relativas al tftp son estas:

enable-tftp
tftp-root=/mnt/tftp

Lo que viene a decir simplemente que el servidor tftp esta activado y su directorio raíz es /mnt/tftp. Ah, bueno antes de continuar decir que aquel error que me daba dnsmasq al ejecutarlo:

dnsmasq: failed to create listening socket: Address already in use

Era debido a que dnsmasq se ejecuta al inicio del sistema, y al ya estar ejecutándose me daba error. Me di cuenta porque ejecute top para ver que hacía mi fonera y vi el proceso, así que ahora simplemente cuando quiero probar los efectos de alguna configuración simplemente mato el proceso y vuelvo a iniciarlo.

Tras ese breve paréntesis sigo con el tftp, realmente yo desde el principio tuve esa configuración en mi tftp, y podía conectarme, pero cada vez que quería enviar/recibir un archivo me daba error, os describo la situación, me conecto por tftp a la fonera e intento copiarme el fichero test (situado lógicamente en /mnt/tftp), que no es mas que un archivo de texto plano, también recibo el error si intento enviar un archivo (test2, también texto plano). Os pego la sesión:

$ tftp fonera
tftp> get test
Error code 4: unsupported request from 192.168.0.11
tftp> put test2
Error code 4: unsupported request from 192.168.0.11
tftp>

Investigando un poco en google y tras rastrear en la lista de correo de dnsmasq, bueno realmente me baje todos los logs (archivos de texto comprimidos), y busqué con grep, no encontré nada. Siguiente paso, rastrear en google, y tras buscar y buscar encontre una lista de errores de tftp (no tengo el link) y decía que para solucionar mi problema tenía que ponerlo en binary mode (hay dos, binary, y ascii), así que nada me voy al terminal ejecuto man tftp y veo que para ponerlo en binary mode simplemente tengo que poner "binary". Lo hice y funcionó, bueno parcialmente:

$ tftp fonera
tftp> binary
tftp> get test
Received 34 bytes in 0.0 seconds
tftp> put wep.txt
Error code 4: unsupported request from 192.168.0.11
tftp>

Recibo pero no envío. La verdad es que no es un problema que me moleste especialmente porque la verdad no necesito enviar archivos por tftp, para el arranque vía red solo necesito enviar archivos así que a no ser que mas adelante me ocasione algún problema serio (vamos que no me funcione nada) no me molestaré en arreglarlo. Pues lo dicho, lo que necesito del tftp ya lo tengo, así que ya me puse con el dhcp.

El dhcp, antes las líneas que tenía sobre el dhcp eran estas:

dhcp-authoritative
dhcp-leasefile=/tmp/dhcp.leases
dhcp-range=vlan0,192.168.0.20,192.168.0.50,255.255.255.0

La primera línea según el debe usarse cuando dnsmasq es el único servidor dhcp de la red y en mi caso, cuando vaya usarlo será así, ya que en la red a la que esto está destinado es mi fonera y un portátil, conectados por ethernet. La segunda simplemente es para que guarde un log de las ips asignadas. La última línea indica el rango de ips a usar. Para hacer la prueba lo que hice fue conectar la fonera a la segunda tarjeta de red de mi servidor (eth1) e intenté que se le asignara una ip con dhcp, utilizando dhclient: dhclient eth1, sin resultados útiles, no se le asigno ip. El servidor dhcp no funcionaba, probé con otros rangos de ips, con el mismo de la fonera... pero nada. Sin embargo, hoy al releer estas líneas que vienen por defecto en el archivo de configuración de dnsmasq decidí que si probara a usarlas a lo mejor funcionaba:

# other useful options:
# default route(s): dhcp-option=3,192.168.1.1,192.168.1.2
# dns server(s): dhcp-option=6,192.168.1.1,192.168.1.2

Otras opciones útiles, y una es para configurar la dirección del router y otra para configurar la dirección del dns. Activé las opciones y en ambas puse la dirección de la propia fonerame quedó así:

dhcp-option=3,192.168.0.5
dhcp-option=6,192.168.0.5

Y nada después de añadir esas opciones volví a probarlo y... funcionó!! si, funcionó! la conecté al server, dhclient eth1... y 192.168.0.28!! configuró perfectamente mi tarjeta de red. Otro objetivo conseguido.

Bien ya tengo todo lo necesario para el netboot, bueno todo no, me falta preparar los ficheros clave, los que se ejecutaran en el portátil del centro tic y lo dejaran si contraseña. A ver este tema no lo domino mucho, vamos de hecho pienso aprenderlo especialmente para la ocasión, cuando se me ocurrió la idea realmente no tenía ni idea de como llevarla a cabo, sin embargo me puse a investigar el tema y vi lo del servidor dhcp, el tftp y mas o menos los archivos necesarios, pero esa parte no la he visto todavía del todo clara. Me he descargado el paquete netboot.tar.gz de ubuntu (dapper), que contiene los archivos necesarios para hacerlo con ubuntu , yo los adaptaré para que arranquen con mi kernel y mi initrd... en fin para que me sirvan, porque no pienso instalar ubuntu un laptop (a parte no cabe en la fonera). Ah, bueno, también me falta otra cosa a parte de preparar los archivos, se trata de configurar dnsmasq en la parte que le toca este tema, se hace con la línea:

#dhcp-boot=vlan0

Pero como podéis ver no esta terminada la línea (por eso está comentada), pero no la voy a configurar hasta no tener todos los archivos puestos en su sitio.

Bueno os cuento, el archivo netboot.tar.gz que me baje de ubuntu, contiene un par de enlaces simbólicos (a archivos de la carpeta) y una carpeta. La carpeta, ubuntu-installer, tiene i386/ y luego por fin vemos:

boot-screens/
initrd.gz
linux
pxelinux.0
pxelinux.cfg/
pxelinux.cfg.serial-9600/

La primera carpeta contiene los respectivos archivos de texto que te muestran las opciones, cuando vas pulsando f1, f2, f3... explica diferentes opciones que se pueden usar... vamos aparentemente nada útil. Son instrucciones de uso para el que vaya a bootear de esta forma, no para quien quiera hacer su propia versión del tema. Luego tenemos el initrd (initrd.gz) y el kernel (linux), después el archivo clave del netboot, me parece que es el que se tiene que enviar y por tanto configurar el dhcp para ello. Y por último dentro de los dos directorios hay un par de archivos, ambos default, y contienen la configuración de arranque (del kernel) y demás. Hombre no voy a pegar aquí el archivo entero, pero leerlo es un buen ejercicio para comprender como funciona el tema. Yo creo que con eso acompañado con los scripts del cga (y lo que hay en guadalinex) tengo bastante para estudiar bien el tema. Yo he mirado poco, pero el que mas me ha gustado ha sido el de guadalinex 2004, entre el kernel y el initrd son unos 2.5 mb (la mitad de los 5 que tengo). El de ubuntu son mas de 6 o 7 y guadalinex v3 también. Así que lo intentaré con la 2004.

Pero claro ahora queda un aspecto muy importante, donde meto mi script. Tiene que ser un script que se arranque con el kernel, una cosa muy básica que se haga lo mas pronto posible durante el arranque. Simplemente se trata de detectar la partición /, montarla, backup de /etc/shadow, y luego editar la línea de root y quitarle el password, desmontar y se para el arranque, rebooteo, o simplemente halt. El script aún no lo he preparado, mañana lo haré. La parte que queda es donde meter el script. Al principio no tenía idea de donde hacerlo, recordé que yo había arrancado ese kernel con ese initrd en vmware y se me paro en una parte determinada, cuando intentaba conectarse mediante rsync a cierta inexistente en mi red virtual de vmware, por lo que se paraba. Así que monté el initrd (tras descomprimirlo) en /mnt (hablo de mi server, no de la fonera):

gzip -dc initrd.204 > initrd204.img
mount initrd204.img -o loop /mnt

Así que mediante grep busque la cadena rsync en todos los ficheros en /mnt (ergo en initrd.204), y os pondría el resultado pero con la poca anchura de la plantilla de mi blog, el resultado sería bastante malo, así que os lo cuento yo, había varias coincidencias, el propio rsync, en /etc/services, en /etc/init.d/rcS se le menciona en una línea, y en /etc/functions están los comandos completos que se ejecutan. Por lo que deduzco que principalmente es en este ultimo archivo, de hecho he comprobado que ahí están la mayoría de todos los scripts de inicio (por no decir todos), y el archivo /etc/init.d/rcS tengo que examinarlo y averiguar que tiene. Realmente mañana voy a averiguar para que sirven exactamente esos dos archivos, también voy a preparar el script, y lo situaré en la parte óptima de fichero (me interesa lo antes posible para que sea una cosa muy rápida).

Y nada mas, eso son mis progresos, ya os seguiré contando mis avances según vayan teniendo lugar. Y perdón por estos post tan largos, pero prefiero hacer algunas cosas y luego contarlas a hacer una cosa y escribir un post de 4 líneas e incompleto para actualizarlo constantemente cada 5 minutos rompiendo mi ritmo de trabajo constantemente, para eso twitter (que yo no lo uso :D).

lunes, agosto 06, 2007

Preparando la fonera

A estas alturas todos sabéis que es lo que quiero hacer con mi fonera, podéis ver las ideas aquí y aquí. Bueno el caso que ya tengo la fonera operativa, así que puedo ponerme manos a la obra con el proyecto y empezar a prepararlo todo. Pienso llevar a cabo ambas ideas, aunque tienen objetivos muy parecidos, sin embargo aunque el conseguir que una funcione bien elimina la utilidad de la otra, haré las dos. Como es lógico hay que preparar la fonera de dos formas, una para el primer experimento, y otra para el segundo, porque dispone de muy poco espacio (~5 MB), así que no se pueden hacer las dos cosas a la vez. Lo que pienso hacer es preparar la fonera para una cosa, comprobar que funciona y luego hacer un backup de la memoria flash. Luego flasheo y con la fonera desde cero preparo lo otro y de nuevo hago backup de la flash. Así cuando llegue el curso lo tendré todo listo, solo tendré que restaurar a partir del backup que me interese usar. Pero bueno hemos ido muy lejos, todavía estoy en el principio, os cuento:

Tras flashear la fonera, lo primero que hice fue configurar la red acorde con mi red, es decir, la puse en el mismo rango de ips, configure el gateway, dns y poco mas. Después mi intención era empezar montando el servidor de netboot para conseguir que uno de los portátiles del centro tic arrancara desde el y se quitara el password de root, dejando un backup del fichero original para poder restaurarlo posteriormente. Para conseguir este objetivo principalmente hacen falta 3 cosas, un servidor dchp, un servidor tftp y los archivos que se enviaran a la maquina cliente que requiera el netboot. Para el primer paso me di una vuelta por el repositorio de openwrt, a pesar de que podía haberlo hecho mediante ipkg, su gestor de paquetes, y encontré el paquete dhcp-server, lo instalé: ipkg install dhcp-server. Después intenté configurarlo, edité el archivo de configuración y todos los archivos que pedía, pero no funcionó, no puedo poner textualmente el mensaje de error porque no lo tengo anotado, pero en esencia venía a decir que verificara si había algún otro servicio dhcp, que el recurso ya estaba en uso, mas o menos eso era. Después navegando por el wiki de openwrt, fonera.info y los foros de fon (bueno aquí llegue vía google), encuentro un paquete perfecto, dnsmasq, es exactamente lo que necesito, es un paquete que incluye dns, servidor dhcp, y servidor tftp. Todo lo que hace falta para lograr mi objetivo está ahí. Ya está incluido, por lo que no tuve que instalarlo, lo que si tuve que hacer fue leerme la página man entera, para poder configurarlo correctamente. Dnsmasq por defecto busca la configuración en el archivo /etc/dnsmasq.conf, aunque se puede cambiar, o se puede no usar archivo de configuración, es un programa muy configurable, se adapta a las necesidades del usuario, aunque yo todavía no he podido correrlo. Lo que pasa es que yo entro a mi fonera por ssh a través del puerto ethernet, es decir la fonera está conectada a mi router (por ethernet) y yo desde el portátil me conecto vía wifi a la red inalámbrica de mi router, y conectado vía wifi a mi lan accedo por ssh a la fonera. Esto tiene un inconveniente obvio, a mi me interesa configurar el servidor dhcp para que funcione en la interfaz ethernet ya que será la que conecte a la laptop del centro tic, y si esta en uso conectada al router y enviando y recibiendo datos, puede ser que no funcione el servidor dhcp (como de hecho es), y ademas mi router no piensa pedirle una dirección a la fonera, en todo caso sería al revés. Como ya os he dicho antes no he podido hacerlo funcionar, mi archivo de configuración es este:

# filter what we send upstream
domain-needed
bogus-priv
filterwin2k
localise-queries

resolv-file=/tmp/resolv.conf.auto
dhcp-leasefile=/tmp/dhcp.leases

dhcp-range=vlan0,192.168.1.10,192.168.1.50,255.255.255.0

interface=eth0

enable-tftp
tftp-root=/mnt/tftp

#dhcp-boot=vlan0

Las primeras líneas, tal y como dice ese comentario, son para filtrar lo que se le envía al servidor dns (ahora explico), venían por defecto, y tras leer el man me pareció bien, así que las deje, a pesar de que el dns no es algo a lo que vaya a darle mucho uso, a mi me interesa el dhcp y el tftp. Lo que he dicho antes que iba a explicar, dnsmasq no incorpora realmente un servidor dns (bueno si pero no, según se mire), lo que hace es usar el /etc/hosts como dns "local" y las peticiones dns de otras maquinas se envían al servidor dns que este configurado en el archivo correspondiente, se especifica con el parámetro resolv-file. Después he indicado el rango de ips que quiero que asigne la fonera a los clientes. A continuación defino la interfaz sobre la que quiero que corra. Lo siguiente es el tftp y el directorio que usa. La última línea no la he terminado de configurar todavía, por eso la he comentado, es la que indica los paramétros del netboot, el archivo que se envía...

Bueno esa es mi configuración, y con ella puesta ejecuto dnsmasq pero me suelta esto:

dnsmasq: failed to create listening socket: Address already in use

Y obviamente deja de ejecutarse. Este es el problema que estoy intentando solucionar ahora, la idea que tengo es que a lo mejor no puede funcionar el dhcp porque la interfaz de red eth0 está en uso (de hecho mantiene una sesión ssh conmigo), lo que he pensado para solucionarlo era configurar el wifi (por defecto esta desactivado) en modo ap, para conectarme via wifi a la fonera, y desde su propia red inalámbrica conectarme a ella por ssh para poder controlarla, consiguiendo así tener el puerto ethernet libre, después conectarla a la segunda tarjeta de red de mi servidor e intentar que dnsmasq funcione, de ser así prepararía los archivos para el netboot y luego lo probaría en el portátil, en el sobremesa y en el server, si funcionara haría el backup de la flash, reflashearía y me pondría con el otro experimento (el de ponerla en modo cliente y que scanee de forma autónoma la red tic).

Eso último es la teoría, en la práctica me está resultando mas complejo. He activado el wifi e intenté conectarme, no conseguía ip, tuve que conectarme y asignarme manualmente la ip y ya funcionó. Sin embargo después mirando el archivo de configuración probé con otras opciones y conseguí que asignara dhcp por wifi y me conecté bien, pero a través de la lan cerró el ssh, lo sé porqué via ssh intente conectarme vía ssh vía ethernet a la fonera y no se podía, solo abrío el puerto 22 a la red que daba por la interfaz wifi (sin configuré las interfaces para que fueran por dos redes distintas). Pensé que ya valía así, pero quise ponerle cifrado a la red wifi, opté por lo mas rápido, wep, solo había que cambiar dos líneas, y ademas tampoco me interesaba que fuera la red mas segura, simplemente alejar a los curiosos. Lo hice, rebooteo la fonera (al contrario que firmware de fon, este si rebootea en condiciones, ejecutas reboot y se reinicia, con fon si ejecutabas reboot ya te podías quedar esperando, porque hasta que no desenchufaras/enchufaras no ibas a conseguir nada) una vez reiniciada (cuando comprobé que respondía a los pings, cuando reinicio la fonera ejecuto ping fonera, y al principio muestra sus últimas señales de vida, responde, luego pasa unos segundos muerta y cuando vuelve a responder es obvio que es porque ya está viva) intenté conectarme a la red wifi, pero no podía!! tras muchos intentos me di cuenta que estaba de nuevo en la misma situación al principio, pero esta vez tenía mi as en la manga, podía flashear muy fácilmente, redboot me espera 10 segundos cada arranqué, así que flasheé.

Tras este nuevo "borrón y cuenta nueva" configure de nuevo la red y trasteando con el wifi, la ip, dhcp... me volvió a pasar lo mismo, me quedé de nuevo sin conexión, así que a flashear de nuevo. Está vez tras la configuración básica del la red no toqué nada más. Me he creado un script que recupera la fonera en caso de que yo vuelva a configurar mal la red. Os explico, la configuración del wifi y de la red está en dos archivos, /etc/config/network y /etc/config/wireless, así yo lo que he hecho a sido guardar una copia de seguridad de cada uno de ellos ahora que estan bien puestos, en /mnt. Y la salvación viene por aquí, he creado un script que se ejecuta al inicio que lo que hace es esperar 3 minutos, y después restaurar el backup de los dos archivos. De esta forma yo cuando quiera probar una nueva configuración de la red edito los archivos, hago un backup de ellos (para que luego cuando mi script funcione si los sobreescribe y han funcionado poder tenerlos guardados) y reinicio. Si la nueva configuración ha funcionado podré conectarme a la fonera, si no lo ha hecho simplemente me espero 3 minutos (porque? no se, me pareció una buena cifra) y reinicio manualmente la fonera (con el cable). Así conseguiré de nuevo acceso a la fonera. El script en cuestión es /etc/init.d/test, y su contenido es este (blogger desconfigura los espacios, grrr!):

#!/bin/sh /etc/rc.common
# Copyright (C) 2006 OpenWrt.org

START=50
start(){
sleep 180
cp /mnt/network /etc/config/
cp /mnt/wireless /etc/config
}

stop(){
killall test
}

Con ese sencillo script (y con los backups) conseguiremos no tener que volver a flashear por culpa de una mala configuración de la red. Por cierto he comprobado que funciona bien, a los backups les añadí un comment (#test) reinicié espere los 3m y efectivamente mis ficheros network y wireless cambiaron, ahora tenían el comment. Por último decir que para que funcione el script hay que darle permisos de ejecución y habilitarlo:

chmod +x /etc/init.d/test
/etc/init.d/test enable

Y ya no me acuerdo de mas cosas que haya hecho, he estado leyendo todo lo que he encontrado acerca de openwrt y de la fonera y espero que esto vaya progresando.

sábado, agosto 04, 2007

Ya funciona la fonera!!!

Como sabéis estos últimos días he estado haciendo alguna cosilla con el LFS y también tenía pendiente la reparación de la fonera, ya que con ella pensaba desarrollar mi principal proyecto del verano. Bueno los que seguís el blog sabéis la historia de mi fonera, la flasheé, para hacer con ella algunas cosas en el centro tic, pero luego la deje sin conexión, desconfiguré la red y la deje totalmente aislada, pero podía recuperarla utilizando el cable serie que o bien lo montaba yo mismo, cosa que no fui capaz de hacer, o bien lo compraba montado, que también lo hice. Sin embargo cuando llegó intente usarlo pero fracasé y creo que fue debido a mi gran habilidad para soldar. Entonces ya la dejé abandonada una temporada... hasta ayer.

Lo que pasa es que hablando en el irc Uticox me preguntó por mi fonera, le dije que seguía bricked, que yo ahora estaba con el LFS, el me respondió que yo hacía muchas cosas pero no acababa ninguna y que el que mucho abarca... Y lleva toda la razón del mundo, la fonera que era mi gran proyecto para el verano lo había dejado simplemente porque había surgido un problemilla que no fui capaz de solucionar tras varios intentos, así que le dije, hoy estoy con el LFS y quiero seguir con él, pero mañana mismo me pongo con la fonera y la arreglaré. Bueno cuando llego "mañana" (antes de ayer) no seguí con la fonera, porque estuve en la playa y luego por la tarde salí un rato y luego quería leerme los feeds del día. Pero ayer si que cogí la fonera y dije de hoy no pasa, hoy la arreglo, y si no me pongo a trabajar con ella hasta que funcione, no puede ser que yo no pueda repararla. Así que cogí los materiales electrónicos, la fonera, el cable serie, y el manual para conectarlo todo.

Cuando fui a empezar ya tuve el primer problema, los pines que hay que soldarle al circuito estaban mal soldados, a parte de que la soldadura tenía un aspecto muy feo, tenía algunas grietas, y un pin estaba soldado junto con el de al lado, por poquísimo, pero hacía contacto, así que nada a quitar todo esto y a soldarlo de nuevo. Bastó con mover un poco los pines para que todo el estaño se despegara, se rompiera y se cayera (podéis imaginaros la calidad de mi soldadura xD), así que nada a soldar de nuevo, cogí el estaño y un soldador, pero antes de usarlo busqué un manual de como soldar, ponía que hay que calentar el componente y poner el estaño al lado, para tratar de que sea el componente quien derrita el estaño. Así que nada lo intento, pero mas problemas, espero, espero, sigo esperando, pero no soy capaz de recrear lo que pone en el manual, se ve que el soldador sera muy malo y no se calienta lo suficiente. Entonces recuerdo que en casa hay dos soldadores, voy a buscar el otro... y lo intento de nuevo, pero este se calienta demasiado!! pongo el soldador tocando el pin y por el otro lado del pin pongo el estaño para que se derrita cuando el pin tenga la temperatura adecuada, pero entonces empieza a oler a quemado y el pin se mueve, hasta el punto de se sale, le doy la vuelta al circuito (lo tenia bocabajo para soldar) y veo que el plástico negro que une los 6 pines esta deformado y un poco quemado. Y ahora que hago? un soldador no calienta y el otro calienta demasiado...

Intenté practicar con cables, si, soldando cables, y salía mas o menos bien. Intenté de nuevo con el circuito, cogí seis pines nuevos (porque los otros ya era para tirar), pero tampoco fue bien, con el primer soldador no había manera, no se llegaba a calentar lo necesario (pero si le ponía el estaño directamente en la punta lo fundía al instante), probé con el otro de nuevo, pero con intención de ponerlo muy poco tiempo para que lo pines no se derritieran, fracasé.

Cambio de estrategia, si no soy capaz de hacerlo por hardware vamos a seguir intentándolo por software. Se me ocurrieron varias cosas, pero para empezar la conecté al router y la enchufé, porque a lo mejor por algún fenómeno físico-cuántico la fonera funcionaba bien. Ahora paso una cosa un poco rara, la fonera creo una red inalámbrica abierta con essid OpenWrt, me conecto a ella y tengo acceso a internet, un traceroute para que ver que pasa y WTF! lo primero que aparace es mi router (192.168.0.1), intento conectarme a mis otras máquinas y puedo perfectamente, tengo acceso a mi red local, es decir, que la fonera es un puente invisible entre mi router y yo. Próximo paso? pues se me ocurren dos cosas una muy sencilla, y otra mas compleja, la primera es conectar la fonera a mi laptop y snifar a ver que pasa, la otra es montar una segunda tarjeta de red en mi server y convertirlo en un router, el plan es que mi server este conectado al router y a la fonera, y que el trafico de la fonera lo pase por la otra tarjeta de red hasta el router y de ahí a internet. La parte interesante es que la fonera creara su red OpenWrt, yo me conectaré a ella con la laptop navegaré un poco y todo el tráfico pasara por mi server, donde podré snifarlo todo y ver que huellas deja la fonera en los paquetes tcp, si tuviera un router con linux no tendría tantas complicaciones... Siguiente problema: no se como convertir mi server en un router, así que al amigo google y a buscar un poco. Pero en ese momento recordé que en fonera.info hay un tutorial de como recuperar una fonera mal flasheada, y pensé que mejor releerlo antes de seguir con este complejo (y seguramente inútil) plan. Leo que redboot puede iniciarse al arranque y esperar una conexión durante unos segundos y luego seguir con el arranque normal (redboot se usa para flashear la fonera). Pero chicos, se hace tarde, mañana por la mañana comprobaré si mi fonera arranca el redboot e ese modo, en cuyo caso podré reflashearla y asunto solucionado!

Hoy cuando me he levantado, como de costumbre me acerco enciendo el router, y el servidor, pero esta vez también cogí la fonera, el alimentador, y un cable cruzado. Me tiro en el sofá con el portátil, lego poco los feeds y luego ya me dispuse a probar lo de la fonera. Configuro mi tarjeta de red ethernet con ip 192.168.1.166, netmask 255.255.255.0 y sin gateway. También desactive el wifi para evitar problemas. Después conecto la fonera al portátil con el cable cruzado, abro un terminal con dos pestañas y en una pongo ejecuto un ping a 192.168.1.254 y en la otra dejo preparado un telnet 192.168.1.254 9000 para ejecutarlo en cuanto esa ip responda al ping. A continuación conecto la fonera a la corriente eléctrica, y al poco empiezo a ver que responde a los pings! raudo y veloz ejecuto el telnet y se conecta, pero me suelta un bonito mensaje:

== Executing boot script in 8.723 seconds - enter ^C to abort

Yo no se exactamente a que se refiere con ^C, pero yo lo interpreté como crtl+c, no sirvió, lo intenté de nuevo y tampoco valió para nada. Entonces, como en todos los manuales hablaba de putty, decidí intentarlo con putty, y esta vez el resultado fue diferente, el propio putty se encargó del tema, esto fue lo que apareció en el terminal de putty:

== Executing boot script in 8.723 seconds - enter ^C to abort
^C
RedBoot>

Ya tenía el prompt de reboot!! y yo todavía conservo el servidor tftp en mi portátil, el mismo que monte en su día cuando la flasheé por primera vez, y en el todavía tengo los archivos necesarios para el flasheado, así que comencé a introducir los comandos y tras un rato ya tenía la fonera flasheada de nuevo con openwrt. Sobre como flashearla ya escribí un post.

Una vez se ha acabado el flasheo hay que reiniciar la fonera y conectarse por telnet a la ip 192.168.1.1, y tendremos una shell de la fonera, en la cual hay que setear un password para root y partir de ahí las próximas conexiones serán por ssh. Mi problema ahora fue que no podía contactar con 192.168.1.1, y acaba de flashear! bueno tras varios intentos fallidos volví a flashear y tampoco podía conectar de ninguna forma con la fonera, pero entonces puse el wireshark a funcionar y reinicié la fonera, después vi que la fonera preguntaba por 192.168.1.254, y entonces pensé, y si me pongo esa ip, al mejor ya puedo conectarme a ella, lo hice y funcionó, hice el telnet, le puse el password y volví a reiniciar, ahora para probar que todo estaba bien conecté por ssh a la fonera y funcionó, por último configure una cosa, la ip de la fonera, porque mi red no está en ese rango, así que le puse la que le correspondía, 192.168.0.5, apago, la conecto al router y ya es visible para toda mi red. Ya funciona bien, y lo mejor no es eso, lo mejor es que aunque se me vuelva a estropear, lo puedo solucionar de la misma forma, porque redboot esta configurado para escuchar durante el arranque en la ip 192.168.1.254 puerto 9000 durante 10 segundos, así que si me vuelvo a cargar el sistema operativo puedo reflashear con toda la tranquilidad del mundo y sin cable serie!!! Por cierto quien quiera conseguir esto que lea este tutorial (aunque a mi tras flashearla la primera vez se me puso esa configuración): Configurar el Redboot para poder entrar por telnet

Bueno ya para acabar comentar que la inactividad de los últimos días ha sido por culpa de la playa, de los cazadores de mitos, de alguna salida, y del lfs. Ahora espero estar ocupado con la fonera, os iré contando mis avances con ella. Y el LFS para cuando este lista la fonera, porque no esta de mas recordar que era un proyecto de "relleno" para entretenerme mientras no tenía fonera.

domingo, julio 01, 2007

Flashear la fonera

Acabo de flashear la fonera, le he puesto openwrt. Las principales opciones que tenía eran dd-wrt y openwrt. Al final he optado por openwrt porque todo es por consola, en cambio, en dd-wrt es mediante interfaz web (aunque supongo que también se podra mediante consola) y en openwrt es consola pura y dura y yo como tengo ese extraño gusto por la consola en vez de por la interfaz gráfica (hasta cierto punto) pues me he ido a por openwrt.

El proceso no es para nada complicado y os debería funcionar bien sin mayores complicaciones, yo lo he hecho siguiendo este tutorial de Mikelevel sacado del foro fonera.info, que os recomiendo visitar si estáis interesados en la fonera.

Bueno voy a ir comentando todo lo que yo he hecho y para ello utilizaré algunas partes del tutorial que os he dicho y otras cosas las cambiaré para que se pueda hacer desde linux, ya que todas las herramientas que utiliza el tutorial son para windows. Las partes del tutorial que yo no he seguido no las voy a poner aquí tampoco, si lo mio no os funciona y/o queréis leer mas ir a tutorial directamente.

Para empezar debemos contar con acceso ssh a la fonera, si no lo tenéis seguir cualquier tutorial, hay muchos en internet. También tenemos que descargar openwrt, la versión que vayamos a instalar, yo utilicé la última estable, podéis hacer de betatesters y probar nuevas versiones en desarrollo, pero yo prefiero no arriesgarme a tener un fonera bricked. Los archivos que hay que descargar son openwrt-atheros-2.6-root.jffs2-64k y openwrt-atheros-2.6-vmlinux.lzma. Además también necesitaremos un servidor tftp.

El servidor tftp que yo he usado ha sido atftpd (apt-get install atftpd). La configuración es sencilla, ejecutamos dpkg-reconfigure atftpd y dejamos todas las opciones por defecto. Creamos el directorio /tftpboot (sudo mkdir /tftpboot) y ponemos en el los dos ficheros que nos hemos descargado antes.

Ahora entramos por ssh a la fonera y ejecutamos lo siguiente (cada comando es una línea, si hay alguno partido en dos es por el ancho de mi blog, no porque el comando sea así):

root@OpenWrt:~# cd /tmp
root@OpenWrt:~# wget http://fonera.info/camicia/openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma
root@OpenWrt:~# mtd -e vmlinux.bin.l7 write openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma vmlinux.bin.l7
root@OpenWrt:~# reboot

Cuando la fonera se haya reiniciado ejecutamos esto:

root@OpenWrt:~# cd /tmp
root@OpenWrt:~# wget http://fonera.info/camicia/out.hex
root@OpenWrt:~# mtd -e "RedBoot config" write out.hex "RedBoot config"
root@OpenWrt:~# reboot

Ahora la fonera se reiniciará de nuevo, pero no lo hará completamente y tenemos que entrar al RedBoot, hacemos esto (nota: estos pasos los cuento como los hecho yo):

- Desenchufamos de la corriente la Fonera.
- Enchufamos el cable de red por un extremo a la fonera y por otro al PC
- Configuramos nuestra tarjeta de red con IP 192.168.1.166 (vale cualquiera de 192.168.1.0/24), mascara de subred 255.255.255.0 y sin puerta de enlace.
- Abrimos un terminal, ejecutamos ping 192.168.1.254 y lo dejamos de fondo.
- Abrimos otro terminal y lo dejamos preparado para hacer un telnet a 192.168.1.254 9000, es decir ponemos telnet 192.168.1.254 9000 y lo dejamos ahí no le damos a intro.
- Enchufamos a la corriente la fonera.
- Cuando la fonera devuelva los pings nos conectamos por telnet.

Si ha salido debéis ver el prompt del RedBoot>

Indicamos a la fonera los datos de la red:

RedBoot> ip_address -l 192.168.1.254 -h 192.168.1.xxx

Ahora viene el flasheo, ejecutamos estos comandos, con tranquilidad, esperar a que acaben algunos se toman su tiempo, y mientras se estén ejecutando los comandos no toquéis nada, no pulséis ninguna tecla hasta que no os devuelva el prompt:

RedBoot> fis init
RedBoot> load -r -v -b 0x80040450 openwrt-atheros-2.6-root.jffs2-64k
RedBoot> fis create -b 0x80040450 -f 0xA8030000 -l 0x00700000 -e 0x00000000 rootfs (OJO : Puede llegar a tardar 20 minutos, en mi caso solo fueron 14)
RedBoot> load -r -b %{FREEMEMLO} openwrt-atheros-2.6-vmlinux.lzma
RedBoot> fis create -r 0x80041000 -e 0x80041000 vmlinux.bin.l7
RedBoot> fis load -l vmlinux.bin.l7
RedBoot> exec

Esperamos unos segundos y desenchufamos/enchufamos la fonera, yo desenchufe unos 20 segundos después de que dejara de responder a los pings.

Ahora nos conectamos por telnet a 192.168.1.1 (telnet 192.168.1.1) y creamos una contraseña para root ejecutando passwd root.

Ya tenemos openwrt en nuestra fonera, ya tenemos un linux totalmente operativo en la fonera, a partir de ahora podéis hacer lo que queráis, yo voy a contaros algunas configuraciones que le he hecho.

La ip de mi router es 192.168.0.1 y mi fonera, antes de ser flasheada, tenía la ip 192.168.0.5, así que cambié esta configuración antes de cortar la conexión telnet, ya que tenemos una shell de root delante así que para ahorrar tiempo, para ello, edité con vi el fichero /etc/config/network, y cambié la ip que tenía puesta (192.168.1.1) a 192.168.0.5.

Después si desenchufé la fonera y la volví a poner en su sitio y conectarla al router (casi todo el proceso lo había hecho con la fonera conectada a la laptop). La encendí de nuevo y efectivamente tenía esa ip y me pude conectar a ella por ssh.

Otra cosa que me paso fue que no tenía wifi, WTF!! sin embargo tras buscar un poco, vi algo sospechoso en el archivo /etc/config/wireless:

# disable radio to prevent an open ap after reflashing:
option disabled 1

Por lo que simplemente edité con vi y cambié el 1 por un 0, reboot y ya tenía wifi la fonera. Todavía no he hecho nada más con ella, os seguiré contando mas cosas según vaya haciéndolas.

Antes de acabar decir dos cosas mas, la primera es que ahora voy a investigar un poco este firmware y luego montaré un entorno de laboratorio similar a lo que mi fonera se encontrará en la red de mi centro tic y haré todo el montaje para comprobar el funcionamiento. La otra cosa es que os recomiendo la lectura de este tutorial de openwrt para la fonera que cuenta desde la instalación hasta la configuración básica y al final tiene un montón de enlaces que parecen útiles. Y también el manual oficial de openwrt.

PD: Mi fonera si que aparecía (y aparece) en los mapas, lo que pasa es que no estaba bien situada, por lo visto había que colocarla a mano y yo pensé que poniendo solo la dirección era suficiente y claro como no la situé en el mapa me aparecía en medio del atlántico. Ahora está todo solucionado.

PD2: Tomar nota de la fecha de ayer, desde entonces mi fonera esta flasheada y mi servidor intenta engañar a fon, vamos a esperar 30 días a ver si fon dice algo.

sábado, junio 30, 2007

Fonera en mi servidor

Finalmente he hecho en el script las modificaciones necesarias y a ojos de fon soy usuario activo aunque desconecte mi fonera. Los cambios precisos solo eran ponerle los datos de tu fonera al principio del script:

WLMAC="$(nvram get ath0_hwaddr )" #the WLAN mac-adress
MAC="$(nvram get et0macaddr)" #the WAN mac-adress
FONREV=2
FIRMWARE=0.7.1
FONKEY=/tmp/simthefon/key #the path to the fon-public-key

Solo he cambiado esas tres líneas, poniendo las MACs adecuadas, la versión del firmware de mi fonera, y la ruta a la clave. Después lo he ejecutado y listo, ya esta funcionando, se ha descargado una actualización y ahora está esperando 7175 segundos para seguir el bucle y volver a ejecutar exec_standard_mode.

Realmente iba a modificar otra cosa, iba a eliminar el cron mode, porque yo solo voy a ejecutarlo mediante el bucle y sleep, pero bueno al final no lo he borrado.

Ya solo queda esperar unos días a ver si mi fonera aparece como activa en los mapas de fon.

Por último decir que tengo pensado flashear la fonera y ponerle un linux algo mas versátil, no me he decidido aun entre openwrt o ddwrt, veré las ventajas de cada uno y ya decidiré.

PD: Que conste que yo tenía intención de investigarlo todo por mi cuenta y hacer mi propio programa, pero si ya existe este script hecho para dd-wrt simplemente tenía que adaptarlo a mi server, así que...

Analizando el funcionamiento de la fonera

He estado mirando el script que comente en el post anterior y la cosa se va aclarando poco a poco. Según pone en las instrucciones de ese script, es válido para aparecer como activo en maps.fon.com, y obviamente para hacer creer a fon que la fonera es activa, porque en el mapa solo a aparecen las que están activas (por cierto, según acabo de comprobar mi fonspot no aparece en el mapa, a pesar de que funciona perfectamente...).

Bueno el caso es que yo quiero hacer las modificaciones necesarias a ese script para poder ejecutarlo en mi server y que funcione, pudiendo yo hacer lo que quiera con mi fonera y seguir siendo fonero. Y prefiero tener el script en el server para tener la fonera para lo que sea y que el script siga funcionando aunque yo haga experimentos raros con la fonera.

El script básicamente se conecta fon en busca de actualizaciones, según parece aquel que haga esto (enviando unos datos válidos) aparecerá como fonero activo. Esa es la esencia del script, luego hace algunas cosillas mas en función de lo que reciba de fon, y además se autoejecuta cada cierto tiempo, mediante cron o bien mediante un bucle y el comando sleep con un tiempo de espera aleatorio. Supongo que en la fonera lo que pasa realmente es que al arrancar se envía unos datos (modo start, ahora veremos esto) y luego ya mediante cron se envían otros datos (modo cron) para seguir dando señales de vida y comprobar actualizaciones.

Esto es lo primero que se ejecuta, sería el equivalente a lo que envía la fonera en el arranque:

echo "mode='start' wlmac='$WLMAC' mac='$MAC' fonrev='$FONREV' firmware='$FIRMWARE' chillver='$CHILLVER' thclver='$THCLVER' device='$DEVICE'" | dbclient -T -p 1937 -i $FONKEY openwrt@download.fon.com > startscript

El script se encarga de averiguar algunas de esas variables antes de ejecutar este comando y otras vienen ya preconfiguradas con unos valores predeterminados, yo como lo voy a usar en mi servidor no se van a obtener algunos datos, la mac por ejemplo, así que yo voy a asignarle unos valores a cada una de ellas acordes con mi fonera. Por ejemplo, donde averigua la MAC, yo directamente voy a sustituirlo por la mac de mi fonera.

Seguimos, la línea que he puesto antes envía todos esos datos por ssh a fon (hace un echo y se lo pasa al cliente ssh usando pipes (el símbolo "|" ). Ahí se ve claramente que es el puerto 1937 del servidor download.fon.com con usuario openwrt y usa el archivo key como clave (se puede descargar de la misma web que el script, o si tenéis fonera podéis tomarlo directamente de ella). La respuesta recibida por parte de fon se redirecciona al archivo startscript.

Según los datos que envíes fon te responderá una cosa u otra, esta es una posible respuesta:

cd /tmp
wget http://download.fon.com/firmware/update/0.7.1/2/upgrade.fon
/bin/fonverify /etc/public_fon_rsa_key.der /tmp/upgrade.fon

rm -f /tmp/.thinclient.sh

exit

La respuesta de fon (y lo que hacemos con ella) la analizaremos después. Ahora sigamos con el script, después ejecuta la función exec_every_mode. Lo primero que hace es volver a conectarse a fon, pero en esta ocasión envía menos datos, supongo que será debido a que ya se ha "identificado" antes y fon recuerda aquellos datos. Exactamente esto es lo que hace ahora:

echo "mode='cron' wlmac='$WLMAC' mac='$MAC' fonrev='$FONREV' firmware='$FIRMWARE'" | dbclient -T -p 1937 -i $FONKEY openwrt@download.fon.com > newscript

Envía de la misma forma que antes los datos y la respuesta de fon va al fichero newscript, que al menos por ahora es idéntico a startscript, ya que aun no se ha ejecutado nada que tenga modifique ninguna de las variables.

A continuación descarga el archivo de actualización que fon dijo en su respuesta. Hecho esto viene una parte en la que se descomprime el archivo .fon, tras ir haciendo varias operaciones bit a bit mediante dd. Esta parte no da mas de si, si os interesan los por menores del algoritmo miraros esa parte del script.

Después para hacer creer a fon que nos hemos actualizado realmente se cambian las variables FONREV y FIRMWARE, según ponga en el firmware de fon que acaba de ser descomprimido:

FONREV=$(cat fon-firmware/etc/fon_revision)
FIRMWARE=$(cat fon-firmware/etc/fon_version)

Lo siguiente que nos encontramos son dos funciones, exec_cron_mode y exec_standard_mode, que se ejecuta una u otra según se use cron o sleep para continuar la ejecución periódica del script. La primera de ellas simplemente llama a la función exec_standard_mode, que es la base del script, la otra función, tiene un bucle, llama la función exec_standard_mode, después calcula un número aleatorio (n) y luego mediante sleep hace que la ejecución del resto de la función sea n segundos después de ejecutada la función. Después empieza el bucle de nuevo, llama la función, espera y vuelve a iniciar el bucle.

Finalmente hace uso de case para elegir entre la función exec_cron_mode o la función exec_standard_mode. En mi caso será mediante sleep, voy a hacerle unos arreglos al script y funcionara perfectamente en mi server.

Por último decir que esto tiene toda la lógica del mundo, porque mi fonera esta modificada para no ejecutar las cosas que la mande fon, y efectivamente no aparece en los mapas, este script si que "ejecuta" lo que fon manda y en sucesivos envíos, fon comprobará que "la fonera" esta siendo actualizada y que funciona perfectamente. Voy a modificar el script y cuando lo tenga listo lo publico y os comento los cambios que le haya hecho.

miércoles, junio 13, 2007

Fontenna

Pues si, finalmente he pedido una fontenna, acabo de hacerlo ahora mismo, a ver que tal es la antena, es direccional y de 7 dbi, a primera vista tiene buena pinta, ademas incluye un pigtail (el cable) de 3 metros, que un cable de esos cuesta caro. Por solo 2€ es muy buena oferta. A ver cuando me llega.

sábado, junio 02, 2007

Por fin soy fonero

Yo compré una fonera en Noviembre, cuando todavía valían a 5.95€, la compre uno o dos días antes de que subiera a 29.95€. Actualmente están a 39.95€. Bueno tiempo después me llego la fonera, la monte y esperé a que se configurara mediante DHCP y empezara a funcionar, no fue así, estuve un tiempo peleándome con ella poniendo configuraciones de todas clases durante una tarde entera, no sirvió para nada, así que me canse de intentarlo y le abrí el ssh y me puse a curiosear por sus entrañas. Al día siguiente intente configurarla desde la shell,use ifconfig no me sirvió, averigüé para que servía para script que tenía y me los leí enteros para conseguir hacerla funcionar. No hubo manera, la resetee varias veces para empezar de nuevo, tampoco sirvió. Y tras dos días sin conseguir que funcionara escribí al soporte técnico de FON. Les describí todo lo que hice desde el principio, paso a paso, todas las configuraciones que intente, todo. Me respondieron por supuesto, pero con algo que ya había intentado, de todas formas volví a probarlo, no sirvió para nada y les respondí diciéndoles que seguía sin funcionar después de haber seguido sus indicaciones, no supe nada mas de ellos, no respondieron. Entonces busque y leí por internet a ver si alguien mas había tenía el mismo problema y como lo habían solucionado, encontré muy poco y no me sirvió nada.

Lo único que llegue a conseguir fue un ping a google desde la fonera conectado por ssh via ethernet, pero solo llegaron 4 paquetes luego ya se volvió a cortar la conexión. Total que tenía en mi red un aparato que no era capaz de conectarse a internet, a pesar de entenderse perfectamente con todos los equipos de mi red. Desde entonces alguna vez me ha dado por intentarlo de nuevo pero nunca lo conseguí.

Sin embargo esta mañana la cosa cambió, pensé flashear la fonera y ponerle OpenWrt, un linux totalmente operativo y mas útil que el del firmware de fon. Y me fui a www.fonera.info para buscar un manual para flashearla. Pero antes pensé que podía intentar convertirme en fonero y registrar mi router por última vez, y así lo hice. Lo primero que hice fue coger la fonera y conectarla por ethernet a mi portátil, configuré mi tarjeta de red ethernet con una ip del mismo rango que la que tiene la fonera por defecto (169.254.255.1) yo me puse la 169.254.255.2. Hice un ping a la ip de la fonera para ver si daba alguna señal de vida; si, respondió. Luego hice un scaneo de puertos para ver si seguía teniendo abierto el ssh, bueno tenía abiertos el 22, el 80 y creo que 8080 también pero de esto último no estoy seguro. Bueno una vez dentro por ssh fui al directorio /jffs, que es donde se guardan todos los archivos cambiados, es el único directorio modificable. La fonera tiene un sistema de archivos un tanto peculiar, si queréis saber más sobre él clic en este enlace: Sistema ficheros fonera. Una vez en el directorio que os he dicho borre todos los archivos excepto los que son para que el ssh esté abierto y el que evita las actualizaciones de firmware, es decir, /jffs/bin/thinclient, /jffs/etc/firewall.user, /jffs/etc/init.d/S50dropbear, esos tres archivos fueron los únicos que no borré, de modo que tenía una fonera reseteada pero con el ssh abierto y la actualizaciones capadas.

Continuamos, ahora cambié de opinión y pensé que mejor que enchufarla a mi portátil sería enchufarla al router, por si diera la casualidad de que funcionase, así que desenchufo la fonera y la llevo a su lugar habitual y la conecto al router y la corriente eléctrica. En plan ahora era el siguiente, conectarme a la red privada MyPlace, que ya comprobé antes que existía y luego establecer las configuraciones. Gracias al estupendo paquete network-manager pude conectarme perfectamente a la red cifrada con WPA, y luego puse en firefox 192.168.10.1, la dirección de la fonera dentro la red privada, accedo a la interfaz web de configuración, cambio la contraseña del user admin y luego voy al apartado de configuración de la red. La configuración por dhcp directamente no la probé porque no me había funcionado nunca, le puse ip estática, 192.168.0.5, la mascara de red 255.255.255.0 y el gateway 192.168.0.1, como dns le puse también la ip de mi router, 192.168.0.1, le doy al botón submit reinicio la fonera (desenchufandola y volviendo a enchufarla, lógicamente). Tras esto me vuelvo a conectar a la red MyPlace, aunque por cierto ya había aparecido la red pública, FON_AP, bueno me conector a la red privada, abro firefox, www.google.es, y.... funciona!!!! por fin después de 7 meses por fin se ha conectado a internet, no sabéis la alegría que me dio verla funcionando.

Hasta ahora la historia es muy bonita, empezó todo mal y ahora va bien, pero no ha acabado no. Ya había probado la red privada y funciona perfectamente, ahora solo me queda probar la red pública, FON_AP, me conecto a la red, todo bien por ahora, y en firefox le doy a F5 para que cargue de nuevo la pagina de google, a ver si funcionaba y.... WTF!!! no cargaba! que está pasando porque funciona la privada y la abierta no?? esto que es??

Bueno me puse a pensar que podía estar pasando y lo primero que hice fue hacer un ping al gateway, que dentro de la red publica es la propia fonera, así que nada miro mi ip con un ifconfig ath0 y me dice que es 192.168.182.2, así que lo mas probable es que la fonera sea 192.168.182.1, le hago el ping, espero... sigo esperando, ya me temo lo peor, y efectivamente me suelta un Destinantion Host Unreachable, yo flipo, que c*** está pasando?? me vuelvo a conectar a MyPlace para comprobar si sigue teniendo conexión a internet, lo hago y si, la sigue teniendo. Me voy otra vez a FON_AP y nada no hay conexión. Me tiro como una media hora haciendo pings, traceroutes, nmaps, y demás parafernalias para intentar averiguar porque no funciona. Resultado: no tengo ni idea, no se que pasa, pero entonces estoy tenía un terminal haciendo un ping -a a la fonera, que es un ping adaptativo, es decir, envía pings lo mas rápido posible sin que se pierda ninguno. Bueno miro ese terminal y nada ninguna respuesta de la fonera, pero de repente empieza a responder, empiezo a recibir paquetes ICMP de tipo y código 0!!! (para los profanos en la materia, eso es una respuesta normal a un ping). Bueno entonces voy corriendo al firefox, www.google.es y ahora si, funcionó! Bueno me voy a la web de FON para registrar mi router, lo hago y listo, ya soy oficialmente fonero linus. Por fin, he tardado 7 meses en conseguirlo.

Este post lo publico a través de mi red publica FON_AP (todavía no le he cambiado el nombre).

Saludos ;-)

sábado, abril 07, 2007

Sobre FON

Habitualmente leo el blog de Martin Varsavsky (estoy suscrito a su feed rss), bueno el caso es que hoy ha publicado un vídeo, sobre los nuevos routers que pueden ser los sucesores de La Fonera. El vídeo en cuestión es el siguiente: http://spanish.martinvarsavsky.net/fon/id-fon-.html. Nos comenta algunos prototipos, con 802.1n, con Wimax, con 2 puertos ethernet, habla de las "fontenas" (antenas wifi planares) y creo que dice algo más. La idea de tener dos puertos ethernet me parece muy buena idea. También Martín ha dicho que el router no lo van a sacar con Wifi n hasta que los gadgets incorporen esta tecnología, ha dicho que seguramente sacaran dicho router a finales de 2007. Lo mismo dice de Wimax, pero en este caso no ha dado ninguna fecha. Mi pregunta entonces es que si Fon no piensa sacar ningun router hasta final de año? el fon Liberator no saldrá hasta final de año? o piensan sacar el fon liberator antes y luego sacar una nueva version a final de año que ya incluya 802.11n? o quiza el fon liberator que nos prometieron no salga todavia y tenga que esperar mas tiempo?

A mi en particular me gustaría que sacaran el Fon Liberator antes, y si pudiera ser que ya incluyera wifi n, ya que es un router muy interesante, bastante mas que la fonera actual, para el que no la conozca aqui teneis informacion sobre el Fon Liberator:

http://blog.fon.com/es/archivo/gadgets/fon-liberator.html
http://blog.fon.com/es/archivo/gadgets/mas-sobre-el-fon-liberator.html

Ademas GSpace se integrará en el router, por lo que tu podras directamente guardar archivos en tu cuenta de gmail desde el router.

Tambien hay que tener en cuenta que Fon ha subvenionado muchas foneras, primero a 5 €, luego me parece que a 29€ y ademas de todas las que ha regalado. Ahora es el único momento en que ganan dinero con cada fonera vendida, las venden por 40 €. Asi que los ingresos de Fon hoy por hoy solo vienen de los aliens, que son los que pagan para conectarse a un hotspot fon, 3€ el primer día y 2€ los días sucesivos, y de las foneras que vendan a partir de ahora, que han subido el precio (bueno ya hace algun tiempo, pero poco). Esto me lleva a pensar dos cosas, van a sacar otro router antes de recuperar todo el dinero que han invertido en subvencionar foneras o lo haran antes? En el caso de que lo hicieran antes de recuperar el dinero el nuevo router tambien sería subvencionado o lo venderían de forma que ganaran dinero por router vendido? de hacerlo asi debería ser bastante mas caro que el router actual, porque no hay mas que echar un vistazo a cualquier router con bittorrent para ver lo caros que son y si le incluyen disco duro (lo logico si trae un cliente torrent) seria muy caro. Venderlo subvencionado no tiene sentido porque nunca dejarian de perder dinero, de otra manera sería muy caro y creo que tendrian pocas ventas, que harán? la estrategia de subvencionar foneras era para llamar la atención y aumentar rápidamente la comunidad? entonces ya no volveran a subvencionar productos no, porque la comunidad fon es relativamente grande?

Cuál es el modelo de negocio de Fon a partir de ahora, ganar dinero con los aliens y con los routers vendidos? o va a seguir regalando routers con la inversion de sus socios? o quizás mediante publicidad como comentaba hace poco en propio Martín. No sé, pero hoy por hoy Fon no creo que produzca mucho dinero.

Aclaración: no estoy en contra Fon ni nada por el estilo, es mas me gusta mucho la idea y me gustaría que saliera adelante. Pero hoy escribiendo el pequeño post que se me habia ocurrido sobre los routers Fon, me he puesto a pensar y el modelo de negocio de Fon lo veo un poco difuso.

Cuál es vuestra opinión?