Acceso al RedBoot
Todas las Foneras vienen con el gestor de arranque RedBoot, que además se encarga del particionado de la flash y desde donde se puede flashear la memoria interna. El acceso al gestor se puede realizar o por puerto serie, o por red, siendo este último sistema el más como y es el que se va a comentar.
En los primeros modelos el acceso por red estaba capado por lo que era necesario acceder por puerto serie o utilizar algún fallo de seguridad para poder habilitarlo. Pero desde hace ya bastante tiempo todas vienen con el acceso por red totalmente funcional.
Preparacion de la fonera
Lo primero es conectar la fonera a la red, o directamente a un PC. Es indiferente que los cables sean cruzados o no, y en las Foneras con dos puertos se puede usar cualquiera de ellos.
Con lo que sí hay que tener cuidado es que la IP que utiliza para arrancar es la 192.168.1.1 que puede interferir con algún otro equipo que esté haciendo de puerta de enlace. Una posibilidad es una vez accedido al RedBoot cambiar esta IP por la 192.168.1.254 de forma que en el futuro no moleste al arrancar.
Preparacion del PC
TFTP
Desde el PC se necesita un servidor de tftp para transferir las imágenes a flashear. Desde Debian:
$ sudo aptitude install tftpd
$ sudo mkdir /srv/tftp
$ sudo chmod 1777 /srv/tftp # Permisos al estilo /tmp
Por si no estaba arrancado el demonio de inetd (si no se usa para otro servicio) lo lanzamos:
$ sudo /etc/init.d/openbsd-inetd restart
A la hora de descargar las imágenes de OpenWrt hay que tener en cuenta que la Fonera + y la 2.0 necesitan una versión moderna.
Kamikaze 7.09, es la última estable: Solo soporta fonera 1.x
http://downloads.openwrt.org/kamikaze/7.09/atheros-2.6/openwrt-atheros-2.6-vmlinux.lzma
http://downloads.openwrt.org/kamikaze/7.09/atheros-2.6/openwrt-atheros-2.6-root.squashfs
Kamikaze 8.09 RC1, es la preeliminar: Soporta todas #4213
http://downloads.openwrt.org/kamikaze/8.09_RC1/atheros/openwrt-atheros-vmlinux.lzma
http://downloads.openwrt.org/kamikaze/8.09_RC1/atheros/openwrt-atheros-root.squashfs
Snapshot: Soporta todas
http://downloads.openwrt.org/snapshots/atheros/openwrt-atheros-vmlinux.lzma
http://downloads.openwrt.org/snapshots/atheros/openwrt-atheros-root.squashfs
Yo estoy utilizando los snapshots hasta que salga la 8.09 definitiva:
$ cd /srv/tftp
$ wget http://downloads.openwrt.org/snapshots/atheros/openwrt-atheros-vmlinux.lzma
$ wget http://downloads.openwrt.org/snapshots/atheros/openwrt-atheros-root.squashfs
ACTUALIZACION 20090416: Ya hace tiempo que ha salido la 8.09:
$ cd /srv/tftp
$ wget http://downloads.openwrt.org/kamikaze/8.09/atheros/openwrt-atheros-vmlinux.lzma
$ wget http://downloads.openwrt.org/kamikaze/8.09/atheros/openwrt-atheros-root.squashfs
ACTUALIZACION 20090607: Acaba de salir la 8.09.1:
$ cd /srv/tftp
$ wget http://downloads.openwrt.org/kamikaze/8.09.1/atheros/openwrt-atheros-vmlinux.lzma
$ wget http://downloads.openwrt.org/kamikaze/8.09.1/atheros/openwrt-atheros-root.squashfs
Red
Para poder acceder al RedBoot de la fonera (192.168.1.1) es necesario tener una IP en la red 192.168.1.0/24, por lo que habrá que buscar alguna libre y añadirla:
$ sudo ip add add 192.168.1.2/24 dev eth0
Telnet
Para acceder al RedBoot hay que hacerlo en cuanto se enciende, teniendo en los últimos modelos solo un margen de 2 segundos. Para facilitar la tarea se puede utilizar arping:
$ sudo aptitude install iputils-arping
Además hay que configurar telnet para que pase a modo linea y permita enviar Ctrl+C:
$ echo -e "192.168.1.1\n\tmode line" >> ~/.telnetrc # Si no se había configurado antes
o si se le ha cambiado la IP al redboot, cambiarla por la que sea.
Conexión
Con todo esto preparado, desde el PC, lanzamos el comando:
$ arping -qf 192.168.1.1; sleep 1; telnet 192.168.1.1 9000
y enchufamos la alimentación a la Fonera, y en cuanto se conecte el telnet pulsamos Ctrl+C:
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
== Executing boot script in 0.210 seconds - enter ^C to abort
^C
RedBoot>
lo normal es que a la primera no salga y haya que probar varias veces.
Flasheo
Una vez que se ha accedido al RedBoot pasamos a flashear.
Primero configuramos el acceso al servidor tftp (la IP tiene que cambiarse a la del PC):
RedBoot> ip_address -h 192.168.1.2
IP: 192.168.1.1/255.255.255.0, Gateway: 0.0.0.0
Default server: 192.168.1.2
y comprobamos que hay comunicación:
RedBoot> ping -h 192.168.1.2
Network PING - from 192.168.1.1 to 192.168.1.2
PING - received 10 of 10 expected
Reinciamos las particiones de la flash (10s):
RedBoot> fis init
About to initialize [format] FLASH image system - continue (y/n)? y
*** Initialize FLASH Image System
... Erase from 0xa87e0000-0xa87f0000: .
... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
Y cargamos el kernel desde el PC a memoria usando TFTP (según la version de OpenWrt que se use el nombre del archivo puede ser distinto):
RedBoot> load -r -b %{FREEMEMLO} openwrt-atheros-vmlinux.lzma
Using default protocol (TFTP)
Raw file loaded 0x80040400-0x801003ff, assumed entry at 0x80040400
Y lo flasheamos (2m-5m):
RedBoot> fis create -e 0x80041000 -r 0x80041000 vmlinux.bin.l7
... Erase from 0xa8030000-0xa80f0000: ............
... Program from 0x80040400-0x80100400 at 0xa8030000: ............
... Erase from 0xa87e0000-0xa87f0000: .
... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
Cargamos la imagen del sistema de archivos (nombre dependiente de la versión de OpenWrt):
RedBoot> load -r -b %{FREEMEMLO} openwrt-atheros-root.squashfs
Using default protocol (TFTP)
Raw file loaded 0x80040400-0x801c03ff, assumed entry at 0x80040400
Pero antes de flashearla necesitamos saber el espacio libre que queda en la flash:
RedBoot> fis free
0xA80F0000 .. 0xA87E0000
con lo que lanzamos desde el PC la línea:
$ echo -n "fis free? "; read FF; echo -n "0x"; echo "obase=16;ibase=16;-$FF" | sed -e "s/0x//g;s/\.\./+/" | bc
fis free? 0xA80F0000 .. 0xA87E0000
0x6F0000
e introducimos el resultado del fis free. Y el número resultante es la memoria libre.
Y ahora lo flasheamos, con el tamaño de la memoria libre obtenido anteriormente (4m-11m):
RedBoot> fis create -l !!!MEMORIALIBRE!!! rootfs
... Erase from 0xa80f0000-0xa87e0000: ...............................................................................................................
... Program from 0x80040400-0x801c0400 at 0xa80f0000: ........................
... Erase from 0xa87e0000-0xa87f0000: .
... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
Por último en la Fonera+ y 2.0 han cambiando el script de arranque, por lo que habrá que modificarlo para que el sistema arranque bien. El que debería ser se ve con:
RedBoot> fconfig -l
Run script at boot: true
Boot script:
.. fis load -l vmlinux.bin.l7
.. exec
Boot script timeout (1000ms resolution): 2
Use BOOTP for network configuration: false
Gateway IP address: 0.0.0.0
Local IP address: 192.168.1.1
Local IP address mask: 255.255.255.0
Default server IP address: 0.0.0.0
Console baud rate: 9600
GDB connection port: 9000
Force console for special debug messages: false
Network debug at boot time: false
si no es así habrá que modificarlo con:
RedBoot> fconfig boot_script_data
boot_script_data:
.. fis load loader
.. exec
Enter script, terminate with empty line
>> fis load -l vmlinux.bin.l7
>> exec
>>
Update RedBoot non-volatile configuration - continue (y/n)? y
... Erase from 0xa87e0000-0xa87f0000: .
... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
Y con esto ya está listo, solo queda resetear y cruzar los dedos:
RedBoot> reset
Acceso a OpenWrt
El accesso se realiza a través de la IP 192.168.1.1, primeramente por telnet. Hay que esperara un poco y en las Foneras con varios RJ-45 hay que conectar la red al puerto COMPUTER:
$ telnet 192.168.1.1
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
=== IMPORTANT ============================
Use 'passwd' to set your login password
this will disable telnet and enable SSH
------------------------------------------
BusyBox v1.11.2 (2008-10-24 04:41:51 PDT) built-in shell (ash)
Enter 'help' for a list of built-in commands.
_______ ________ __
| |.-----.-----.-----.| | | |.----.| |_
| - || _ | -__| || | | || _|| _|
|_______|| __|_____|__|__||________||__| |____|
|__| W I R E L E S S F R E E D O M
KAMIKAZE (bleeding edge, r13042) -------------------
* 10 oz Vodka Shake well with ice and strain
* 10 oz Triple sec mixture into 10 shot glasses.
* 10 oz lime juice Salute!
---------------------------------------------------
root@OpenWrt:/#
Tras lo que se le pone un password:
root@OpenWrt:/# passwd
Changing password for root
New password:
Retype password:
Password for root changed by root
root@OpenWrt:/# exit
y ya se puede entrar por ssh (después de esperar un rato, mientras crea las identidades):
david@davix:~$ ssh root@192.168.1.1
root@192.168.1.1's password:
BusyBox v1.11.2 (2008-10-24 04:41:51 PDT) built-in shell (ash)
Enter 'help' for a list of built-in commands.
_______ ________ __
| |.-----.-----.-----.| | | |.----.| |_
| - || _ | -__| || | | || _|| _|
|_______|| __|_____|__|__||________||__| |____|
|__| W I R E L E S S F R E E D O M
KAMIKAZE (bleeding edge, r13042) -------------------
* 10 oz Vodka Shake well with ice and strain
* 10 oz Triple sec mixture into 10 shot glasses.
* 10 oz lime juice Salute!
---------------------------------------------------
root@OpenWrt:~#
También puede resultar conveniente reconfigurar la IP que tiene el OpenWrt para lo cual hacemos:
root@OpenWrt:~# vi /etc/config/network
y configuramos los parámetros: ipaddr, gateway y dns del interfaz lan para poder acceder a Internet. Por ejemplo:
config interface lan
option type bridge
option ifname eth0
option proto static
option ipaddr 192.168.2.99
option netmask 255.255.255.0
option dns "80.58.61.250 80.58.61.254"
option gateway 192.168.2.1
Cuidado con fastidiarla aquí porque sin acceso hay que volver a flashear arrancar con el reset pulsado y ...
root@OpenWrt:~# /etc/init.d/network restart
Trasteando con el RedBoot
Además de los comandos utilizados para flashear existen otros interesantes. Basicamente RedBoot gestiona el particionado de la flash guardando para cada una: nombre, dirección en la flash, dirección para cargar en memoria y punto de entrada (estas dos últimas solo se usan en el fis load para el kernel). Se puede ver con el comando:
RedBoot> fis list
Name FLASH addr Mem addr Length Entry point
RedBoot 0xA8000000 0xA8000000 0x00030000 0x00000000
vmlinux.bin.l7 0xA8030000 0x80041000 0x000C0000 0x80041000
rootfs 0xA80F0000 0x80040400 0x006F0000 0x80040400
FIS directory 0xA87E0000 0xA87E0000 0x0000F000 0x00000000
RedBoot config 0xA87EF000 0xA87EF000 0x00001000 0x00000000
Se ve la primera partición que es la correspondiente al propio RedBoot, que se carga al encender la Fonera, también se ven las dos últimas en las que guarda la tabla de las partiones (que a su vez es lo que muestra fis list) y la partición de configuración del RedBoot.
Las otras dos particiones corresponden con el kernel y con el sistema de archivos. En el firmware original de Fon se incluye otra que es el espacio libre del sistema de archivos y que se monta superpuesto al original, de esta forma al pulsar el reset durante el arranque se borra esta partición y queda de fábrica. Con OpenWrt esto no está preparado para eso y lo que se hace es extender la partición del sistema de archivos a todos el espacio libre, por eso lo de las cuentas al flashear.
Los datos de configuración de RedBoot se pueden ver con:
RedBoot> fconfig -l
Run script at boot: true
Boot script:
.. fis load -l vmlinux.bin.l7
.. exec
Boot script timeout (1000ms resolution): 2
Use BOOTP for network configuration: false
Gateway IP address: 0.0.0.0
Local IP address: 192.168.1.1
Local IP address mask: 255.255.255.0
Default server IP address: 0.0.0.0
Console baud rate: 9600
GDB connection port: 9000
Force console for special debug messages: false
Network debug at boot time: false
Se puede ver el script de arranque, que consiste en cargar la particion del kernel en memoria y despues ejecutarlo. Si luego se ve el arranque del kernel es él el que una vez funcionando busca en la flash las particiones y carga la del sistema de archivos.
Tambien se puede ver otros parámetros como el tiempo de espera en el arranque, IP del RedBoot (cuidado con cambiarla que si no es accesible se pierde el acceso por red al RedBoot) y del servidor por defecto... Todos estos se pueden cambiar con el comando fconfig.
Desde el punto de vista hardward se puede ver:
RedBoot> version
RedBoot(tm) bootstrap and debug environment [ROMRAM]
OpenWrt certified release, version 1.1 - built 12:40:38, Sep 3 2007
Copyright (C) 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
Board: FON 2202
RAM: 0x80000000-0x82000000, [0x80040290-0x80fe1000] available
FLASH: 0xa8000000 - 0xa87f0000, 128 blocks of 0x00010000 bytes each.
que indica donde se tiene la memoria RAM y la FLASH. En este modelo, al ser una Fonera 2.0 se dispone de 32MB de RAM y los 8MB de flash, que la que tienen todas. Se puede ver que la memeria tiene partes ocupadas por el propio RedBoot, y que el espacio libre empieza en 0x80040290, que redondeando a 0x80041000 es el punto de entrada que se configuró en la imagen del kernel. Este último valor es el que está configurado en el alias %{FREEMEMLO}.
Si se quiere cambiar de forma fija la MAC se puede hacer con:
RedBoot> set -mac 00:18:84:ab:cd:ef
Chang Lan Mac address to : 00:18:84:ab:cd:ef
Chang Wlan Mac address to : 00:18:84:ab:cd:f0
se ve que para todos los puertos ethernet solo existe una MAC, lo cual puede ser problemático y la Wifi es la siguiente. También se puede cambiar el número de serie y una clave que no se que es.
Hay más comandos que se pueden consultar con "help" o mirando en la Guía de usuario de RedBoot.
Referencias: