viernes, julio 06, 2007

Reorganizando el disco duro

El portátil cuando lo compre venia con tres particiones ntfs, la primera 6.83GB, la segunda y la tercera de unos 52 GB cada una. La primera tiene los datos para hacer una recuperación, es decir, reinstalar windows vista y poner el ordenador como venía de fábrica, en la segunda es donde estaba instalado windows vista, y la tercera era para guardar datos.

Yo quería instalar linux en el portátil, ubuntu concretamente, pero no podía eliminar windows porque el ordenador en principio no era solo para mi, os cuento, una de las razones era para poder llevarlo a Badajoz, ya que por la muerte de mi tía, en Febrero tuvimos que ir allí, luego ibamos a hacer un segundo viaje, pero antes decidimos comprar un ordenador portátil para tenerlo allí, bueno no me enrollo mas, el caso es que el portátil no iba a ser yo el único que lo usara, así que no iba a borrar windows. De todas formas por si algun dia quería probar algo pues tampoco está demás tenerlo.

Lo que hice fue borrar la tercera partición, con lo que tenía 50GB para instalar ubuntu, en ese espacio hice dos particiones primarias, de 36.50GB y de 15.80GB respectivamente, ambas con el sistema de archivos ext3. La primera de ellas era para ubuntu y la segunda tanto para guardar datos cuando la de ubuntu se me quedara corta, como para instalar otra distro si me diera por probar alguna o me interesara también tener otra. La partición de ubuntu era una extendida, y dentro de ella hice una de 6GB (/), una de 30GB (/home) y una swap de 500MB, aunque realmente la swap teniendo 2GB de ram nunca se ha usado, pero bueno por si acaso. En la ultima partición, la de 15 GB, al final opté por instalar wifislax, una distro para hacking wifi.

Hace poco, cuando los 30GB del /home se me estaban quedando cortos, pensé que dejar 50 GB para windows vista era exagerado, así que fui a reducir la partición pensando en dejarle unos 15 o 20 gb, pero cuando fui a hacerlo veo que esa particion de 50 GB, con windows vista y el software por defecto de acer, tenía ocupados nada mas y nada menos que 20GB, WTF!!!, al final opté por dejarle 30GB. Así que la situación del disco duro cambió, ahora estaba (y está) así:

-Partición 1: 6.83 GB
-Partición 2: 32.95 GB
-Espacio sin particionar: 19.70 GB
-Partición 3 (extendida):
-Partición 5: 6.00 GB
-Partición 6: 30.01 GB
-Partición 7: 509.84 MB
-Partición 4: 15.80 GB

Y como ya tengo /home al 100% y la partición cuatro, la estoy llenando también pues he pensado que debería "mover" todo y dejar los 20 GB al final y poder hacer la particion 4 mas grande (20+15), así tendré mas espacio útil. Hay varias formas de hacerlo:

-Borrar y hacer todo de nuevo (reinstalar ubuntu, backups...).
-Mover las particiones si es que es posible.
-Hacer una imagen de la partición 3 y borrarla junto con la 4, luego hacer las mismas particiones pero antes, es decir justo después de la partición 2. Restauraría las imágenes de la partición 3, y todo el espacio libre que quedara sería la partición 4.

Voy a optar por la opción, porque yo en ubuntu tengo muchos paquetes instalados y no quiero tener que instalar todo de nuevo, simplemente creo una imagen de la partición y luego la restuaro, pero claro esto trae consigo un problema, dónde guardo la imagen, la solución se me vino a la cabeza enseguida, enviarla según se va creando a mi server y que la guarde en mi flamante disco duro de 320 GB. Todo parece estar bien planeado así que ayer por la tarde me dispuse a hacerlo, para aligerar la tarea conecté la laptop al router con un cable ethernet, porque haciéndolo por wifi es mas lento. Luego ejecuté en mi server:

nc -l -p 9999 >particion.img

Donde 9999 es el puerto por el que va a recibir los datos y particion.img el nombre de archivo donde va a guardar los datos. En la laptop ejecuté esto:

dd if=/dev/sda6 | nc debian 9999

Donde /dev/sda6 es la partición a clonar y debian 9999 son, respectivamente, el host y el puerto a donde se enviaran los datos. El procedimiento es el siguiente, el servidor escucha en el puerto 9999 y lo que reciba en ese puerto lo redirecciona y lo guarda en el archivo particion.img, luego desde el pc cliente (el portátil en mi caso) obtiene bit a bit los datos guardados en el archivo /dev/sda6, que es un archivo especial que representa a la partición 6 del primer disco, entonces se conecta al puerto 9999 de la maquina conocida como debian (es el hostname de mi server) y le envía los datos. Fácil no?

Pues no, no es fácil, porque no se muy bien porque, pero mi router no tragó bien los 30 GB que quise pasar por él, se cortaba muy de vez en cuando y al poco continuaba enviando, y eso la verdad para mi no fue muy buena señal, así que opté por desmontar el disco duro de 320 GB de mi server y externalizarlo usando la caja de mi disco duro externo de 250 GB, hecho esto realize el mismo procedimiento, solo que en vez de enviarlo por la red lo guarde en el disco duro usb:

dd if=/dev/sda6 of=/media/disk/particion.img

Después calculé el md5sum de ambas imágenes, la que hice en local y la que envié por red, fueron resultados diferentes, por lo tanto son archivos distintos, ergo uno o dos están mal, así que tampoco me fié de esta última imagen. Hoy voy a hacer otra imagen de la misma partición y si el md5sum es el mismo que el de alguna de las otras imágenes la tomaré por buena. En caso contrario seguiré hasta que haya dos con el mismo md5sum, ya que no quiero arriesgarme a perder algunos de mis datos. Bueno eso para el /home. Luego tengo que hacer lo mismo con la partición /. La swap obviamente no voy a clonarla y la partición 4 no me interesa clonarla tampoco, ya que simplemente tiene una wifislax y algunos datos que quiero, esos datos los copiaré y el resto lo borro.

Ese es el plan para hoy, así que voy a ponerme a trabajar ahora mismo, a ver si consigo ganar los 19 GB que hay ahí perdidos.

miércoles, julio 04, 2007

Cable para la fonera

Bueno, primero disculpas por no postear estos últimos días, pero como sabéis me cargue la fonera, la deje totalmente cerrada, sin conexión a la red, la única forma de arreglarla era con el cable serie, y el lunes fui a comprar el circuito o en su defecto los componentes para montarlo yo mismo. Tuve que comprar lo segundo y he estado desde entonces intentando hacerlo funcionar... no lo he conseguido.

Si, eso es lo que ha pasado, compre todos los componentes y he intentado hacerlo siguiendo este esquema:





No he podido hacerlo funcionar, lo he hecho de todas las formas posibles, lo he montando y vuelto a montar montones de veces, revisado cada conexión, cada detalle... no ha habido manera, así que tras dos días intentándolo he tomado una decisión, comprar el circuito ya hecho, así que me he ido a ebay y por unos 10$ (gastos de envío incluidos) lo he comprado, a ver cuando me llega. De todas formas quizás de aquí a que llegue me pongo con el circuito alguna vez mas y lo hago funcionar, pero de todas formas ya esta pedido.

Os dejo también con una foto que hice de mi circuito, aunque quiero señalar que falta un cable al puerto serie, porque se salió y le hice la foto sin volver a ponerlo. También quiero decir que en mis pruebas de esta mañana la conexión con la fonera estaba mejor que en la foto, con unos alicates lo ajuste bastante mas y yo creo que estaba bien. No os puedo poner una foto del ultimo montaje porque ya lo desmonté y lo guarde. Bueno la foto es ésta:



Pues nada mas, sólo decir que espero que el blog retome un ritmo mejor, pero es que estos días no he hecho nada que contar, pues como ya os he dicho he estado liado con la fonera.

lunes, julio 02, 2007

Test de adicción a los blogs

Via SigT encuentro un curioso test que mide tu adicción a los blogs, tan sólo son 14 preguntas, este es mi resultado:



Bueno otra cosa, ahora me acercaré a comprar el material para reparar mi fonera, ya os contaré que tal

domingo, julio 01, 2007

Fonera sin conexión

Hoy me he dado cuenta de que mi fonera no tenía conexión a internet, así que me he puesto a investigar que pasaba, empecé a probar configuraciones diferentes en el fichero /etc/config/network. Tras varias configuraciones, no recuerdo exactamente cuales, todas infructuosas, perdí el acceso a la fonera, ni ssh, ni pings, ni nada. Entonces intenté arreglarlo pulsando el botón reset de la fonera... no sirvió para nada, lo hice de todas las maneras posibles, dejándolo pulsado mas tiempo, menos tiempo, con la fonera apagada, con ella encendida... todo inútil.

Total que ahora mismo tengo un ladrillo inútil, pero tranquilos, con el famoso cable que entre otras cosas sirve para abrir el ssh, se puede arreglar, si con el consigo una shell del sistema lo arreglo y ya está, si no, reflasheo y sin mas problemas y en el hipotético caso de que no sea capaz de hacer funcionar bien la fonera con openwrt, le pondría dd-wrt y ya está.

Mañana mismo me acercaré a una tienda de electrónica y espero que me vendan el circuito adecuado, si no compraré los componentes e intentaré montarlo yo mismo, si los astros de alinean para que todo esto salga mal, entonces lo comprare por internet o en ebay o en alguna tienda especializada.

[EDIT]

Lo sorprendente es que hasta ahora no habia podido conectarme a la red wifi creada por la fonera, sin embargo ahora he podido hacerlo y tengo acceso a toda mi red, y a internet. Si recuerdo que la configuración que le deje especificaba gateway, dns, ip y netmask. Que yo sepa la ip que le deje era 192.168.0.5 pero esa ip no responde a nada. Bueno el caso es que la fonera esta viva o al menos eso parece.

De todas formas no deja ningun rastro, ni snifando el trafico veo nada de ella, tampoco aparece nada en un traceroute... es invisible, sin embargo puedo asegurar que no estoy conectado a la red wifi de mi router, estoy conectado a la red wifi de mi fonera, red con essid OpenWrt.

En fin, esperare a comprar mañana el cable y a ver que pasa...

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.