Wenn man ein Firmware-Image entpacken, ändern und wieder packen möchte, geht das wie folgt (nach Anleitung von Alexander Kriegisch
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.
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:
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
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
.
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:
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 ...
Seit trunk Changeset r13796 ist es möglich fwmod im quasi “no freetz”-Modus zu verwenden. Vom Ablauf her entspricht dieser Modus dem Bauen einer freetz-modifizierten Firmware. In diesem Modus wird jedoch keine einzige freetz-Änderung vorgenommen. Stattdessen wird ein Hook aufgerufen, in dem man eigene Modifikationen der Firmware implementieren und automatisiert ausführen lassen kann. Konkret gehe man wie folgt vor:
make menuconfig
auf, schalte den Experten-Modus ein
(“Level of User Competence” = Expert), wähle die richtige Hardware
(z.B. 7390) aus und aktiviere anschließend unter “Firmware
packaging (fwmod) options” die Option “Skip modifying unpacked
firmware, adding Freetz stuff”. Der letzte Schritt entspricht dem
Aktivieren des “no freetz”-Modus. Seit Fritz!OS-6.5x empfiehlt es
sich weiterhin die Option “Sign image” (ebenfalls unter “Firmware
packaging (fwmod) options” zu finden) zu aktivieren (s. dazu den
Signieren von
Firmware-Artikel)../filesystem
zur Verfügung. fwmod_custom enthält bereits einige
auskommentierte Beispiele: restore telnet
support,
restore debug.cfg
support.Anschließend rufe man make
auf. Das entpackte,
fwmod_custom-modifizierte, wieder zusammengepackte und ggf.
signierte Image ist unter images/
zu finden.
STEP 1: UNPACK
unpacking firmware image
removing NMI vector from SquashFS
NMI vector v1 found at offset 0xBE0000, removing it ... done.
splitting kernel image
unpacking filesystem image
Reading a different endian SQUASHFS filesystem on build/original/kernel/kernelsquashfs.raw
Filesystem on build/original/kernel/kernelsquashfs.raw is lzma compressed (3:76)
Parallel unsquashfs: Using 1 processor
6112 inodes (6522 blocks) to write
created 5328 files
created 373 directories
created 697 symlinks
created 87 devices
created 0 fifos
unpacking AVM plugins
tam image
webcm_interpreter image
wlan image
unpacking var.tar
done.
detected firmware 7390_de 84.06.80 rev43122 (07.02.2017 12:23:41)
STEP 3: PACK/SIGN
WARNING: Modifications (STEP 2) and this step should never
ever be run with different configurations!
This can result in invalid images!!!
WARNING: firmware does not seem to be modified by the script
invoking custom script
restoring support for /var/flash/debug.cfg
patching ./filesystem/etc/init.d/rc.tail.sh
checking for left over Subversion directories
packing var.tar
Image signing files found, checking their consistency
Copying /home/gene/.freetz.image_signing.asc to /etc/avm_firmware_public_key9
creating filesystem image
SquashFS block size: 64 kB (65536 bytes)
merging kernel image
kernel image size: 14.6 MB, max 14.9 MB, free 0.3 MB (269568 bytes)
WARNING: Not enough free flash space for answering machine!
adding checksum to kernel.image
packing images/7390_06.80.de_20170220-222457.image
image file size: 16.8 MB
signing images/7390_06.80.de_20170220-222457.image
signed image file size: 16.8 MB
done.
FINISHED