Um die Fonera 2201 zu flashen, werden 2 Dinge benötigt:
Mittels des redboot-Perlskriptes wird die Redboot-Umgebung der Fonera geladen, in der eine Kommandozeile zur Verfügung steht. Via TFTP wird das Image auf die Fonera übertragen und kann dort als Betriebssystem eingerichtet werden.
Falls nicht geschehen, muss auf einem Server ein TFTP-Server eingerichtet werden. Im /tftpboot-Verzeichnis werden die Dateien
für den Zugriff durch die Fonera abgelegt.
Das Skript redboot.pl wird auf dem Server abgelegt. Wichtig ist, dass die Net::Telnet Bibliothek zur Verfügung steht. Auf Debian-Systemen kann sie unter
bash
aptitude install libnet-telnet-perl
nachinstalliert werden.
perl
#!/usr/bin/perl -w
# telnet_redboot.pl - ./upslug --reset;arping -f 192.168.0.1;telnet 192.168.0.1 9000
use Net::Telnet ();
my $host = $ARGV[0] or die "Syntax: $0 <host>\n";
system("while true; do fping -t200 $host && break; done");
my $t = new Net::Telnet (Port => 9000, Timeout => 30);
if(!defined($t)){
print "new Net::Telnet failed\n";
exit(1);
} # if
my $ok;
$ok = $t->errmode("return");
$ok = $t->open($host);
if(!defined($ok)){
print "open('$host') failed\n";
$t->close();
exit(1);
} # if
# == Executing boot script in 1.930 seconds - enter ^C to abort
my $line;
while($line = $t->getline()){
$line =~ s/[\r\n]//;
print "-> $line\n";
if($line =~ m/enter \^C to abort/){
$t->put(chr(3)); # send ^C
print "<- \^C\n";
$t->close();
sleep(1);
system("telnet $host 9000");
exit(0);
} # if
} # while
$t->close();
Für den Zugriff auf die Fonera muss auf dem Server eine Adresse im Netz 192.168.1.X eingerichtet werden. Die Fonera selbst ist unter der 192.168.1.1 erreichbar.
Durch die Definition eines virtuellen Interfaces ethX:1 kann eine entsprechende Adresse im Fonera-Netzwerk eingerichtet werden:
bash
ifconfig eth2:1 192.168.1.220/24
Es bleiben nur wenige Sekunden nach dem Einschalten der Fonera (Netzstecker!), um das redboot-Skript durchzuführen. Ist dies nicht geschehen, so bootet die Fonera mit dem installierten Betriebssystem wie gewohnt hoch.
Wurde alles richtig gemacht, so steht der Redboot-Prompt jetzt zur Verfügung:
root@server01:/tftpboot# ./redboot.pl 192.168.1.1 192.168.1.1 is alive -> == Executing boot script in 14.460 seconds - enter ^C to abort <- ^C Trying 192.168.1.1... Connected to 192.168.1.1. Escape character is '^]'. RedBoot>
Um das Image vom TFTP-Server beziehen zu können, muss der Fonera eine IP-Adresse zugewiesen werden:
RedBoot> ip_addr -h 192.168.1.220 -l 192.168.1.1/24 IP: 192.168.1.1/255.255.255.0, Gateway: 0.0.0.0 Default server: 192.168.1.220
Der begrenzte Flashspeicher muss für den Installationsvorgang initialisiert werden.
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: .
Zum Übertragen des Robin-Images, muss folgender Befehl abgesetzt werden:
RedBoot> lo -r -b %{FREEMEMLO} openwrt-atheros-vmlinux.lzma
Using default protocol (TFTP)
Raw file loaded 0x80040400-0x800f03ff, assumed entry at 0x80040400
Damit wird die Image-Datei in den lokalen Speicher übertragen.
Die Installation dauert einige Minuten, da die Imagedatei auf der Fonera lokal ausgerollt werden muss:
RedBoot> fi cr -e 0x80041000 -r 0x80041000 vmlinux.bin.l7 ... Erase from 0xa8030000-0xa80e0000: ........... ... Program from 0x80040400-0x800f0400 at 0xa8030000: ........... ... Erase from 0xa87e0000-0xa87f0000: . ... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
Mit fis free lässt sich der freie Speicherbereich der Fonera anzeigen.
RedBoot> fis free 0xA80E0000 .. 0xA87E0000
Angegeben wird die Start- und die Endadresse des freien Speicherbereichs. Die Differenz beider Werte ergibt den freien Speicherbereich und wird für die Einrichtung des Filesystems benötigt. Mit dem bc ist die Berechnung der Hexadezimalwerte möglich:
user@server01:~$ bc bc 1.06.94 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. obase=16 ibase=16 A87E0000-A80E0000 700000
Der Wert 700000 entspricht also dem freien Speicherbereich.
RedBoot> lo -r -b %{FREEMEMLO} openwrt-atheros-root.jffs2-64k
Using default protocol (TFTP)
Raw file loaded 0x80040400-0x804e03ff, assumed entry at 0x80040400
Mit dem berechneten Wert 700000 kann die rootfs-Partition angelegt werden:
RedBoot> fi cr -l 0x700000 rootfs ... Erase from 0xa80e0000-0xa87e0000: ................................................................................................................ ... Program from 0x80040400-0x804e0400 at 0xa80e0000: .......................................................................... ... Erase from 0xa87e0000-0xa87f0000: . ... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
Der Vorgang dauert mehrere Minuten.
Die Installation des neuen Images auf der Fonera ist abgeschlossen. Die Einstellungen müssen jedoch noch persistent gespeichert werden, um auch nach einem Reboot zur Verfügung zu stehen.
RedBoot> fconfig boot_script true boot_script: Setting to true RedBoot> fconfig boot_script_timeout 15 boot_script_timeout: Setting to 15 Update RedBoot non-volatile configuration - continue (y/n)? y ... Erase from 0xa87e0000-0xa87f0000: . ... Program from 0x80ff0000-0x81000000 at 0xa87e0000: . RedBoot> fconfig boot_script_data boot_script_data: .. fis load -b 0x80100000 loader .. go 0x80100000 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: .
RedBoot> fis list Name FLASH addr Mem addr Length Entry point RedBoot 0xA8000000 0xA8000000 0x00030000 0x00000000 vmlinux.bin.l7 0xA8030000 0x80041000 0x000B0000 0x80041000 rootfs 0xA80E0000 0x80040400 0x00700000 0x80040400 FIS directory 0xA87E0000 0xA87E0000 0x0000F000 0x00000000 RedBoot config 0xA87EF000 0xA87EF000 0x00001000 0x00000000
RedBoot> fconfig -l -n boot_script: true boot_script_data: .. fis load -l vmlinux.bin.l7 .. exec boot_script_timeout: 15 bootp: false bootp_my_gateway_ip: 0.0.0.0 bootp_my_ip: 192.168.1.1 bootp_my_ip_mask: 255.255.255.0 bootp_server_ip: 192.168.1.254 console_baud_rate: 9600 gdb_port: 9000 info_console_force: false net_debug: false
RedBoot> reset