Wiki:help/howtos/development/save_mtd_2

Howtos: Entwicklung

  1. Entpacken und Packen von Firmware-Images
    1. Tools und Syntax
    2. Vorgehensweise
    3. Verwendung von fwmod im "no freetz"-Modus
  2. Patches in Freetz einspielen
  3. Example 3: NZBGet
    1. Build manually
    2. Add package to Freetz
    3. Create new image with added package
    4. Testing
    5. Preparing New Package for Public Integration to Freetz Trunk
  4. Example 2: par2cmdline
    1. Build manually
    2. Add package to Freetz
    3. Create new image with added package
    4. Testing
    5. Preparing New Package for Public Integration to Freetz Trunk
  5. Example 1: Httptunnel
    1. Build manually
    2. Add package to Freetz
    3. Call Procedures "make menuconfig" and "make"
    4. Testing
    5. Preparing New Package for Public Integration to Freetz Trunk
    1. Signieren von Firmware
    2. Konkrete Anwendung in Freetz
  6. Ablauf eines Firmware-Updates
  7. Eigene Programme kompilieren
  8. Dynamische Bandbreitenanzeige per SVG
    1. Anleitung zur Test-Installation
  9. Platz sparen im Dateisystem der FritzBox
    1. Vorwort und Motivation
    2. Bestandsaufnahme: Wo stecken die Platzfresser?
    3. Weitere Spartricks
    4. Schlußwort
  10. Flash-Partitionen im laufenden Betrieb sichern
    1. Motivation
    2. Voraussetzungen
    3. Lösungsweg
    4. Wege, sich schnell einen Überblick zu verschaffen
    5. Zusammenfassung
  11. Release Management
    1. Subversion Repository
    2. Checklists
    3. GIT
    4. Downloads
    5. References
  12. First steps - How to start your first freetz package
    1. Info
    2. Build Environment
    3. File Structure
    4. Examples Binary Package
    5. Configuration Handling
    6. Examples Web-Interface
    7. Trouble shooting
  13. Kernel konfigurieren und kompilieren
  14. Menükonfiguration pflegen
    1. Einstieg
    2. Beispiel-Konfiguration für ein neues Paket
    3. Menuconfig-Warnungen beheben
    4. Erklärung und Anwendung der erweiterten MK-Targets
    5. Syntax-Fehler in MK-Dateien finden
    6. Syntax-Hervorhebung für MK-Dateien
  15. ADAM2-Bootloader
    1. Bootloader-Backup anlegen
    2. Bootloader überschreiben
    3. Bootloader-Befehle
    4. Bootloader-Quelltext
    5. Aufbau des Bootloaders
    6. Bootloader und Freetz
  16. Einstellungen speichern im Urlader-Environment
    1. Vorwort und Motivation
    2. Lösungsmöglichkeiten
    3. Bootloader Environment
    4. Variable "kernel_args"
    5. Kernel_Args-API
    6. Mögliche Anwendungsfälle
  17. Busybox konfigurieren und kompilieren
  18. Wie baue ich ein eigenes Paket für Freetz?
  19. Firmware-Image-Namen analysieren und interpretieren
    1. Einleitung
    2. Skript-Code
    3. Daten im Rohformat
    4. Ausgabe grundlegender Informationen
    5. Ausgabe erweiterter Informationen
    1. Web-interface HTTPTunnel
  20. Developer Information
  21. Addon Paket installieren
  22. Paketverwaltung für Freetz
    1. Erweiterung des Dateisystems
    2. Paketverwaltung
    3. Links
    4. Kommentare
  23. Wie die FritzBox Manipulationen erkennt
    1. Ursachen
    2. Diagnose
    3. Lösungen
    4. Schlußwort und Ausblick
  24. Shell Coding Conventions
    1. Shell Language
    2. Basic Format
    3. If, For, and While
    4. Test Built-in
    5. Single-line conditional statements
    6. Infinite Loops
    7. Exit Status and If/While Statements
    8. Variable References
    9. Variable Naming
    10. Quoting
    11. Variable Assignments
    12. Testing for (Non-)Empty Strings
    13. Commenting
    14. Pathnames
    15. Interpreter Magic
  25. Package Development
    1. Persistent Package Settings
  26. Erstellen einer GUI für Pakete in Freetz
    1. Motivation
    2. Grundlagen
    3. Wie funktioniert das mit der GUI?
  27. Flash Partitionierung
    1. Hidden SquashFS
    2. Contiguous SquashFS
    3. Hidden Root
    4. NAND Root
    5. Dateisystem
    6. Kernel
    7. Weblinks
  28. Trac Hooks
    1. trac-post-commit-hook
    2. trac-post-revprop-change-hook
  29. Package Developing - Advanced Topics
    1. Adding conditional patches
    2. Adding multi-binary packages
  30. Eigene Dateien in die Firmware integrieren
    1. Feste Integration über das Freetz Image
    2. Erzeugen der Dateien aus der debug.cfg
    3. Nachladen vom Webserver
    4. Nachladen vom USB-Stick
    5. WebDAV Share mounten
    6. NFS-Share mounten
  31. Freetz Build-Prozeß
    1. Vorwort und Motivation
    2. Grundsätzliches
  32. Flash-Partitionen von außen mit FTP sichern
    1. Motivation
    2. Voraussetzungen
    3. Allgemeine Informationen zur Datensicherung
    4. Sicherung mit Linux-Standard-FTP (ftp)
    5. Sicherung mit Linux-NcFTP (ncftpget)
    6. Sicherung mit Cygwin-NcFTP (ncftpget)
    7. Uploads via FTP
  33. libmodcgi.sh
    1. cgi
    2. cgi_begin
    3. cgi_end
    4. sec_begin
    5. sec_end
    6. html
    7. check, select
    8. href
    9. back_button
    10. sec_level
    11. stat_bar
    12. cgi_param
    13. cgi_error, print_error
    14. path_info
    15. valid
  34. Cross-Compiler / Toolchain erstellen
  35. Eigene Download-Toolchain erstellen
  36. Target/Native-Compiler-Toolchain erstellen
    1. Using the dev-tools package to install compiler and tools

Flash-Partitionen von außen mit FTP sichern

Dieser Artikel baut auf dem Artikel Flash-Partitionierung auf. Ihn vorher zu lesen, schadet also nicht. Mein herzlicher Dank für einige der Informationen zu diesem Artikel gebührt Enrik Berkhan, der sich hier immer vornehm zurückhält, aber sooo viel weiß. :-)

Motivation

Im verwandten Artikel Flash-Partitionen im laufenden Betrieb sichern habe ich erklärt, wie man direkt von der Konsole (SSH, Telnet, Rudi-Shell) auf der FritzBox aus über entsprechende Linux-Block- bzw. -Character-Devices Datensicherungen vornehmen kann. Das gleiche geht auch "von außen", also ohne Shell-Zugriff von der Box, indem man per FTP den Urlader - neudeutsch Bootloader - kontaktiert. Früher hieß der Urlader ADAM2, heute EVA bei den aktuellen Kernel-2.6-Firmwares (obwohl die Login-Daten immer noch wie früher sind, wie wir gleich sehen werden).

Diese Methode ist auch dann anwendbar, wenn die Box nicht mehr sauber hochfährt oder man kein Telnet auf der Box mit Original-Firmware hat bzw. man es nicht schafft, es zu aktivieren.

Voraussetzungen

Wir brauchen eine FritzBox mit Kernel 2.6 und EVA-Urlader, denn seit älteren Versionen könnten die FTP-Befehle sich mehr oder weniger stark verändert haben. Das weiß ich aber nicht genau. Es geht auch ein entsprechendes OEM-Gerät, also z.B. Speedport W501V, W701V, W900V.

Außerdem benötigen wir ein Linux-System (auch eine virtuelle Maschine, z.B. VMware, geht) mit installiertem Standard-Kommandozeilen-Client ftp (bei mir das Debian-Paket ftp 0.17-16) oder aber mit NcFTP 3.2.0 (bei mir Debian-Paket ncftp 2:3.2.0-1).

Alternativ funktioniert die beschriebene Prozedur mit NcFTP 3.2.0 auch unter Windows mit Cygwin. Dort klappt es aber nicht mit dem Standard-FTP-Client, mit dem Windows-FTP schon gar nicht.

Des weiteren sollte die Boot-IP der Box bekannt sein. Kennt man sie nicht und kommt man nicht über eine Konsole (SSH, Telnet, Rudi-Shell, Nano-Shell) an Informationen aus der Box, so kann man sie mittels ping herausfinden, indem man verschiedene IP-Adressen "anpingt" direkt nach dem Aus- und Einschalten/-stecken der Box. Folgende IPs werden häufig verwendet:

  • 192.168.178.1 (allermeistens)
  • 169.254.1.1
  • 192.168.2.1
  • 192.168.2.254

Die normale und einfache Methode, die Boot-IP herauszufinden, ist diese:

cat /proc/sys/urlader/environment | grep my_ipaddress

Man sollte dafür sorgen, dass Personal Firewalls ausgeschaltet sind, evtl. auch andere Sicherheitspakete, die den Netzwerkverkehr behindern könnten. Spätestens, wenn es mit aktiven Programmen nicht geht, sollte man sie ausschalten, auch wenn man sich einbildet, alles sei richtig eingestellt und daran könne es nicht liegen. Ganz ausschalten, nicht nur inaktiv setzen!

Außerdem ist es hilfreich, dass der Rechner, von dem aus man die Ping-Versuche unternimmt und die Verbindung per FTP initiieren möchte, im gleichen Subnetz (z.B. 192.168.178.0/24 bzw. Netzmaske 255.255.255.0) ist wie die Box, und zwar bzgl. der Adresse, die man gerade testet. Dass übrigens der Ping von Windows aus funktioniert, bedeutet noch lange nicht, dass man dann aus VMware heraus auch Verbindung aufnehmen kann. Wirklich von dort probieren, wo man später arbeiten möchte.

Verbindungsversuche benötigen evtl. mehrere Anläufe, also wenn ein Ping oder ein FTP-Connect nach drei, vier Sekunden nach Anschalten der Box noch nicht geklappt hat, am besten aus- und wieder einschalten, bis der Ping oder FTP-Connect funktioniert. Unter Windows sollte man ggf. auch noch das Media Sensing ausschalten, indem man folgendes als Textdatei mediasensing-aus.reg speichert und doppelklickt, um es danach in die Windows-Registry eintragen zu lassen:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters]

"DisableDHCPMediaSense"=dword:00000001

Evtl. sollte man nach dem Ausschalten einen Windows-Neustart machen. AVMs Recover-Werkzeug macht das jedenfalls, aber vielleicht geht es auch ohne. Man kann das Mediasensing dauerhaft ausgeschaltet lassen, sofern man den betreffenden Rechner nicht ständig an verschiedenen Netzwerken ein- und ausstöpselt und das Mediasensing für unterschiedliche DHCP-Server benötigt (z.B. Notebook abwechselnd im Büro und zu Hause). Sollte man es doch wieder einschalten wollen, geht das so:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters]

"DisableDHCPMediaSense"=dword:00000000

Allgemeine Informationen zur Datensicherung

Das im Folgenden gezeigte Vorgehen ist immer das gleiche, auch wenn unterschiedliche Kommandozeilen-Clients verwendet werden. Man kann das Ganze auch manuell im Dialog im FTP-Client durchführen, und außer den genannten Clients funktionieren vermutlich noch einige andere. Passiven Datentransfer sollten sie aber beherrschen, und Garantien gebe ich sowieso nicht. ;-) Die von mir getesteten Programme sollten ein Gelingen aber wesentlich wahrscheinlicher machen.

Eine Seltsamkeit gibt es, auf die ich gleich hinweisen möchte: Immer nach dem Download einer mtd-Partition muß man manuell einmal Strg-C (engl. Ctrl-C) an der Kommandozeile des FTP-Clients eingeben, damit der Client weiter läuft bzw. terminiert. Aus irgendeinem Grund wird das Ende eines GET-Downloads nicht erkannt, was wohl dem Urlader zuzuschreiben ist. Am besten kontrolliert man in einer zweiten Konsole am Client, ob die Größe der Download-Datei noch wächst. Nach ein paar Sekunden sollte das nicht mehr der Fall sein. Die Urlader- und TFFS-Partitionen sind sowieso fast augenblicklich heruntergeladen, nur bei mtd1, der Partition für Kernel + Dateisystem der Box, dauert es ein bißchen länger, geht aber auch sehr schnell. Dabei gelten folgende Dateigrößen:

  • Dateisystem + Kernel (mtd1):
    • 7.616 KB = 7.798.784 Bytes bei 8-MB-Boxen
    • 3.520 KB = 3.604.480 Bytes bei 4-MB-Boxen
    • 1.472 KB = 1.507.328 Bytes bei 2-MB-Boxen (theoretisch, diese Boxen haben momentan noch alte Urlader)
  • Urlader/Bootloader/EVA (mtd2): immer 64 KB = 65.536 Bytes
  • TFFS1 (mtd3): immer 256 KB = 262.144 Bytes
  • TFFS2 (mtd4): immer 256 KB = 262.144 Bytes

mtd1-4 summiert ergeben immer genau 8 bzw. 4 bzw. 2 MB, also die Speichergröße der jeweiligen Box.

Sicherung mit Linux-Standard-FTP (ftp)

Folgenden Code am besten in eine Skript-Datei eintragen und von dort ausführen wegen der Mehrzeiligkeit. Dabei die passende IP-Adresse eintragen und nach dem vollständigen Download jeder Partition jeweils einmal Strg-C drücken, damit die folgende heruntergeladen wird bzw. am Ende die FTP-Sitzung beendet wird.

(
cat <<EOT
open 192.168.178.1
user adam2 adam2
debug
bin
quote MEDIA FLSH
get mtd1
get mtd2
get mtd3
get mtd4
quit
EOT
) | ftp -n -p

Im Anschluß sollten sich im aktuellen Verzeichnis vier Dateien von mtd1 bis mtd4 befinden.

Sicherung mit Linux-NcFTP (ncftpget)

Auch hier wieder die IP-Adresse ersetzen. Das Skript jeweils einmal für jede der vier Partitionen von mtd1 bis mtd4 aufrufen, alles auf einmal geht hier nicht. Aber Strg-C am Ende des Downloads ist auch hier zum Beenden erforderlich.

ncftpget \
    -d stdout \
    -o doNotGetStartCWD=1,useFEAT=0,useHELP_SITE=0,useCLNT=0,useSIZE=0,useMDTM=0 \
    -W "quote MEDIA FLSH" \
    -u adam2 \
    -p adam2 \
    ftp://192.168.178.1/mtd1

Sicherung mit Cygwin-NcFTP (ncftpget)

Das funktioniert genauso wie unter Linux mit der gleichnamigen Anwendung, siehe oben.

Uploads via FTP

Analog hierzu kann man auch mit ftp bzw. ncftpput Uploads machen, allerdings sollte man das im Normalfall nur für mtd1 (Kernel + Dateisystem) machen, und dafür gibt es in ds26-15.2 bereits ein bequemes Skript Namens tools/push_firmware.sh (ab 15.3 entfällt die Endung .sh), welches unter Linux und Windows + Cygwin läuft und genaus das tut.

Das doppelt gepufferte TFFS - dort werden die Einstellungen der Firmware, sowohl vom Hersteller als auch von Freetz, gespeichert - sollte man nur im Notfall und immer nur auf genau die Box zurück spielen, von der es stammt, denn es enthält einen Teil der Identität der Box. Das hat sich seit dem Übergang von ADAM2 auf EVA zwar relativiert, weil der wichtigste Teil der Angaben direkt in den Bootloader gewandert ist - siehe Artikel von Enrik zu EVA - aber man sollte trotzdem damit aufpassen.

Was viel brisanter geworden ist, ist ein Überschreiben des Urladers, denn er enthält seit dem Übergang auf EVA wirklich wichtige box-individuelle Daten. Außerdem lässt er sich sowieso nicht via FTP überschreiben, weil er während der FTP-Sitzung ja gerade aktiv ist. Im Artikel ADAM-Bootloader wird beschrieben, wie man den Urlader direkt im laufenden Betrieb von der Konsole auf der Box aus überschreiben kann, aber dort steht nicht, wie man die box-individuellen Daten dort ins Image bekommt. Sie sollten also tunlichst bereits drin sein oder man sollte sich die Update-Prozedur aus den Original-Firmwares (z.B. 06.04.33, darin steckt ein Bootloader samt Update-Programm) anschauen und sich o.g. Artikel von Enrik durchlesen.

/!\ Ich kann nur dringendst davon abraten, den Urlader zu überschreiben, das sollte auch nie notwendig sein!!! /!\

Alexander Kriegisch (kriegaex)