[Info] modfs - SquashFS-Image (AVM-Firmware) ändern für NAND-basierte FRITZ!Boxen

antonvm

Mitglied
Mitglied seit
10 Jan 2016
Beiträge
316
Punkte für Reaktionen
3
Punkte
18
So werden reproduzierbare, nachhaltige Projekte, hier jetzt Freetz aufgestellt.

Die anderen Forks, soweit sie es noch nicht haben, sollten auch darüber nachdenken.

Danke

MfG
antonvm
 

PeterPawn

IPPF-Urgestein
Mitglied seit
10 Mai 2006
Beiträge
13,629
Punkte für Reaktionen
1,189
Punkte
113
Beim Aufräumen auf lokalen Rechnern sind mir einige ältere Änderungen noch untergekommen, die sich mit "run_modscripts" und der Auswertung von Return-Codes beim "postcheck"-Schritt befassen:


- ein "precheck" halte ich immer noch nicht für notwendig ... die Lösung, das Verzeichnis mit den entsprechenden "modscripts" angeben zu können beim Aufruf (darin können sich ja auch nur die Symlinks auf die "echten" Skript-Dateien befinden), erleichtert einem auch das Zusammenstellen unterschiedlicher Modifikationen für jedes Modell und jede Firmware-Version; ja, man könnte sogar pro Gerät einen eigenen Ordner dafür verwenden, wenn man das wollte.

Da auch bisher keine zusätzlichen Verzeichnisse durchsucht wurden, wie das in "modfs" beim "contrib"-Verzeichnis der Fall war, sollte das jetzt auch nicht notwendig werden und wenn man tatsächlich die Modifikationen für einzelne Geräte/Modelle in getrennten Verzeichnissen verwaltet (die Dateien hinter den Symlinks kann man ja trotzdem aktualisieren lassen, falls doch mal eines der Skripte geändert wurde), kann man da auch gleich alle Files (inkl. irgendwelcher aus "custom" oder "contrib" oder ähnlichem) verlinken - nur muß man beim Schreiben eigener Modifikationen, die sich auf mehr als eine Datei in unterschiedlichen Ordnern verteilen (mein Boot-Manager wäre so ein Beispiel), dann ein wenig aufpassen, wenn man mit Pfaden hantiert.

Gestartet werden die Skript-Dateien immer aus dem Verzeichnis heraus, in das man "run_modscripts" (und den Rest der Dateien) entpackt hat - zumindest wenn man meinen Empfehlungen zum Aufruf folgt. Alle weiteren Pfadangaben sollten also immer relativ dazu erfolgen und am besten noch mit "readlink -f" in die absoluten Pfade übersetzt werden (wenn man neue Skripte schreibt zumindest). Und um da ganz sicher zu gehen, daß es so etwas wie ein "Stammverzeichnis" für die entpackten "modfs"-Dateien gibt, wird jetzt eine Umgebungsvariable "MODFS_DIR" mit an die aufgerufenen Skript-Dateien übergeben, die auf den Wert des aktuellen Verzeichnisses (CWD - current working directory) beim Aufruf von "modfs" (und auch von "run_modscripts") gesetzt wird. Braucht ein Skript zum Modifizieren weitere Dateien (die sollten ja nicht im "modscripts"-Ordner liegen), kann es diesen Wert benutzen, um die zu lokalisieren, wenn sie unterhalb des "modfs"-Verzeichnisses (dessen Namen ja jeder Benutzer frei wählen kann, daher geht das nur mit relativen Pfaden) liegen.

Weitere Folge: neuer Timestamp, neues Archiv auf yourfritz.de

Ich habe die letzten Änderungen auch nicht direkt durch den Aufruf von "modfs" getestet (ich hoffe trotzdem, daß sich da keine Probleme ergeben, weil die Änderungen an diesen Dateien dann doch eher gering waren, im Gegensatz zum "run_modscripts"), sondern dafür das folgende Skript verwendet, was eine etwas erweiterte Form der Statements ist, die ich in diesem Thread: https://www.ip-phone-forum.de/threa...h-meine-eigene-dann-auf-der-fritz-box.307161/ mal zum Besten gegeben habe.

Diese Version kann einfach mit dem Modellnamen und der Versionsnummer der AVM-Firmware aufgerufen werden (für Release-Versionen und solange die URL bei AVM dann denselben, einfachen Regeln folgt wie im Skript - Standard wäre, wie ersichtlich, 7590 und 07.21), paßt sich beim Benutzernamen automatisch an den verwendeten Account an (alles nur als "root" zu machen, ist mir zu unsicher - ein "sudo" wird bei mir nur da genutzt, wo es sein muß und so werden z.B. auch die "modscripts" nicht als "root" abgearbeitet), detektiert die passende Version (byte order) für das Entpacken und Packen selbst und verwendet die "postcheck"-Aufrufe samt Auswertung der Return-Codes.

Bash:
# /bin/sh
set -x
MODEL=${1:-7590}
VERSION=${2:-07.21}
MYDIR="${TMPDIR:-/tmp}/$(id | sed -n -e "s|uid=[0-9]*(\([^)]*\)).*|\1|p" | sed -e "s|[ \t]|_|g")/yf_sample"
[ -d "$MYDIR" ] && printf "Error creating working directory (already exists).\n\a" && exit 1
! mkdir -p "$MYDIR" && printf "Error creating working directory.\n\a" && exit 1
cd "$MYDIR"
URL="http://ftp.avm.de/fritzbox/fritzbox-$MODEL/deutschland/fritz.os/FRITZ.Box_$MODEL-$VERSION.image"
wget -q -O avm.tar $URL
tar -x -f avm.tar -O ./var/tmp/kernel.image >kernel
dd of=kernel.bin if=kernel bs=8 count=$(( ( $(stat -c %s kernel) / 8 ) - 1 )) 2>/dev/null
rm kernel
tar -x -f avm.tar -O ./var/tmp/filesystem.image >fs.sqfs
git clone --recurse-submodules https://github.com/PeterPawn/YourFritz.git
git clone --recurse-submodules https://github.com/PeterPawn/modfs.git
MAGIC=$(dd if=fs.sqfs count=4 bs=1 2>/dev/null)
[ "$MAGIC" = "sqsh" ] && ENDIAN=be || ENDIAN=le
sudo YourFritz/bin/squashfs/$(uname -m)/unsquashfs4-$ENDIAN -no-progress fs.sqfs
sudo chown -R $(id | sed -n -e "s|uid=\([0-9]*\).*|\1|p"):$(id | sed -n -e "s|.*gid=\([0-9]*\).*|\1|p") squashfs-root/
rm fs.sqfs
mkdir modfs/$MODEL
cd modfs/
for modscript in gui_boot_manager_v0.6 mod_enable_calllog mod_fixed_branding mod_telnet_enable mod_rc_tail_sh; do
        ln -s ../modscripts/$modscript $MODEL/
done
./run_modscripts ../squashfs-root/ $MODEL
modrc=$?
cd ..
if [ "$modrc" -eq 0 ]; then
        YourFritz/bin/squashfs/$(uname -m)/mksquashfs4-$ENDIAN squashfs-root/ fs.sqfs -all-root -no-progress
        cat kernel.bin fs.sqfs >new.image
        ls -l
else
        printf "At least one 'modscript' reported an error, packing skipped.\n\a"
fi
exit $modrc
... und ehe mir wieder "Klagen" kommen, daß das jemand nicht aus der Seite hier so einfach herauskopieren kann, hänge ich es (trotz "Wer immer strebend sich bemüht, den können wir erlösen." - um mal wieder eine Textstelle aus einem Werk von J.W.v.Goethe zu zitieren, nämlich "Faust II") noch einmal als Datei hier an. Kommt jetzt allerdings der Nächste und empört sich darüber, daß die Datei aber die Endung ".txt" hat (weil die Board-Software das so will), dann möge er das bitte gleich für sich behalten ... wenn jemand eine Datei (beim oder nach dem Download) nicht alleine umbenennen kann, interessiert mich das (in meinem Elfenbeinturm) nicht die Bohne.

Und auch hier betone ich noch einmal (schon um erneute Mißverständnisse zu vermeiden, auch wenn der gewählte Verzeichnisname "yf_sample" für sich selbst sprechen sollte), daß es sich meinerseits nur um ein Beispiel handelt, wie man die Firmware für andere Boxen (bei VR9 funktioniert das so gar nicht, weil das Entpacken auch dann anders aussehen muß, wenn nicht länger "ext2", sondern auch wieder SquashFS verwendet wird für die "wrapper"-Partition) modifizieren KÖNNTE, wenn man "modfs" dafür nehmen wollte.
 

Anhänge

Zuletzt bearbeitet:
  • Like
Reaktionen: Insti

Insti

Mitglied
Mitglied seit
19 Aug 2016
Beiträge
650
Punkte für Reaktionen
61
Punkte
28
Diese Version kann einfach mit dem Modellnamen und der Versionsnummer der AVM-Firmware aufgerufen werden (für Release-Versionen und solange die URL bei AVM dann denselben
Funktioniert einwandfrei. Gerade auf dem Raspberry Pi für die 7530 getestet
Code:
[email protected]:/opt# ./fritzbuild7530.sh
++ MODEL=7530
++ VERSION=07.21
+++ id
+++ sed -n -e 's|uid=[0-9]*(\([^)]*\)).*|\1|p'
+++ sed -e 's|[ \t]|_|g'
++ MYDIR=/tmp/root/yf_sample
++ '[' -d /tmp/root/yf_sample ']'
++ mkdir -p /tmp/root/yf_sample
++ cd /tmp/root/yf_sample
++ URL=http://ftp.avm.de/fritzbox/fritzbox-7530/deutschland/fritz.os/FRITZ.Box_7530-07.21.image
++ wget -q -O avm.tar http://ftp.avm.de/fritzbox/fritzbox-7530/deutschland/fritz.os/FRITZ.Box_7530-07.21.image
++ tar -x -f avm.tar -O ./var/tmp/kernel.image
+++ stat -c %s kernel
++ dd of=kernel.bin if=kernel bs=8 count=388064
++ rm kernel
++ tar -x -f avm.tar -O ./var/tmp/filesystem.image
++ git clone --recurse-submodules https://github.com/PeterPawn/YourFritz.git
Cloning into 'YourFritz'...
remote: Enumerating objects: 122, done.
remote: Counting objects: 100% (122/122), done.
remote: Compressing objects: 100% (72/72), done.
remote: Total 3487 (delta 75), reused 88 (delta 47), pack-reused 3365
Receiving objects: 100% (3487/3487), 4.03 MiB | 2.85 MiB/s, done.
Resolving deltas: 100% (2229/2229), done.
Submodule 'bin' (https://github.com/PeterPawn/yf_bin.git) registered for path 'bin'
Submodule 'first_aid' (https://github.com/PeterPawn/first_aid.git) registered for path 'first_aid'
Cloning into '/tmp/root/yf_sample/YourFritz/bin'...
remote: Enumerating objects: 99, done.
remote: Counting objects: 100% (99/99), done.
remote: Compressing objects: 100% (78/78), done.
remote: Total 926 (delta 22), reused 90 (delta 19), pack-reused 827
Receiving objects: 100% (926/926), 75.25 MiB | 5.68 MiB/s, done.
Resolving deltas: 100% (180/180), done.
Cloning into '/tmp/root/yf_sample/YourFritz/first_aid'...
remote: Enumerating objects: 42, done.
remote: Total 42 (delta 0), reused 0 (delta 0), pack-reused 42
Submodule path 'bin': checked out '761344186579a26a7f60791f76f0f938b19b3a44'
Submodule path 'first_aid': checked out '0359a4db07ffb555b5714184f16a2ffd7348955b'
++ git clone --recurse-submodules https://github.com/PeterPawn/modfs.git
Cloning into 'modfs'...
remote: Enumerating objects: 130, done.
remote: Counting objects: 100% (130/130), done.
remote: Compressing objects: 100% (86/86), done.
remote: Total 1735 (delta 75), reused 89 (delta 41), pack-reused 1605
Receiving objects: 100% (1735/1735), 17.22 MiB | 3.87 MiB/s, done.
Resolving deltas: 100% (1166/1166), done.
+++ dd if=fs.sqfs count=4 bs=1
++ MAGIC=hsqs
++ '[' hsqs = sqsh ']'
++ ENDIAN=le
+++ uname -m
++ sudo YourFritz/bin/squashfs/armv7l/unsquashfs4-le -no-progress fs.sqfs
sudo: unable to resolve host ubuntu: Name or service not known
Found TI checksum (0xED68084B) at the end of the image.
Filesystem on fs.sqfs is xz compressed (4:0)
Parallel unsquashfs: Using 4 processors
8325 inodes (9284 blocks) to write


created 7631 files
created 516 directories
created 693 symlinks
created 1 devices
created 0 fifos
+++ id
+++ sed -n -e 's|uid=\([0-9]*\).*|\1|p'
+++ id
+++ sed -n -e 's|.*gid=\([0-9]*\).*|\1|p'
++ sudo chown -R 0:0 squashfs-root/
sudo: unable to resolve host ubuntu: Name or service not known
++ rm fs.sqfs
++ mkdir modfs/7530
++ cd modfs/
++ for modscript in gui_boot_manager_v0.6 mod_enable_calllog mod_fixed_branding mod_telnet_enable mod_rc_tail_sh
++ ln -s ../modscripts/gui_boot_manager_v0.6 7530/
++ for modscript in gui_boot_manager_v0.6 mod_enable_calllog mod_fixed_branding mod_telnet_enable mod_rc_tail_sh
++ ln -s ../modscripts/mod_enable_calllog 7530/
++ for modscript in gui_boot_manager_v0.6 mod_enable_calllog mod_fixed_branding mod_telnet_enable mod_rc_tail_sh
++ ln -s ../modscripts/mod_fixed_branding 7530/
++ for modscript in gui_boot_manager_v0.6 mod_enable_calllog mod_fixed_branding mod_telnet_enable mod_rc_tail_sh
++ ln -s ../modscripts/mod_telnet_enable 7530/
++ for modscript in gui_boot_manager_v0.6 mod_enable_calllog mod_fixed_branding mod_telnet_enable mod_rc_tail_sh
++ ln -s ../modscripts/mod_rc_tail_sh 7530/
++ ./run_modscripts ../squashfs-root/ 7530
Running script 'gui_boot_manager_v0.6' ...
      Patching file 'usr/www/1und1/system/reboot.js' ...
      Patching file 'usr/www/1und1/system/reboot.lua' ...
      Patching file 'usr/www/avm/system/reboot.js' ...
      Patching file 'usr/www/avm/system/reboot.lua' ...
      Patching file 'usr/www/avme/system/reboot.js' ...
      Patching file 'usr/www/avme/system/reboot.lua' ...
Finished script 'gui_boot_manager_v0.6', rc=0
Running script 'mod_enable_calllog' ...
Finished script 'mod_enable_calllog', rc=0
Running script 'mod_fixed_branding' ...
Das Branding für das neue System wurde fest auf 'avm' eingestellt.
Finished script 'mod_fixed_branding', rc=0
Running script 'mod_rc_tail_sh' ...
Finished script 'mod_rc_tail_sh', rc=0
Running script 'mod_telnet_enable' ...
Finished script 'mod_telnet_enable', rc=0
++ modrc=0
++ cd ..
++ '[' 0 -eq 0 ']'
+++ uname -m
++ YourFritz/bin/squashfs/armv7l/mksquashfs4-le squashfs-root/ fs.sqfs -all-root -no-progress
Parallel mksquashfs: Using 4 processors
Creating 4.0 filesystem on fs.sqfs, block size 65536.

Exportable Squashfs 4.0 filesystem, xz compressed, data block size 65536
        compressed data, compressed metadata, compressed fragments, no xattrs
        duplicates are removed
Filesystem size 25160.05 Kbytes (24.57 Mbytes)
        21.72% of uncompressed filesystem size (115822.59 Kbytes)
Inode table size 65690 bytes (64.15 Kbytes)
        22.11% of uncompressed inode table size (297074 bytes)
Directory table size 83592 bytes (81.63 Kbytes)
        37.49% of uncompressed directory table size (222986 bytes)
Number of duplicate files found 5052
Number of inodes 8848
Number of files 7637
Number of fragments 383
Number of symbolic links  694
Number of device nodes 1
Number of fifo nodes 0
Number of socket nodes 0
Number of directories 516
Number of ids (unique uids + gids) 1
Number of uids 1
        root (0)
Number of gids 1
        root (0)
++ cat kernel.bin fs.sqfs
++ ls -l
total 86424
drwxr-xr-x 28 root root     4096 Jan 27 22:32 YourFritz
-rw-r--r--  1 root root 30740480 Oct 27 14:50 avm.tar
-rw-r--r--  1 root root 25767936 Jan 27 22:34 fs.sqfs
-rw-r--r--  1 root root  3104512 Jan 27 22:32 kernel.bin
drwxr-xr-x  9 root root     4096 Jan 27 22:33 modfs
-rw-r--r--  1 root root 28872448 Jan 27 22:34 new.image
drwxr-xr-x 13 root root     4096 Oct 19 18:31 squashfs-root
++ exit 0
[email protected]:/opt#
Tolle Arbeit! Vielen Dank!
 

Zurzeit aktive Besucher

3CX

Neueste Beiträge

Statistik des Forums

Themen
237,461
Beiträge
2,094,095
Mitglieder
359,672
Neuestes Mitglied
IPex4Fax