E' possibile caricare nella Fonera un firmware alternativo (a quello FON) utilizzando RedBoot, il bootloader che avvia il sistema.
RedBoot può essere usato sia via seriale che tramite telnet. Normalmente l'accesso telnet è disabilitato1), quindi per attivarlo in ogni caso occorre un adattatore seriale almeno per la prima una volta.
In verità ci sarebbe un modo per non usare affatto la seriale ma il solo accesso SSH, come spiegato sul wiki di dd-wrt. Tuttavia ritengo che sia un po' rischioso (in ogni caso al massimo se inchiodate la Fonera vi costruire l'adattatore seriale ed amen…)
![]()
![]()
Attenzione: OpenWrt Kamikaze è ad uno stadio di sviluppo da addetti ai lavori, in particolare l'interfaccia di configurazione web al momento è inutilizzabile; dd-wrt, invece funziona perfettamente!
Vedere la sezione Collegare la seriale alla Fonera.
In ogni caso prima alimentare la Fonera e dopo almeno 3-4 secondi collegare la seriale, in caso contrario la Fonera potrebbe non partire affatto.
Tenete conto che RedBoot (il bootloader) ed il firmware potrebbero usare due velocità diverse per la seriale; mentre RedBoot usa per default una velocità di 9600, dd-wrt usa 115200: quindi se ad un tratto non vedete più nulla o vedete solo simboli strani, è segno che la velocità di connessione è sbagliata.
All'accezione viene inviato sulla seriale quanto segue:
+PHY ID is 00xx:xxxx Ethernet eth0: MAC address 00:18:xx:xx:xx:xx IP: 192.168.1.60/255.255.255.0, Gateway: 0.0.0.0 Default server: 192.168.1.3 RedBoot(tm) bootstrap and debug environment [ROMRAM] Non-certified release, version v1.3.0 - built 16:57:58, Aug 7 2006 Copyright (C) 2000, 2001, 2002, 2003, 2004 Red Hat, Inc. Board: ap51 RAM: 0x80000000-0x81000000, [0x80040450-0x80fe1000] available FLASH: 0xa8000000 - 0xa87f0000, 128 blocks of 0x00010000 bytes each. == Executing boot script in 6.000 seconds - enter ^C to abort
Controindicazioni: durante le operazioni di riprogrammazione della flash, che durano in totale una trentina di minuti, potreste non avere feedback dell'avanzamento dell'operazione, cosa che invece con la seriale avrete sempre.
Al prompt di RedBoot digitare il comando fconfig:
RedBoot> fconfig
Verranno chiesti a questo punto i vari parametri di configurazione:
Run script at boot: true Boot script: .. fis load -l vmlinux.bin.l7 .. exec Enter script, terminate with empty line >> fis load -l vmlinux.bin.l7 >> exec >> Boot script timeout (1000ms resolution): 10 Use BOOTP for network configuration: false Gateway IP address: Local IP address: 192.168.1.1 Local IP address mask: 255.255.255.0 Default server IP address: 192.168.1.2 Console baud rate: 9600 GDB connection port: 9000 Force console for special debug messages: false Network debug at boot time: false Update RedBoot non-volatile configuration - continue (y/n)? y ... Erase from 0xa87e0000-0xa87f0000: . ... Program from 0x80ff0000-0x81000000 at 0xa87e0000: . RedBoot>
Alla richiesta 'Enter script, terminate with empty line', per DD-WRT v23 o v24 beta scrivete le due righe seguenti, seguite da una riga vuota:
fis load -l vmlinux.bin.l7 exec
Per DD-WRT v24 final invece scrivete le due righe seguenti:
fis load -l linux exec
Come timeout impostate una decina di secondi (il default è 1)
Al posto di 192.168.1.1 e 192.168.1.2, se necessario, sostituite rispettivamente l'IP da assegnare alla Fonera durante il BOOT e l'IP del server TFTP di default; non dimenticate di impostare la netmask a 255.255.255.0.
In questo modo al riavvio RedBoot attenderà sulla porta 9000 (a meno che non scegliate di cambiarla) per 10 secondi prima di effettuare il boot del sistema operativo. Per fermare il boot è necessario inviare il carattere ^C2).
Alcuni programmi di telnet non sono in grado di inviare il carattere ^C3) così come lo va trovando RedBoot; in tal caso sotto Windows provate con Putty.
Sotto Linux provare la sequenza di comandi:
echo -e '\0377\0364\0377\0375\0006' > break nc -vvv 192.168.1.254 9000 < break ; telnet 192.168.1.254 9000
nc invierà la sequenza corretta che fermerà RedBoot. Dopo aver eseguito la seconda riga premete ^C per ammazzare nc, in questo modo verrà eseguito telnet: non vi resta ora che premete invio per far uscire il prompt di RedBoot.
Esiste un sistema per attivare il telnet senza usare la serale, per ilq uale occorre il solo accesso SSH.
In effetti dopo aver attivato l'accesso SSH si deve effettuare il flash con un kernel modificato. Tale kernel permette di modificare la configurazione di RedBoot (normalmente impossibile se non da RedBoot stesso), in modo tale da attivare l'accesso Telnet.
Trovate le istruzioni sul wiki di dd-wrt (in inglese) su come attivare l'accesso telnet a RedBoot senza usare il cavo seriale, ma il solo hack SSH.
Inoltre sul wiki di ninux.org c'è una guida completa sul flashing della Fonera (in italiano).
Mirror locale Kernel CAMICIA: openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma
Mirror locale settings RedBoot: out.hex
Il firmware può essere scaricato sulla Fonera tramite un server HTTP, un server TFTP oppure direttamente via seriale col protocollo XModem.
Il metodo XModem è da escludere a priori, perché già l'operazione di flashing è molto lenta: se ci aggiungiamo la lentezza della seriale stiamo apposto. Il metodo HTTP è comodo solo se avete già a disposizione un server HTTP, altrimenti il TFTP è molto più semplice.
Come server TFTP in In Windows è possibile usare tftpd32, mentre in molte distribuzioni Linux tftpd è spesso già installato, anche se inattivo.
La configurazione di tftpd32 è molto semplice:
Nella cartella tftproot si devono mettere i file del firmware.
Con DD-WRT v23 e v24 beta sono due: il kernel Linux e l'immagine del filesyste, vmlinux.bin.l7 e root.fs. In tal caso l'immagine del filesystem va caricata nella “partizione” rootfs mentre il kernel nella partizione vmlinux.bin.l7.
Con DD-WRT v24 final il file del firmware è unico e si chiama linux.bin. In tal caso il file va caricato nella “partizione” unica chiamata linux.
I comandi da eseguire per caricare il nuovo firmware sono sempre gli stessi, tuttavia possono cambiare leggermente alcuni parametri. Per dd-wrt v23 e v24 beta ad esempio i comandi suggeriti sono:
fis init load -r -v -b 0x80041000 root.fs fis create -b 0x80041000 -f 0xA8030000 -l 0x002C0000 -e 0x00000000 rootfs load -r -v -b 0x80041000 vmlinux.bin.l7 fis create -r 0x80041000 -e 0x80041000 vmlinux.bin.l7 fis create -f 0xA83D0000 -l 0x00010000 -n nvram
Per DD-WRT v24 final:
fis init -f load -r -v -b 0x80041000 linux.bin fis create linux
NOTA: se usate il protocollo HTTP ai 2 comandi 'load' aggiungere il parametro '-m HTTP'; invece per il metodo XModem al posto del nome del file mettete il parametro '-m xmodem': appena avviate un load verrà stampato il carattere 'C' e dovrete inviare il file col protocollo xmodem.
NOTA 2: quando si installa il firmware su un apparecchio già utilizzato con versioni precedente è opportuno cancellare prima tutta la flash, per fare questo aggiungere il parametro -f utilizzando il comando fis init -f. Per fare un esempio: installando DD-WRT v.24 finale su una flash dove vi era una precedente release il sistema non funzionava bene. Ciò perché quando si caricano i dati sulla flash viene sovrascritto il contenuto precedente fino alla fine del codice, il resto rimane come prima. DD-WRT registra le impostazioni proprio nella parte finale libera della flash, installando la nuova versione rimangono le vecchie impostazioni e non essendo compatibili incasinano tutto il sistema. Utilizzando fis init -f oltre a inizializzare la flash se ne cancella il contenuto (tranne la parte che contiene il boot) e tutto funziona regolarmente.
I comandi danno luogo al seguente output:
RedBoot> fis init About to initialize [format] FLASH image system - continue (y/n)? y *** Initialize FLASH Image System ... Erase from 0xa83e0000-0xa83f0000: . ... Program from 0x80ff0000-0x81000000 at 0xa83e0000: . load -r -v -b 0x80041000 root.fs Using default protocol (TFTP) Raw file loaded 0x80041000-0x802e3fff, assumed entry at 0x80041000 RedBoot> fis create -b 0x80041000 -f 0xA8030000 -l 0x002C0000 -e 0x00000000 rootfs ... Erase from 0xa8030000-0xa82f0000: ............................................ ... Program from 0x80041000-0x80301000 at 0xa8030000: ............................................ ... Erase from 0xa83e0000-0xa83f0000: . ... Program from 0x80ff0000-0x81000000 at 0xa83e0000: . RedBoot> load -r -v -b 0x80041000 vmlinux.bin.l7 Using default protocol (TFTP) Raw file loaded 0x80041000-0x80120fff, assumed entry at 0x80041000 RedBoot> fis create -r 0x80041000 -e 0x80041000 vmlinux.bin.l7 ... Erase from 0xa82f0000-0xa83d0000: .............. ... Program from 0x80041000-0x80121000 at 0xa82f0000: .............. ... Erase from 0xa83e0000-0xa83f0000: . ... Program from 0x80ff0000-0x81000000 at 0xa83e0000: . RedBoot> fis create -f 0xA83D0000 -l 0x00010000 -n nvram ... Erase from 0xa83e0000-0xa83f0000: . ... Program from 0x80ff0000-0x81000000 at 0xa83e0000: . RedBoot> reset
Occhio che ogni comando create impiega fino a 15-20 minuti per essere completato (curioso, perché alla fine si tratta di scrivere un file di 3 o 6 mega). Se siete collegati in telnet disabilitate ogni funzione di standby perché se cade la connessione non so proprio come si comporta RedBoot mentre sta scrivendo il firmware
Per OpenWrt invece i file generalmente si chiamano 'openwrt-atheros-2.6-vmlinux.lzma' e 'openwrt-atheros-2.6-root.jffs2-64k'.
Caricamento del kernel in memoria:
lo -r -b %{FREEMEMLO} openwrt-atheros-2.6-vmlinux.lzma
che da luogo al seguente output:
Using default protocol (TFTP) Raw file loaded 0x80040800-0x800f07ff, assumed entry at 0x80040800
Scrittura del kernel nella flash:
fi cr -e 0x80041000 -r 0x80041000 vmlinux.bin.l7
che da luogo al seguente output:
... Erase from 0xa8030000-0xa80e0000: ........... ... Program from 0x80040800-0x800f0800 at 0xa8030000: ........... ... Erase from 0xa87e0000-0xa87f0000: . ... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
Caricamento del filesystem in memoria:
lo -r -b %{FREEMEMLO} openwrt-atheros-2.6-root.squashfs
Lettura della memoria rimasta libera:
fis free
che da luogo al seguente output:
0xA80E0000 .. 0xA87E0000
Adesso con un po' di matematica in esadecimale: A87E0000 - A80E0000 = 00700000
Scrittura del filesystemnella flash, sostiuire 0xCHANGEME col valore ottenuto sopra (nel nostro caso 00700000):
fi cr -l 0xCHANGEME rootfs
che da luogo al seguente output:
... Erase from 0xa80e0000-0xa87e0000: ................................................................................................................ ... Program from 0x80040800-0x80160800 at 0xa80e0000: .................. ... Erase from 0xa87e0000-0xa87f0000: . ... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
Per quanto riguarda dd-wrt ci sono delle build specifiche per la Fonera, ormai giunte alla release stabile v24:
dd-wrt v24 Fonera
Per OpenWrt Kamikaze non ci sono ancora build ufficiali, secondo loro ogniuno dovrebbe compilare il fimrware per conto proprio. Non è un'operazione complicatissima, perché fondamentalmente è tutto automatizzato. Solo che occorre avere una macchina Linux/Unix (cygwin al momento non è supportato) e molta pazienza perché potrebbe impiegare ore per scaricare e compilare il tutto. Per i dettagli vedere il sito OpenWrt.
Una build non ufficiale di OpenWrt, si trova qui:
Filesystem, Kernel, Packages
Come lettura interessante segnaliamo il tutorial su Ninux.org: La Fonera dalla scatola a OpenWrt.