Howtos: Entwicklung
- Entpacken und Packen von Firmware-Images
- Patches in Freetz einspielen
- Example 3: NZBGet
- Example 2: par2cmdline
- Example 1: Httptunnel
- Ablauf eines Firmware-Updates
- Eigene Programme kompilieren
- Dynamische Bandbreitenanzeige per SVG
- Platz sparen im Dateisystem der FritzBox
- Flash-Partitionen im laufenden Betrieb sichern
- Release Management
- First steps - How to start your first freetz package
- Kernel konfigurieren und kompilieren
- Menükonfiguration pflegen
- ADAM2-Bootloader
- Einstellungen speichern im Urlader-Environment
- Busybox konfigurieren und kompilieren
- Wie baue ich ein eigenes Paket für Freetz?
- Firmware-Image-Namen analysieren und interpretieren
- Developer Information
- Addon Paket installieren
- Paketverwaltung für Freetz
- Wie die FritzBox Manipulationen erkennt
- Shell Coding Conventions
- Package Development
- Erstellen einer GUI für Pakete in Freetz
- Flash Partitionierung
- Trac Hooks
- Package Developing - Advanced Topics
- Eigene Dateien in die Firmware integrieren
- Freetz Build-Prozeß
- Flash-Partitionen von außen mit FTP sichern
- libmodcgi.sh
- Cross-Compiler / Toolchain erstellen
- Eigene Download-Toolchain erstellen
- Target/Native-Compiler-Toolchain erstellen
Ablauf eines Firmware-Updates
Bei einem Firmware-Update über das AVM-Web-Interface passiert in etwa Folgendes (kein Anspruch auf Vollständigkeit):
- Die Steuerung des gesamten Vorgangs übernimmt das Binary /usr/www/cgi-bin/firmwarecfg. Es wird vom Webserver aufgerufen.
- firmwarecfg ruft zunächst das Shell-Skript /bin/prepare_fwupgrade auf, um diverse Dienste zu stoppen und somit Platz im RAM für das Firmware-Archiv zu schaffen. Auch Spuren von evtl. früheren Updates in der RAM-Disk (/var) werden gelöscht. prepare_fwupgrade wird entweder mit dem Parameter start oder mit start_from_internet aufgerufen, je nachdem, ob ein Update von der AVM-Seite geladen werden soll oder von Festplatte. Der Unterschied besteht v.a. darin, daß der DSL-Daemon dsld im zweiten Fall zunächst nicht gestoppt wird.
- Nachdem nun ein Großteil der Aktivitäten der FritzBox stillgelegt ist, wird das Firmware-Image in die RAM-Disk übertragen und dort mittels tar entpackt. Dabei wird die digitale Signatur des Pakets geprüft. Falls sie nicht korrekt verifiziert werden kann oder fehlt, wird später die bekannte Meldung über eine nicht freigegebene Firmware im Web-Interface angezeigt. Zunächst wird der Benutzer des Web-Interfaces via Rückmeldung von firmwarecfg aber einfach nur gefragt, ob er trotzdem die Firmware installieren möchte. Nehmen wir an, er bejaht das.
- Die wichtigsten Dateien des entpackten Firmware-Archivs liegen nun unter
- /var/install
- /var/tmp/kernel.image
- /var/tmp/filesystem.image
- Die letzten beiden Dateien liegen nur vor, wenn es sich um ein "echtes" Update und nicht um ein Pseudo-Update, z.B. zum Aktivieren von Telnet oder zur Installation einer Software wie dem LCR Updater handelt. filesystem.image hat in vielen Fällen die Länge null, weil in kernel.image alle benötigten Daten fürs Flashen enthalten sind.
- Ein zweites Mal wird /bin/prepare_fwupgrade aufgerufen, dieses Mal mit dem Parameter end. Jetzt werden endgültig die verbleibenden Dienste gestoppt, die noch während des Updates stören könnten, indem sie z.B. auf den Flash-Speicher zugreifen.
- Jetzt wird das mit dem Firmware-Image entpackte Shell-Skript /var/install aufgerufen. Darin passiert eine ganze Menge, z.B.:
- Es werden diverse Prüfungen durchgeführt, die bestimmen, auf welchem Stand die Box momentan ist, wie der Flash-Bereich partitioniert ist und was zu tun ist in Vorbereitung aufs Update. Je nachdem, was das Skript herausfindet über die Situation, gibt es am Ende einen der folgenden Werte zurück:
- INSTALL_SUCCESS_NO_REBOOT (0) - alles okay, Neustart der Box nicht erforderlich. Dieser Wert sollte nur zurückgegeben werden, wenn an Dateisystem und Kernel im Flash nichts geändert wird.
- INSTALL_SUCCESS_REBOOT = 1 - der Standardwert bei "richtigen" Firmware-Updates. Alles okay, Box neu starten.
- INSTALL_WRONG_HARDWARE = 2 - Installation zurückweisen, weil etwas an der Hardware nicht zum Firmware-Image paßt (Problem mit dem Annex, falscher OEM).
- INSTALL_KERNEL_CHECKSUM = 3 - fehlerhafte Kernel-Checksumme. Falls die beiden Image-Dateien (Kernel und Filesystem) existieren, werden ihre CRC-Checksummen durch Aufruf des ebenfalls in AVM-Paketen enthaltenen /var/chksum geprüft. Sind die Checksummen - nicht Verwechseln mit der o.g. Signatur - nicht in Ordnung, findet kein Update statt.
- INSTALL_FILESYSTEM_CHECKSUM = 4 - siehe voriger Punkt.
- INSTALL_URLADER_CHECKSUM = 5 - würde bedeuten, dass der zu installierende neue Urlader eine falsche Checksumme hat. Meistens enthalten Firmware-Updates jedoch keinen neuen Urlader.
- INSTALL_OTHER_ERROR = 6 - sonstiger Fehler.
- INSTALL_FIRMWARE_VERSION = 7 - Problem mit der aktuellen Firmware-Version. Entweder kann die aktuelle Version aus irgendeinem Grund nicht festgestellt werden oder der Versionssprung ist zu groß, weil noch jemand eine Uralt-Version installiert hat und zunächst ein Zwischen-Update auf eine andere Version ebötigt, um anschließend die neue einspielen zu können.
- INSTALL_DOWNGRADE_NEEDED = 8 - es wird versucht, eine Firmware mit niedrigerer Versionsnummer zu installieren. Normalerweise blockieren aktuelle Firmwares das, weswegen man den Umweg über ein Recover bzw. einen manuellen Downgrade machen muss, um diese Hürde zu nehmen. (Man könnte auch einfach die Prüfung in diesem Skript auskommentieren.)
- Das Skript hat auch einen Schalter -f, welcher es dazu veranlaßt, eine beliebige Firmware-Versionsnummer zu akzeptieren und somit ggf. auch einen Downgrade durchzuführen. Allerdings lässt sich der Schalter übers Web-Interface meines Wissens nicht setzen. Vermutlich wird er von den AVM-Recovery-Tools benutzt. Verbunden mit dem Setzen dieses Schalters ist, dass das gerade besprochene Install-Skript auch die Einstellungen im Flash löscht und somit die Box auf die Werkseinstellungen zurücksetzt. Grundsätzlich könnte man Letzteres durch Auskommentieren im Skript verhindern, aber es macht oft genug Sinn, es so zu lassen. Ein Downgrade bedeutet nun einmal, dass evtl. vorhandene Einstellungen für Features einer neuen Firmware-Version von einer älteren nicht richtig interpretiert werden könnten und somit schlimmstenfalls die Box schon beim Starten hängen bleiben und endgültig zum Recover-Fall werden würde.
- Zum Schluß werden ggf. noch einige Spezialitäten abgehandelt, z.B. Entfernen veralteter Einstellungen oder Konvertierung alter Wahlregeln.
- Das Skript schreibt während des Ablaufs parallel auch noch ein weiteres Skript nach /var/post_install, welches anschließend über init reboot indirekt vom führenden Prozeß firmwarecfg aufgerufen wird, sofern nicht einer der Fehler-Rückgabewerte dies verhindert. post_install wiederum setzt für den Flash-Vorgang notwendige Umgebungsvariablen und lädt das im Firmware-Image enthaltene Modul /var/flash_update.o (Kernel 2.4) bzw. /var/flash_update.ko (Kernel 2.6).
- Übrigens gibt es auch standardmäßig ein /var/post_install, das beim Systemstart aus /var.tar extrahiert wird und vor jedem Reboot aufgerufen wird. Der Aufruf-Mechanismus über /etc/inittab ist der gleiche, der Inhalt des Skripts jedoch völlig anders als in der Spezialversion vor dem Flashen.
- Jetzt erfolgt der eigentliche Flash-Vorgang (falls notwendig).
Nach dem eventuellen Reboot hat man ggf. eine nagelneue Firmware auf der Box, andernfalls die gewünschte nachinstallierte Funktionalität. Was /var/install macht und welchen Return-Wert es liefert, ist grundsätzlich für jeden Firmware-Bastler frei entscheidbar. Die anderen Rahmenbedingungen sind so, wie ich es eben beschrieben habe.