Wiki:help/howtos/development/repack_fw

Entpacken und Packen von Firmware-Images

Wenn man ein Firmware-Image entpacken, ändern und wieder packen möchte, geht das wie folgt (nach Anleitung von Alexander Kriegisch - in diesem Forums-Thread:

Tools und Syntax

Am einfachsten ist es, Freetz als Infrastruktur zu benutzen, und zwar das Skript fwmod aus dem Freetz-Hauptverzeichnis. Wenn man es ohne Parameter aufruft, verrät es wie es benutzt werden möchte:

$ ./fwmod

Usage: fwmod [-u|-m|-p|-a] [-i <cfg>] [-d <dir>] <orig_fw> [<tk_fw> [<aux_fw>]]
  actions
    -u         unpack firmware image
    -m         modify previously unpacked image
    -p         pack firmware image
    -a         all: unpack, modify and pack firmware image (-u -m -p, default)
  special actions
    -n         firmware-nocompile: do not install kernel and busybox
    -f         force pack even if image is too big for flash (AVM SDK)
    -z         zip file system into archive for USB/NFS root
    -c <dir>   copy file system to target directory for NFS/USB root (implies -z)
  input/output
    -i <cfg>   input file for configuration data (default: .config)
    -d <dir>   build directory (default: <orig_firmware>.mod)
    <orig_fw>  original firmware name
    <tk_fw>    2nd firmware name (e.g. for merging in web UI)
    <aux_fw>   3rd firmware name (e.g. to borrow missing files)

Man braucht also einmal den Aufruf mit -u zum Entpacken, dann nach der Modifikation den mit -p zum erneuten Packen.

Vorgehensweise

Im Folgenden wird davon ausgegangen, dass sich der Benutzer im Hauptverzeichnis des frisch ausgepackten oder ausgecheckten Freetz befindet und das zu modifizierende Firmware-Image bereits in dieses Verzeichnis heruntergeladen hat. Dann sind folgende Schritte auszuführen:

  1. Zunächst muss man eine passende Konfigurationsdatei .config erzeugen, damit beim Packen später das Skript fwmod die erforderlichen Informationen findet. Dazu ruft man einmal make menuconfig auf, wählt die richtige Hardware (z.B. 7170) aus und verlässt die Konfiguration, wobei man die Frage nach dem Abspeichern bejaht.
  2. Bevor man fwmod erstmals aufrufen kann, müssen einige Werkzeuge gebaut werden, die später indirekt aufgerufen werden, um die Firmware zu entpacken und später wieder zusammenzubauen: make tools. Das kann ein Weilchen (einige Minuten) dauern. Internet-Downloads via wget müssen dazu funktionieren.
  3. Jetzt entpackt man das von AVM heruntergeladene Firmware-Image in ein Verzeichnis, das hier beispielhaft unpacked_firmware genannt wird:
    ./fwmod -u -d unpacked_firmware FRITZ.Box_Fon_WLAN_7170.29.04.59.image
    
  4. Unter unpacked_firmware/original/filesystem modifiziert man dann das Dateisystem der Firmware.
  5. Zum guten Schluss packt man dann wieder das Firmware-Image:
    ./fwmod -p -d unpacked_firmware FRITZ.Box_Fon_WLAN_7170.29.04.59.image
    

Das ist also der gleiche Aufruf wie vorher, nur mit -p statt -u. Den Namen des Original-Images muss man leider mit angeben, obwohl das Image zum Packen nicht benötigt wird. Das ist eine kleine Schwäche des Skripts fwmod.

  1. Nach einer Weile steht am Ende der Skript-Ausgabe so etwas wie
    creating filesystem image
    merging kernel image
     kernel image size: 6969088 (max: 7798784, free: 829696)
    packing 7170_.de_20080923-200251.image
    done.
    
    FINISHED
    

Anmerkungen zu den Freetz-Versionen bis einschließlich 1.1:

  • Bei diesen Versionen muss den beiden fwmod-Aufrufen folgender fakeroot-Teil vorangestellt werden tools/build/bin/fakeroot -- (fwmod hat es erwartet in fakeroot-Umgebung aufgerufen zu werden und hat sich selbst um diese noch nicht gekümmert)
  • Bei Fehlermeldung fakeroot: preload library `libfakeroot.so' not found, aborting. hilft ein vorangestelltes LD_PATH_PRELOAD:
    LD_PATH_PRELOAD=tools/build/lib/libfakeroot.so tools/build/bin/fakeroot -- ./fwmod ...
    

Alternative Methode

Falls das Entpacken mit fwmod nicht funktioniert (z.B. für selbstgebaute 7390 Images) kann man Firmwares wie folgt entpacken:

oliver@nb8:~/freetz/trunk/temp$ tar xf FRITZ.Box_Fon_WLAN_7270_v3.74.05.50.image
oliver@nb8:~/freetz/trunk/temp$ ../tools/find-squashfs var/tmp/kernel.image 
Size is 13918166
Little endian squashfs signature found at 1463040
Created kernel.raw
Created kernelsquashfs.raw
oliver@nb8:~/freetz/trunk/temp$ ../tools/unsquashfs3-lzma -n -d filesystem kernelsquashfs.raw 2>/dev/null
6496 inodes (6892 blocks) to write


created 5297 files
created 344 directories
created 1112 symlinks
created 0 devices
created 0 fifos

Erklärung: Beim selbstgebauten Image für Firmwares mit Junk-Bytes fehlen die Junk-Bytes, daher kann das Image nicht mit fwmod entpackt werden.

zuletzt geändert vor 3 Jahren Zuletzt geändert am 24.05.2014 09:29:42