- Mitglied seit
- 10 Mai 2006
- Beiträge
- 15,267
- Punkte für Reaktionen
- 1,750
- Punkte
- 113
Ja, die AVM-Images enthalten die Verzeichnisse fürMuß das unbedingt nach / entpackt werden, um nachher installieren zu können?
var
und var/tmp
und das install
-Skript greift mit absoluten Pfaden auf die kernel.image
und filesystem.image
zu:
Rich (BBCode):
peh@vidar:~> wget http://ftp.avm.de/fritzbox/fritzbox-7490/deutschland/fritz.os/FRITZ.Box_7490-07.12.image -O - -q | tar -x -O ./var/install | grep "/var/tmp/\(kernel\|filesystem\)\.image"
if [ -f /var/tmp/filesystem.image ] && [ $filesystem_size -ne 0 ] ; then
if ! /var/chksum${CHKSUMEXT} /var/tmp/filesystem.image ; then
echo "chksum for file /var/tmp/filesystem.image failed."
echo chksum for file /var/tmp/filesystem.image ok
filesystem_image_size="`ls -l /var/tmp/filesystem.image | sed -e 's/[^0-9]/#/g' | sed -e 's/#\+[0-9]\+#\+\([0-9]\+\).*/\1/'`"
echo "Size of file /var/tmp/filesystem.image bigger than MTD-Size (${filesystem_image_size} > ${filesystem_size})."
echo size for file /var/tmp/filesystem.image ok
if [ -f /var/tmp/kernel.image ] ; then
if ! /var/chksum${CHKSUMEXT} /var/tmp/kernel.image ; then
echo "chksum for file /var/tmp/kernel.image failed."
echo chksum for file /var/tmp/kernel.image ok
kernel_image_size="`ls -l /var/tmp/kernel.image | sed -e 's/[^0-9]/#/g' | sed -e 's/#\+[0-9]\+#\+\([0-9]\+\).*/\1/'`"
echo "Size of file /var/tmp/kernel.image bigger than MTD-Size (${kernel_image_size} > ${kernel_size})."
echo size for file /var/tmp/kernel.image ok
elif ! test -f "/var/tmp/kernel.image" ; then
elif ! test -f "/var/tmp/filesystem.image" ; then
kernel_image_size="`ls -l /var/tmp/kernel.image | sed -e 's/[^0-9]/#/g' | sed -e 's/#\+[0-9]\+#\+\([0-9]\+\).*/\1/'`"
filesystem_image_size="`ls -l /var/tmp/filesystem.image | sed -e 's/[^0-9]/#/g' | sed -e 's/#\+[0-9]\+#\+\([0-9]\+\).*/\1/'`"
echo "/sbin/update_kernel -i /var/tmp/kernel.image -o /dev/mtd$var_kernel_mtdnr" >>/var/post_install
echo "cp /var/tmp/kernel.image /dev/mtdblock$var_kernel_mtdnr" >> /var/post_install
echo 'rm -f /var/tmp/kernel.image' >> /var/post_install
echo 'mount -t squashfs /var/tmp/filesystem.image /var/tmp/fs' >> /var/post_install
echo ' dd if=/var/tmp/filesystem.image of=/var/tmp/fsimage.ext2 bs=256 skip=1 conv=sync' >> /var/post_install
echo ' [ "$?" -eq 0 ] && mount -t ext2 /var/tmp/fsimage.ext2 /var/tmp/fs && rm -f /var/tmp/filesystem.image' >> /var/post_install
peh@vidar:~>
/var/chksum
gesucht, wie man oben sieht (Zeile 3 in der Ausgabe).Ja, sonst spielt das AVM-Skript nicht mit. Da ich hier dann auch auf die FRITZ!Box wechseln mußte, kam das Image vom NAS, wo man es irgendwie ablegen muß von extern (zur FRITZ!Box).Muß hier die own_filesystem.spfs mit Prüfsumme sein?
Das geht tatsächlich wieder ziemlich einfach mittelsHast du dafür einen Vorschlag?
unsquashfs
... allerdings auch nur mit der Version aus Freetz, die die notwendigen Patches von mir enthält: https://github.com/PeterPawn/YourFreetz/commit/9f89c498caef84fa8cc7c64730c670a71637b43f (bzw. die umgearbeiteten Änderungen von @er13).Denn dazu braucht es die Option
-scan
, die erst einmal nach dem Offset des Superblocks innerhalb einer Datei sucht. Die offiziellen SquashFS-Tools kennen da zwar mittlerweile auch eine Option -offset
für solch eine Verschiebung (https://github.com/plougher/squashf...1d86adc#diff-64f9b9f920063cbf890d0a44d3c9ef17), aber dafür muß man die Verschiebung bereits kennen, während bei -scan
eben nach der Signatur des SquashFS-Superblocks gesucht wird. Da das auch noch entsprechende Anzeigen/Ausgaben nach sich zieht, kann man damit die "Grenze" zwischen Kernel und Dateisystem in einem RAM-Image finden und dann beide mittels dd
wieder voneinander separieren:
Rich (BBCode):
peh@vidar:~> wget ftp://user:password@update.avm.de/labor/PSQ19-Labor/FRITZ.Box_7490-07.19-79496-LabBETA.image -O /tmp/avm.image -q
peh@vidar:~> /home/GitHub/YourFritz/eva_tools/image2ram < /tmp/avm.image >/tmp/in-memory.image
peh@vidar:~> /home/GitHub/YourFritz/bin/squashfs/$(uname -m)/unsquashfs4-be -scan -stat /tmp/in-memory.image
Found a valid superblock at offset 0x00290100 while scanning /tmp/in-memory.image.
Found a valid big endian SQUASHFS 4:0 superblock on /tmp/in-memory.image.
Creation or last append time is not available because of modified AVM-format (mkfs_time == bytes_used)
Filesystem size 30473.99 Kbytes (29.76 Mbytes)
Compression xz
Block size 65536
Filesystem is exportable via NFS
Inodes are compressed
Data is compressed
Fragments are compressed
Always-use-fragments option is not specified
Xattrs are not stored
Duplicates are removed
Number of fragments 1
Number of inodes 105
Number of ids 1
unsquashfs
nach der Zeile durchsuchen (lassen) und die hexadezimale Angabe läßt sich auch ganz simpel wieder in einem dd
-Kommando verwenden - wobei das hier alles ohne Fehlerbehandlung ist und man sich daher zuvor davon überzeugt haben sollte, daß es den Superblock tatsächlich gibt:
Rich (BBCode):
peh@vidar:~> dd if=/tmp/in-memory.image of=/tmp/kernel.image bs=256 count=$(( 0x$(/home/GitHub/YourFritz/bin/squashfs/$(uname -m)/unsquashfs4-be -scan -stat /tmp/in-memory.image 2>&1 | sed -n -e "s|Found a valid superblock at offset 0x\([0-9A-Fa-f]*\)00 while.*\$|\1|p") ))
10497+0 records in
10497+0 records out
2687232 bytes (2.7 MB, 2.6 MiB) copied, 0.0823 s, 32.7 MB/s
peh@vidar:~> dd if=/tmp/in-memory.image of=/tmp/fs.image bs=256 skip=$(( 0x$(/home/GitHub/YourFritz/bin/squashfs/$(uname -m)/unsquashfs4-be -scan -stat /tmp/in-memory.image 2>&1 | sed -n -e "s|Found a valid superblock at offset 0x\([0-9A-Fa-f]*\)00 while.*\$|\1|p") ))
121904+0 records in
121904+0 records out
31207424 bytes (31 MB, 30 MiB) copied, 0.896775 s, 34.8 MB/s
sed
jetzt macht bzw. wie exakt der Text verglichen werden soll, ist Geschmackssache - aber man sollte auch die richtige Zeile treffen und da reicht "offset" dann nicht zwingend aus als "Adresse" (bzw. wäre mir persönlich halt zuwenig).Das hat jetzt nur einen Schönheitsfehler ... es funktioniert nur dann, wenn das verwendete Dateisystem auch tatsächlich ein SquashFS-Image ist. Handelt es sich tatsächlich um ein "ext2"-Image, das nur den "Pseudo-Header" für ein SquashFS-Image vorangestellt hat (256 Byte, wobei in den ersten vier Byte die Signatur "sqsh" steht), findet auch das gepatchte
unsquashfs
(absichtlich) keinen Superblock, weil eben der Rest in diesen 256 Byte nicht paßt. Das heißt also, daß man sich für die Versionen der AVM-Firmware, die bei den passenden Plattformen (iirc sind das nur VR9 und AR10, die da betroffen sind) mit einem "ext2"-Image arbeiten (das stellte AVM ja erst im Laufe der Labor-Reihe 07.19 wieder um), doch noch etwas anderes einfallen lassen muß.
Rich (BBCode):
peh@vidar:~> wget http://ftp.avm.de/fritzbox/fritzbox-7490/deutschland/fritz.os/FRITZ.Box_7490-07.12.image -O /tmp/avm.image -q
peh@vidar:~> /home/GitHub/YourFritz/eva_tools/image2ram < /tmp/avm.image >/tmp/in-memory.image
peh@vidar:~> /home/GitHub/YourFritz/bin/squashfs/$(uname -m)/unsquashfs4-be -k /tmp/in-memory.image
Unable to find something looking like a SquashFS superblock in /tmp/in-memory.image.
grep
-Kommando zur Hand, ist das wieder easy - das grep
aus der BusyBox nutzt einem hier aber nichts. Uns interessiert nur die erste Fundstelle (da der Kernel gepackt ist, taucht darin üblicherweise kein "sqsh" als Klartext auf - das wäre schon ein ziemlicher Zufall) und wenn man das nicht mit 1-Byte-Blöcken und damit extrem langsam kopieren will, sollte man die Verschiebung wieder durch 256 teilen:
Rich (BBCode):
peh@vidar:~> grep -abo "sqsh" /tmp/in-memory.image
2649088:sqsh
23165384:sqsh
25126144:sqsh
peh@vidar:~> printf "%u\n" "$(( $(grep -abo "sqsh" /tmp/in-memory.image | sed -n -e "1s|\([0-9]*\):sqsh|\1|p") / 256 ))"
10348
peh@vidar:~> dd if=/tmp/in-memory.image of=/tmp/kernel.image bs=256 count=$(printf "%u\n" "$(( $(grep -abo "sqsh" /tmp/in-memory.image | sed -n -e "1s|\([0-9]*\):sqsh|\1|p") / 256 ))")
10348+0 records in
10348+0 records out
2649088 bytes (2.6 MB, 2.5 MiB) copied, 0.0787778 s, 33.6 MB/s
peh@vidar:~> dd if=/tmp/in-memory.image of=/tmp/fs.image bs=256 skip=$(printf "%u\n" "$(( $(grep -abo "sqsh" /tmp/in-memory.image | sed -n -e "1s|\([0-9]*\):sqsh|\1|p") / 256 ))")
117008+0 records in
117008+0 records out
29954048 bytes (30 MB, 29 MiB) copied, 0.887396 s, 33.8 MB/s
grep
kann/muß man sich dann eben zu helfen wissen ... es gibt diverse andere Wege, die richtige Verschiebung zu ermitteln und notfalls durchsucht man selbst mit dd
das Image nach dem Pseudo-Header (Achtung: Das mit dem for
in dieser Form funktioniert nicht mit der BusyBox oder der dash
, da muß man es "komplizierter" machen (für die Schleife).):
Rich (BBCode):
peh@vidar:~> ( printf "sqsh"; for (( i=63; i>0; i-- )); do printf "\000\000\000\000"; done ) >/tmp/pseudo.hdr
peh@vidar:~> hexdump -C /tmp/pseudo.hdr
00000000 73 71 73 68 00 00 00 00 00 00 00 00 00 00 00 00 |sqsh............|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000100
peh@vidar:~> time for (( blocks=$(( $(wc -c /tmp/in-memory.image | sed -n -e "1s|\([0-9]*\).*|\1|p") / 256 )), c=0; c<blocks; c++ )); do dd if=/tmp/in-memory.image bs=256 count=1 skip=$c 2>/dev/null | cmp -- /tmp/pseudo.hdr - 2>/dev/null 1>&2 && printf "\r%u\n" "$c" && break; printf "\r%u" "$c"; done
10348
real 0m36.637s
user 0m28.555s
sys 0m30.521s
dd
-Kommandos einsetzen oder in einer Variablen zwischenspeichern - das muß man nicht mehr als einmal ausführen (lassen).Es führen wieder mal viele Wege nach Rom und welchen man nimmt, hängt immer auch davon ab, was man als Werkzeug in seiner Wanderausrüstung mit sich herumträgt. Fast immer wird sich auch mit Vorhandenem ein Weg finden lassen - notfalls muß man eben doch Programme nachinstallieren.
Zuletzt bearbeitet: