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



Hallo PeterPawn,
irgendwie haben wir verschiedene modfs-Skripte

ich verwende die modfs-0.3.1 Skript Version
Code:
copy_wrapper_filesystem()
{
        local rc target src="$1" tmp fstype mrc kernelversion
        target=$(get_mtd_by_name $reservedprefix$filesystemname)
        # prepare MTD writes
        # notify power management
        echo MODE=update > /dev/avm_power
        # prevent unwanted watchdog restarts, may be necessary but update is very fast
        # echo "disable" > /dev/watchdog
        # clear filesystem first
        debug "copy_wrapper_filesystem: src=$src, rootfs=$rootfsname"
        $update_kernel_binary -o /dev/$mtdprefix$target >/dev/null 2>&1
        rc=$?
       debug "copy_wrapper_filesystem: clearing target device /dev/$mtdprefix$target, rc=$rc"
        if [ $rc -ne 0 ]; then
                rc=44
        else
                fstype=$(detect_image_filesystem "$src")
                rc=$?
                if [ $rc -eq 0 ]; then
                        # mount squashfs and yaffs2 wrapper and copy from one to the other
                        tmp="$(get_temp_dir)"
                        mkdir -p $tmp/yaffs $tmp/wrapperfs
                        mount -t yaffs2 /dev/$mtdblockname$target $tmp/yaffs
                        if [ "$fstype" == "ext2" -o "$fstype" == "sqfs_dummy256_ext2" ]; then
                                # ext2 image with AVM's dummy header
                                mount_ext2_image "$src" "$tmp/wrapperfs" "$fstype"
                                rc=$?
                        else
                                mount "$src" $tmp/wrapperfs 2>/dev/null
                                rc=$?
                                mrc=$rc
                                if [ $rc -ne 0 ]; then
                                        # try to extract with unsquashfs3, if this is a 3.xx kernel based
                                        # without knowledge about SquashFS3 format while mounting
                                        kernelversion=$(uname -r)
                                        kernelversion=${kernelversion%%.*}
                                        if [ $kernelversion -eq 3 -a x"$fstype" == x"squashfs3" ]; then
                                                unpack_squashfs "$src" "$tmp" 2>&1 >/dev/null
                                                rc=$?
                                                if [ $rc -eq 0 ]; then
                                                        rmdir "$tmp/wrapperfs"
                                                        mv "$tmp/$squashfsdirname" "$tmp/wrapperfs"
                                                        rc=$?
                                                        rm "$tmp/wrapperfs/$rootfsname"
                                                fi
                                        fi
                                fi
                        fi
                        if [ $rc -eq 0 ]; then
                                tar -c -O -C $tmp/wrapperfs --exclude=$rootfsname . | tar -x -C $tmp/yaffs
                                rc=$?
                                debug "copy_wrapper_filesystem: copying done, rc=$rc"
                                [ $mrc -eq 0 ] && umount $tmp/wrapperfs
                                umount $tmp/yaffs
                                remove_directory "$tmp"
                                rc=0
                        fi
                fi
        fi
        debug "copy_wrapper_filesystem: exiting, rc=$rc"
        return $rc
}

Deine Version sieht gemäß #219 so aus:
Code:
copy_wrapper_filesystem()
{
    local rc target src="$1" tmp fstype [COLOR="#FF0000"]mrc=0[/COLOR] kernelversion
    target=$(get_mtd_by_name $reservedprefix$filesystemname)
    # prepare MTD writes
    # notify power management
    echo MODE=update > /dev/avm_power
    # prevent unwanted watchdog restarts, may be necessary but update is very fast
    # echo "disable" > /dev/watchdog
    # clear filesystem first
    debug "copy_wrapper_filesystem: src=$src, rootfs=$rootfsname"
    $update_kernel_binary -o /dev/$mtdprefix$target >/dev/null 2>&1
    rc=$?
    debug "copy_wrapper_filesystem: clearing target device /dev/$mtdprefix$target, rc=$rc"
    if [ [COLOR="#FF0000"]$rc -ne 0[/COLOR] ]; then
        rc=44
    else
        fstype=$(detect_image_filesystem "$src")
        rc=$?
        if [ [COLOR="#FF0000"]$rc -eq 0[/COLOR] ]; then
            # mount squashfs and yaffs2 wrapper and copy from one to the other
            tmp="$(get_temp_dir)"
            mkdir -p $tmp/yaffs $tmp/wrapperfs
            mount -t yaffs2 /dev/$mtdblockname$target $tmp/yaffs
 [COLOR="#008000"]           if [ "$fstype" == "ext2" -o "$fstype" == "sqfs_dummy256_ext2" ]; then[/COLOR]
                # ext2 image with AVM's dummy header
                mount_ext2_image "$src" "$tmp/wrapperfs" "$fstype"
                rc=$?
                [COLOR="#00FF00"]mrc=$rc[/COLOR]
[COLOR="#008000"]            else[/COLOR]
                mount "$src" $tmp/wrapperfs 2>/dev/null
                rc=$?
                [COLOR="#00FF00"]mrc=$rc[/COLOR]
                if [ [COLOR="#FF0000"]$rc -ne 0[/COLOR] ]; then
                    # try to extract with unsquashfs3, if this is a 3.xx kernel based
                    # system without knowledge about SquashFS3 format while mounting
                    kernelversion=$(uname -r)
                    kernelversion=${kernelversion%%.*}
                    if [ $kernelversion -eq 3 -a x"$fstype" == x"squashfs3" ]; then
                        unpack_squashfs "$src" "$tmp" 2>&1 >/dev/null
                        rc=$?
                        if [ [COLOR="#FF0000"]$rc -eq 0[/COLOR] ]; then
                            rmdir "$tmp/wrapperfs"
                            mv "$tmp/$squashfsdirname" "$tmp/wrapperfs"
                            rc=$?
                            rm "$tmp/wrapperfs/$rootfsname"
                        fi
                    fi
                fi
            fi
            if [ [COLOR="#FF0000"]$rc -eq 0[/COLOR] ]; then
                tar -c -O -C $tmp/wrapperfs --exclude=$rootfsname . | tar -x -C $tmp/yaffs
                rc=$?
                debug "copy_wrapper_filesystem: copying done, rc=$rc"
                [ [COLOR="#FF0000"]$mrc -eq 0[/COLOR] ] && [COLOR="#0000CD"]umount $tmp/wrapperfs[/COLOR]
                umount $tmp/yaffs
                remove_directory "$tmp"
                rc=0
            fi
        fi
    fi
    debug "copy_wrapper_filesystem: exiting, rc=$rc"
    return $rc
}

EDIT:
Hier sind doch verschiedene Zeilen, insbesondere einige der von Dir farblich markierten Bereiche sind bei Dir anders!

Verwendest Du eine fehlerbereinigte Version des modfs-Skripts, d.h. Version > 0.3.1 ???

Gruß
Splenditnet

EDIT:
# pwd
/var/media/ftp/jw/modfs-0.3.1
# ls -la modfs
-rwxr-xr-x 1 root root 85032 Jul 26 18:09 modfs
#

aus Tarfile:
# tar tvpf modfs-0.3.1.tar
-rw-r--r-- root/root 85032 2015-07-26 18:09:50 modfs
-r--r--r-- root/root 17964 2015-05-11 18:09:34 README
-r--r--r-- root/root 28257 2015-05-11 18:04:02 README.ger
-r--r--r-- root/root 18092 2014-09-03 10:47:14 COPYING
drwxr-xr-x root/root 0 2015-06-08 15:11:19 locale/
-r--r--r-- root/root 12570 2015-06-08 15:13:35 locale/de
-r--r--r-- root/root 10771 2015-05-11 17:50:51 locale/en
drwxr-xr-x root/root 0 2015-06-08 15:10:26 files/
-r--r--r-- root/root 144392 2014-09-14 00:43:43 files/128MB_ext3.gz
drwxr-xr-x root/root 0 2015-07-18 12:53:43 bin/
lrwxrwxrwx root/root 0 2015-06-18 11:52:45 bin/212 -> VR9
lrwxrwxrwx root/root 0 2014-09-22 13:57:43 bin/185 -> VR9
lrwxrwxrwx root/root 0 2014-11-18 02:04:16 bin/175 -> VR9
lrwxrwxrwx root/root 0 2014-09-22 13:57:43 bin/203 -> VR9
lrwxrwxrwx root/root 0 2015-07-18 12:53:43 bin/193 -> VR9
drwxr-xr-x root/root 0 2015-07-26 18:49:37 bin/VR9/
-r-xr-xr-x root/root 431216 2015-07-26 18:49:26 bin/VR9/mksquashfs4
-r-xr-xr-x root/root 56420 2014-09-03 09:57:48 bin/VR9/unsquashfs3
-r-xr-xr-x root/root 361692 2015-07-26 18:49:37 bin/VR9/unsquashfs4
-r-xr-xr-x root/root 105824 2014-09-03 09:57:48 bin/VR9/mksquashfs3
drwxr-xr-x root/root 0 2015-07-26 17:53:11 modscripts/
-r-xr-xr-- root/root 1349 2014-09-22 12:08:06 modscripts/mod_profile
-r-xr-xr-x root/root 2251 2014-09-22 12:01:18 modscripts/mod_rc_tail_sh
-r-xr-xr-- root/root 3818 2014-09-22 13:18:21 modscripts/edit_rcuser
-r-xr-xr-- root/root 1202 2015-07-26 17:53:09 modscripts/mod_enable_telnet
-rwxr-xr-x root/root 11678 2015-07-18 11:06:02 modscripts/gui_boot_manager
-rw-r--r-- root/root 168 2015-07-26 18:50:47 md5sums
-rw-r--r-- root/root 552 2015-07-26 18:50:47 sha512sums
-rw-r--r-- root/root 296 2015-07-26 18:50:47 sha256sums
-rw-r--r-- root/root 200 2015-07-26 18:50:47 sha1sums
#
 
Zuletzt bearbeitet:
Eures Problem könnte etwas mit diesem busybox Commit zu tun haben, der erst seit der Version 1.23 enthalten ist.

Vor 1.23 hat "local foo" dazu geführt, dass "foo" zwar als local deklariert wurde, den initialen Wert jedoch von der äußeren (aufrufenden Umgebung) geerbt hat (eigentlich korrektes sh-Verhalten, man suche nach "local, it inherits" in man sh). Seit diesem Commit wird aber das Verhalten von bash umgesetzt, bei dem "local foo" dazu führt, dass "foo" deklariert wird und den initialen Wert "" (leer) gesetzt bekommt. Es stellt sich jedoch die Frage, wie kommt busybox-1.23 auf die Box - meines Wissens hat AVM diese Version noch in keiner Firmware verwendet.

p.s. Generell wird zu Zwecken der Portabilität empfohlen, immer "local foo=" zu verwenden.
 
Einerseits schreibst Du, dass Du auf die Freetz-Version von SquashFS4 umgestiegen bist, andererseits, wenn es darum geht, SquashFS4 Tools mit ins Image zu packen, nimmst Du immer noch Deine Version davon (wegen der Größe). Das hört sich für mich nach Mehraufwand an
Da hast Du tatsächlich recht, das ist ein Mehraufwand ... aber meinerseits zur Klarstellung: Die Binaries für das Einpacken in das SquashFS auf dem Zielsystem sind nicht Bestandteil von modfs. Wie Du weiter unten ja dann selbst konstatierst, habe ich noch einige zusätzliche (nennen wir sie "remove"-)Patches für die Verwendung in einem Target-Image, weil ich da eben weder eine Progressbar (damit auch keine libm) noch die Unterstützung der SquashFS-Formate aus der Vergangenheit brauche. Über den Umfang der denkbaren Streichungen waren wir uns ja auch nicht einig ... ich akzeptiere Deinen Standpunkt, da soviel wie möglich zu erhalten. Das kann ich persönlich aber auf meinen Boxen nicht gebrauchen und so komme ich wohl nicht um die Pflege einer eigenen Version herum. Das am Ende alles mit bedingter Übersetzung und entsprechender Auswahl in der Freetz-Konfiguration zu realisieren, lohnt den Aufwand einfach nicht und das ersatzlose Streichen willst (wolltest) Du ja eher nicht.

Daher der Vorschlag die in Freetz noch fehlenden Anpassungen aufzunehmen.
Da fehlt mir eben die Phantasie, wie das aussehen sollte ... wie oben geschrieben, will ich keine "ifdef"-Orgien feiern, dann habe ich nämlich wirklich mal ein Problem, wenn AVM weitere oder neue Änderungen vornehmen sollte. So, wie ich das zusammengestrichen hatte, gefiel es mir ganz gut und ich blickte auch noch durch, was da wann und warum passierte ... das war nicht das, was Du haben wolltest (und ja auch noch nicht richtig fertig, Du hast den Mail-Wechsel sicherlich auch aufgehoben) und ich habe mich damit abgefunden. Für meine eigenen Zwecke brauche ich eben weder "actions" noch "pseudo files" noch "excludes" ... das ist alles Ballast, der ggf. auch noch Fehler enthält. (OT: Auch der Grundsatz des "Code-Sparsamkeit" in einem so sensiblen Gerät wie einem Router ist ja ein Security-Aspekt ... hier kann ich jedem nur die (kurzweilige) Lektüre von http://shadow-file.blogspot.de/2015/04/broken-abandoned-and-forgotten-code_22.html ans Herz legen.)

Wären die modfs relevanten Patches in Freetz enthalten, wären wir gezwungen, diese mitzupflegen.
Es gibt keine "modfs-relevanten Patches". Für die "normale Funktion" von modfs werden nur beliebige (aufrufkompatible) Versionen von unsquashfs und mksquashfs benötigt, die das korrekte Format erzeugen. Daß ich die Dateinamen der Binaries ggü. den Target-Files aus Freetz etwas vereinfacht habe, ändert nichts am Inhalt der Dateien.

Im Moment (keine Ahnung, ob Du das weiter oben auch gelesen oder selbst getestet hast) funktionieren die dynamisch gelinkten Binaries aus dem Freetz-Trunk (und auch aus meiner eigenen buildroot-Umgebung) nicht auf einer Box mit 06.35 ... woran das liegt, weiß ich auch nicht - es kommt schlicht keine Meldung und auch mit strace ist auf Anhieb nichts zu sehen. Daher habe ich ohnehin die "full statically linked"-Variante aus Freetz dazugepackt ... und die ist bei der Größe der Binaries soweit jenseits von Gut und Böse, daß es vollkommen egal ist, ob da noch eine libm mit eingebacken ist oder nicht bzw. ob die auch noch jffs2 und ubifs kann (um mal etwas Absurdes ins Spiel zu bringen).

Das Argument mit dem Binary-Pfad lasse ich nicht gelten ;-) Das hat Dich nicht davon abgehalten, die Freetz-Version mit auszuliefern.
Richtig, das bezog sich auch nur darauf, daß ich eben nicht sofort bei der Aufnahme eines vorgeschlagenen Patches in Freetz einfach alles bei mir auf die Benutzung dieser neuen Möglichkeit aus Freetz umstellen kann, da es eben immer wieder Unterschiede zu dem gab(gibt), was ich bei mir habe oder brauche bzw. zu dem, was ich ursprünglich vorgeschlagen habe. Einfach nur zwei Binaries mit einem frischen Trunk zu bauen und diese dann in ein tar-File zu packen, ist ja ein Vorgang, den man locker von Hand ausführen kann - und das ist genau das, was ich für die "Auslieferung" der squashfs-tools für 4.3 in der Version aus dem Freetz-Trunk machen mußte (und gemacht habe).

Der Anreiz für mich bestand in erster Linie darin, ein Tool auf dem Build-Host zu haben, welches sowohl ZLIB als auch LZMA komprimierte Images unterstützt, denn einmal in das Binary verlagert spart es ein paar Fall-Unterscheidungen in fwmod (aktuell werden mittels unsquashfs3-multi alle bisher von AVM in Release-Versionen verwendeten SquashFS-Formate entpackt: squashfs2-lzma, squashfs3-lzma, squashfs3-zlib). Auf dem Host hätte ich weiterhin die C++ Version von liblzma1 verwenden können, aber "wo ich dran war" habe ich halt die für die C-only Version notwendigen Anpassungen mitgemacht.
Kann ich gut nachvollziehen, für mich war ja auch die Überlegung ausschlaggebend, daß ich gerne ein AIO-Binary für alle Formate hätte. Wenn ich das richtig verstehe, hast Du Dich aber auch entschlossen, auf die Integration von SQFS3 und SQFS4 (inkl. "AVM-BE") in ein einzelnes universelles Tool zu verzichten - kann ich auch wieder gut nachvollziehen.

Hmm, /usr/lib/freetz ist eigentlich völlig harmlos. Damit wird lediglich der Pfad angegeben, aus dem die Libraries bevorzugt geladen werden sollten. Existiert der Pfad nicht bzw. enthält die nötige Library nicht, so werden ganz normal alle anderen Standard-Pfade durchsucht (/lib, /usr/lib) und die Libraries aus diesen geladen.
Auch das ist ja nicht der Punkt ... die "feste Verdrahtung" dieses Pfades macht es eben bei allen mit dem "puren" Freetz-Trunk übersetzten Programmen (auch wenn man die eigentlich außerhalb eines Freetz-Images benutzen will, wo es eben kein /usr/lib/freetz gibt) notwendig, entweder über LD_LIBRARY_PATH eine andere Suchreihenfolge einzustellen (was der ctlmgr i.d.R. nicht mag - zumindest bei mir nicht - aber immerhin funktioniert die libdl der uClibc inzwischen auch mit vielen LD-Variablen) oder die jeweiligen Packages gleich beim Erstellen (mit dem Freetz-Trunk) entsprechend zu patchen, damit die ihre eigene Suchreihenfolge benutzen bzw. einen anderen RPATH verwenden.

Ich wollte nur aufzeigen, daß das Freetz-Buildsystem eben ziemlich genau auf das Erzeugen eines Freetz-Images abgestimmt ist (das ist ja sicherlich auch gut so) und man somit ohnehin immer eine abweichende Umgebung haben wird, wenn man eben keine Freetz-Images erzeugen will - der /usr/lib/freetz-Path ist da nur das prominenteste Beispiel, weil der praktisch bei jedem von mir verwendeten Paket aus dem Freetz-Trunk (soviele sind es auch wieder nicht) angepaßt werden muß und das aufgrund unterschiedlichen Vorgehens in den jeweiligen mk-Files auch immer von Fall zu Fall zu suchen ist.

Da wäre eben ein passendes "Setting" in der Freetz-Konfiguration eine große Erleichterung (und würde auch die Flexibilität von Freetz-Packages erhöhen, wenn da eben auch mal /var/media/ftp/<package>/lib stehen könnte, ohne daß man den "external"-Mechanismus bemühen muß um einige Programme aus dem SquashFS auszulagern) ... aber das ist nur ein Problem eines "Außenseiters", der den Freetz-Trunk eigentlich nur anderen für die Übersetzung von Programmen ans Herz legt, die er ansonsten selbst bereitstellen (und pflegen) müßte.

p.s. Das Angebot, die modfs relevanten Patches aufzunehmen (unter den genannten Prämissen), gilt weiterhin.
Wie gesagt, ich habe zwar sogar den Trac-Account gelöscht, um weiteren Diskussionen aus dem Weg zu gehen ... aber ich sehe einfach auch keine "modfs-relevanten Patches" in diesem Zusammenhang.

Irgendwann (wenn ich den Eindruck gewinne, daß dieser Teil des Trunks eine gewisse Stabilität erreicht hat) werde ich sicherlich mal hingehen und mir ansehen, was Du da wie gemacht hast (die CS liefern ja nur eine beschränkte Sicht) ... ich habe ja bei mir noch nicht einmal die Integration der Quellen für das Entpacken und das Packen in einer gemeinsamen Code-Basis realisiert.

Eigentlich erstaunt mich sogar der Aufwand, den Du da betrieben hast ... jedenfalls in Anbetracht früherer Argumentationen, daß ja AVM eigentlich die Quellen zum AVM-BE-Format "liefern" müßte. Wenn die dann wirklich mal kommen, kannst Du ja nur überlegen, ob Du bei Deiner eigenen Implementierung bleibst oder Dir die ganze Arbeit noch einmal machst.

Ich hatte das ja von Beginn an nur als Interimslösung bis zur Veröffentlichung der AVM-Sourcen gesehen und angelegt und dann muß es weder schön noch "sophisticated" sein - es muß nur einfach funktionieren.

Insofern warte ich an der Stelle auch erst einmal die AVM-Quellen ab (wie schon mal in einer E-Mail geschrieben, könnte ich mir sogar vorstellen, daß AVM das BE-Format nur über "actions" beim mksquashfs erzeugen läßt, was eine richtig elegante Lösung wäre) und vergleiche dann mit Deinem Ansatz.

Je nachdem, wo ich weniger Aufwand habe, werde ich dann eine neue Basis meiner zusätzlichen Patches wählen - wobei die mit "modfs" dann immer noch nur am Rande zu tun haben. Alles, was man für "modfs" braucht, bietet der Freetz-Trunk jetzt schon an, die soweit wie möglich verkleinerte Form der Target-Tools zum Einpacken in das Image auf der Box sind weder für die Modifikation notwendig noch werden sie von mir in binärer Form angeboten (solange es nicht dieselben Tools sind, wie bei den SQFS3-Utilities).
 
@splenditnet:
Du hast irgendwie eine "Zwischenversion" erwischt (wenn ich das richtig sehe, unterscheidet sich neben der Tab-Weite nur noch die zusätzliche Zeile "mrc=$rc" im "if"-Zweig) ... welche da vor Deinem Hinweis zu den falschen Permissions (die ja dann zu einer Änderung führten) auf dem Server stand (zumindest die letzten drei Tage, wenn nicht länger), weiß ich jetzt auch nicht mehr. Ggf. kriegt das ja jemand von den anderen in diesem Thread noch heraus ... die fehlende Zeile ist jedenfalls eine Korrektur, die nach meinem Git-Stand schon am 26.07. eingecheckt wurde (und auch seitdem so auf dem Server stand):
Code:
commit 4329f27fd469af2137803826363ff128519cde3a
Author: ****
Date:   Sun Jul 26 20:27:20 2015 +0200

    published version 0.3.1

diff --git a/mods/modfs/bin/193 b/mods/modfs/bin/193
new file mode 120000
index 0000000..356dfa6
--- /dev/null
+++ b/mods/modfs/bin/193
@@ -0,0 +1 @@
+VR9
\ No newline at end of file
diff --git a/mods/modfs/bin/VR9/mksquashfs4 b/mods/modfs/bin/VR9/mksquashfs4
index 206c124..8d359d2 100755
Binary files a/mods/modfs/bin/VR9/mksquashfs4 and b/mods/modfs/bin/VR9/mksquashfs4 differ
diff --git a/mods/modfs/bin/VR9/unsquashfs4 b/mods/modfs/bin/VR9/unsquashfs4
index bac131e..c15ee88 100755
Binary files a/mods/modfs/bin/VR9/unsquashfs4 and b/mods/modfs/bin/VR9/unsquashfs4 differ
diff --git a/mods/modfs/modfs b/mods/modfs/modfs
index af0725b..34e4173 100644
--- a/mods/modfs/modfs
+++ b/mods/modfs/modfs
@@ -596,7 +596,7 @@ copy_running_system()
 #
 copy_wrapper_filesystem()
 {
-       local rc target src="$1" tmp fstype
+       local rc target src="$1" tmp fstype mrc=0 kernelversion
        target=$(get_mtd_by_name $reservedprefix$filesystemname)
        # prepare MTD writes
        # notify power management
@@ -622,15 +622,33 @@ copy_wrapper_filesystem()
                                # ext2 image with AVM's dummy header
                                mount_ext2_image "$src" "$tmp/wrapperfs" "$fstype"
                                rc=$?
+                               mrc=$rc
                        else
-                               mount "$src" $tmp/wrapperfs
+                               mount "$src" $tmp/wrapperfs 2>/dev/null
                                rc=$?
+                               mrc=$rc
+                               if [ $rc -ne 0 ]; then
+                                       # try to extract with unsquashfs3, if this is a 3.xx kernel based
+                                       # system without knowledge about SquashFS3 format while mounting
+                                       kernelversion=$(uname -r)
+                                       kernelversion=${kernelversion%%.*}
+                                       if [ $kernelversion -eq 3 -a x"$fstype" == x"squashfs3" ]; then
+                                               unpack_squashfs "$src" "$tmp" 2>&1 >/dev/null
+                                               rc=$?
+                                               if [ $rc -eq 0 ]; then
+                                                       rmdir "$tmp/wrapperfs"
+                                                       mv "$tmp/$squashfsdirname" "$tmp/wrapperfs"
+                                                       rc=$?
+                                                       rm "$tmp/wrapperfs/$rootfsname"
+                                               fi
+                                       fi
+                               fi
                        fi
                        if [ $rc -eq 0 ]; then
                                tar -c -O -C $tmp/wrapperfs --exclude=$rootfsname . | tar -x -C $tmp/yaffs
                                rc=$?
                                debug "copy_wrapper_filesystem: copying done, rc=$rc"
-                               umount $tmp/wrapperfs
+                               [ $mrc -eq 0 ] && umount $tmp/wrapperfs
                                umount $tmp/yaffs
                                remove_directory "$tmp"
                                rc=0
Da habe ich den oben erläuterten Teil zum Downgrade noch nachträglich eingebaut ... das korreliert zeitlich auch mit dem Datum bzw. der Uhrzeit meines entsprechenden Beitrags hier.

Ich kann mir das nur noch so erklären, daß ich event. vergessen hatte, eine der drei möglichen URLs

http://yourfritz.de/modfs-0.3.1.tgz
http://yourfritz.de/modfs_with_0635.tgz
http://yourfritz.de/7490/modfs.tgz

zu ersetzen. Leider kriege ich das nachträglich auch nicht mehr heraus, da alle drei heute nachmittag nach Deinem Hinweis zu den Permissions aktualisiert wurden.

Aber zumindest sollte das Problem bei Dir auch verschwunden sein, wenn Du eine frische Version lädst ... das ist ja auch schon ein Erfolg. Und wenigstens hat die Protokollierung das erste Mal außerhalb meiner eigenen Box etwas gebracht ...
 
@splenditnet:
Reply to #224

Hallo PeterPawn,
nun habe ich wie gewünscht neue modfs-0.3.1 (Releasedatum 01.08.2015) installiert
http://yourfritz.de/modfs-0.3.1.tgz

der FW-Update von 06.24 nach 06.30 funktioniert nun ohne Probleme,
jedoch läuft der Update von 06.30 nach 06.35-30987 in Fehler

Code:
# MODFS_DEBUG=1 MODFS_BUFSIZE=32 ./modfs update /var/media/ftp/jw/fritzbox-labor_7490-30987/FRITZ.Box_7490_Labor.113.06.35-30987.image
Using debug mode with a 32 KB buffer
Ermitteln der Hardware-Version ... OK
Prüfen, ob die Hardware-Version unterstützt wird ... OK
Suchen der Einstellung zur Umschaltung auf das alternative System ... OK
Prüfen der aktuell zu startenden Systemversion ... OK
Suchen der aktuellen Kernel-Partition ... OK
Suchen der alternativen Kernel-Partition ... OK
Vergleich der Systeme in den Kernel-Partitionen ... übersprungen
Suchen der aktuellen Dateisystem-Partition ... OK
Suchen der alternativen Dateisystem-Partition ... OK
Überprüfen des zur Verfügung stehenden Speicherplatzes im RAM ... OK
Überprüfen des freien Speicherplatzes für das Auspacken des Dateisystems ... OK

Das System erfüllt die Voraussetzungen zur Modifikation des root-Dateisystems.

Im Moment läuft auf der Box die Version: 113.06.30

Die Angabe einer Datei nach dem 'update'-Parameter unterbindet jede Versionprüfung.
Somit ist jeder selbst dafür zuständig, die Kompatibilität der vorhandenen Einstellungen
mit dem verwendeten System sicherzustellen, speziell wenn ein Downgrade ausgeführt wurde
oder ggf. die 'Werkseinstellungen' wiederherzustellen.

Die angegebene Datei '/var/media/ftp/jw/fritzbox-labor_7490-30987/FRITZ.Box_7490_Labor.113.06.35-30987.image' wird als Quelle für die Aktualisierung genutzt.
Extrahieren des neuen Kernel-Images aus dem Firmware-Image ... OK
Extrahieren des Flash-Filesystems aus dem Firmware-Image ... OK
Extrahieren des Wurzeldateisystems aus dem Flash-Filesystem ...mount: mounting  on /var/tmp/4200_1438523222 failed: Invalid argument
 Fehler
Das extrahierte 'äußere Dateisystem' kann nicht eingebunden werden.

das Debuglog sieht wie folgt aus:
Code:
# showshringbuf modfs
2015-08-02 15:46:58.561 - modfs: starting modfs script version 0.3.1-01082015
2015-08-02 15:46:58.578 - modfs: script=./modfs
2015-08-02 15:46:58.600 - modfs: using language de
2015-08-02 15:46:58.629 - modfs: using temporary file list from /var/tmp/4200_filelist_1438523218
2015-08-02 15:46:58.646 - modfs: cleanup trap set
2015-08-02 15:46:58.663 - modfs: invoked with: update /var/media/ftp/jw/fritzbox-labor_7490-30987/FRITZ.Box_7490_Labor.113.06.35-30987.image
2015-08-02 15:46:58.682 - modfs: noversioncheck=1, update_file_provided=1
2015-08-02 15:46:58.699 - modfs: firmware_update_file=/var/media/ftp/jw/fritzbox-labor_7490-30987/FRITZ.Box_7490_Labor.113.06.35-30987.image
2015-08-02 15:46:58.717 - check_prerequisites: starting checks
2015-08-02 15:46:58.774 - progress: mode=1, msg=Ermitteln der Hardware-Version ...
2015-08-02 15:46:58.808 - check_prerequisites: hwrev=185
2015-08-02 15:46:58.865 - progress: mode=3, msg= OK
2015-08-02 15:46:58.924 - progress: mode=1, msg=Prüfen, ob die Hardware-Version unterstützt wird ...
2015-08-02 15:46:58.944 - check_prerequisites: supported hardware revision
2015-08-02 15:46:59.002 - progress: mode=3, msg= OK
2015-08-02 15:46:59.061 - progress: mode=1, msg=Suchen der Einstellung zur Umschaltung auf das alternative System ...
2015-08-02 15:46:59.095 - check_prerequisites: system switch value is 1
2015-08-02 15:46:59.154 - progress: mode=3, msg= OK
2015-08-02 15:46:59.212 - progress: mode=1, msg=Prüfen der aktuell zu startenden Systemversion ...
2015-08-02 15:46:59.342 - progress: mode=3, msg= OK
2015-08-02 15:46:59.401 - progress: mode=1, msg=Suchen der aktuellen Kernel-Partition ...
2015-08-02 15:46:59.427 - check_prerequisites: kernel device is /dev/mtdblock2
2015-08-02 15:46:59.485 - progress: mode=3, msg= OK
2015-08-02 15:46:59.543 - progress: mode=1, msg=Suchen der alternativen Kernel-Partition ...
2015-08-02 15:46:59.569 - check_prerequisites: alternative kernel device is /dev/mtdblock0
2015-08-02 15:46:59.628 - progress: mode=3, msg= OK
2015-08-02 15:46:59.686 - progress: mode=1, msg=Vergleich der Systeme in den Kernel-Partitionen ...
2015-08-02 15:46:59.745 - progress: mode=3, msg= übersprungen
2015-08-02 15:46:59.804 - progress: mode=1, msg=Suchen der aktuellen Dateisystem-Partition ...
2015-08-02 15:46:59.829 - check_prerequisites: filesystem device is /dev/mtdblock3
2015-08-02 15:46:59.889 - progress: mode=3, msg= OK
2015-08-02 15:46:59.948 - progress: mode=1, msg=Suchen der alternativen Dateisystem-Partition ...
2015-08-02 15:46:59.974 - check_prerequisites: alternative filesystem device is /dev/mtdblock1
2015-08-02 15:47:00.032 - progress: mode=3, msg= OK
2015-08-02 15:47:00.093 - progress: mode=1, msg=Überprüfen des zur Verfügung stehenden Speicherplatzes im RAM ...
2015-08-02 15:47:00.118 - check_free_tmpfs: wanted=25165824, needed=10485760
2015-08-02 15:47:00.148 - check_free_tmpfs: exiting, rc=0
2015-08-02 15:47:00.206 - progress: mode=3, msg= OK
2015-08-02 15:47:00.265 - progress: mode=1, msg=Überprüfen des freien Speicherplatzes für das Auspacken des Dateisystems ...
2015-08-02 15:47:00.291 - find_free_storage_space: needed=140509184, accept=
2015-08-02 15:47:00.427 - get_nand_mountpoint: location=/var/media/ftp
2015-08-02 15:47:00.457 - check_free_nand: size=140509184, nand=/var/media/ftp, free=339517440
2015-08-02 15:47:00.476 - find_free_storage_space: /var/media/ftp:339517440
2015-08-02 15:47:00.494 - find_free_storage_space: exiting, rc=0
2015-08-02 15:47:00.553 - progress: mode=3, msg= OK
2015-08-02 15:47:00.570 - check_prerequisites: exiting, rc=0
2015-08-02 15:47:01.340 - modfs: source=file_update
2015-08-02 15:47:01.367 - modfs: firmware update file=/var/media/ftp/jw/fritzbox-labor_7490-30987/FRITZ.Box_7490_Labor.113.06.35-30987.image
2015-08-02 15:47:01.432 - progress: mode=3, msg=Die angegebene Datei '/var/media/ftp/jw/fritzbox-labor_7490-30987/FRITZ.Box_7490_Labor.113.06.35-30987.image' wird als Quelle für die Aktualisierung genutzt.
2015-08-02 15:47:01.452 - find_free_space: wanted=32M, order=tmpfs nand storage
2015-08-02 15:47:01.476 - check_free_tmpfs: wanted=33554432, needed=33554432
2015-08-02 15:47:01.505 - check_free_tmpfs: exiting, rc=0
2015-08-02 15:47:01.522 - find_free_space: tmpfs=/var/tmp
2015-08-02 15:47:01.539 - find_free_space: exiting, rc=0
2015-08-02 15:47:01.557 - get_working_directory: /var/tmp
2015-08-02 15:47:01.575 - modfs: working directory=/var/tmp
2015-08-02 15:47:01.603 - modfs: image directory=/var/tmp/1438523221
2015-08-02 15:47:01.659 - progress: mode=1, msg=Extrahieren des neuen Kernel-Images aus dem Firmware-Image ...
2015-08-02 15:47:01.678 - extract_kernel: src=/var/media/ftp/jw/fritzbox-labor_7490-30987/FRITZ.Box_7490_Labor.113.06.35-30987.image, target=/var/tmp/1438523221/kernel.image
2015-08-02 15:47:01.730 - extract_kernel: exiting, rc=0
2015-08-02 15:47:01.787 - progress: mode=3, msg= OK
2015-08-02 15:47:01.844 - progress: mode=1, msg=Extrahieren des Flash-Filesystems aus dem Firmware-Image ...
2015-08-02 15:47:01.861 - extract_filesystem: src=/var/media/ftp/jw/fritzbox-labor_7490-30987/FRITZ.Box_7490_Labor.113.06.35-30987.image, target=/var/tmp/1438523221/filesystem.image
2015-08-02 15:47:02.107 - extract_filesystem: exiting, rc=0
2015-08-02 15:47:02.164 - progress: mode=3, msg= OK
2015-08-02 15:47:02.222 - progress: mode=1, msg=Extrahieren des Wurzeldateisystems aus dem Flash-Filesystem ...
2015-08-02 15:47:02.239 - extract_rootfs_from_wrapper: src=/var/tmp/1438523221/filesystem.image, target=/var/tmp/1438523221/filesystem_core.squashfs
2015-08-02 15:47:02.284 - detect_image_filesystem: src=/var/tmp/1438523221/filesystem.image, fstype=sqfs_dummy256_ext2, rc=0
2015-08-02 15:47:02.314 - get_temp_dir: directory=/var/tmp/4200_1438523222
2015-08-02 15:47:02.333 - mount_ext2_image: src=/var/tmp/1438523221/filesystem.image, mp=/var/tmp/4200_1438523222, type=sqfs_dummy256_ext2
2015-08-02 15:47:02.394 - mount_ext2_image: exiting, rc=255
2015-08-02 15:47:02.424 - remove_directory: directory=/var/tmp/4200_1438523222, rc=0
2015-08-02 15:47:02.441 - extract_rootfs_from_wrapper: exiting, rc=40
2015-08-02 15:47:02.497 - progress: mode=3, msg= Fehler
2015-08-02 15:47:02.554 - cleanup: running cleanup from file /var/tmp/4200_filelist_1438523218
2015-08-02 15:47:02.570 - rm -r /var/tmp/1438523221
 
jedoch läuft der Update von 06.30 nach 06.35-30987 in Fehler
Ok, das ist vermutlich ein Folgefehler der letzten Änderung aus #212 von gestern abend ("losetup" der Busybox kennt kein "--show") ... Du hast wahrscheinlich keine BB mit einem losetup-Applet und damit greift er bei Dir wieder auf die Variante aus /sbin/losetup zurück, die in der 06.30 noch existiert (die verschwindet erst in der 06.35 und damit greift das Umschalten auf "dd" erst dann). Die Version aus /sbin liefert jedoch bei "losetup -a" wieder ein etwas abweichendes Format, daher klappt das Parsen des Loop-Devices aus dieser Ausgabe vermutlich nicht.

Ich habe eine korrigierte Version (gleiche URL) bereitgestellt ...
 
Im Moment (keine Ahnung, ob Du das weiter oben auch gelesen oder selbst getestet hast) funktionieren die dynamisch gelinkten Binaries aus dem Freetz-Trunk (und auch aus meiner eigenen buildroot-Umgebung) nicht auf einer Box mit 06.35 ... woran das liegt, weiß ich auch nicht - es kommt schlicht keine Meldung und auch mit strace ist auf Anhieb nichts zu sehen.
Ich habe es gelesen, allerdings selbst noch nicht getestet und kann daher zum aktuellen Zeitpunkt nichts sinnvolles dazu sagen. Im allgemeinen ist es aber so, dass beim Übersetzen von uClibc eine zur Laufzeitumgebung "kompatible" Kernel-Version verwendet werden soll (als Beispiel für Effekte, die dabei auftreten können, s. z.B. #2519). Das ist bei Freetz mit 2.6.32 vs. 3.10.73 nicht unbedingt der Fall. Die uClibc-config-Optionen sowie die auf uClibc angewandten Patches könnten auch von Bedeutung sein. Mit Deiner Buildroot-Umgebung (vorausgesetzt es ist dieselbe Version wie die von AVM verwendete - 2014.08 ) könntest Du einige der Punkte ausschließen. Sollte es tatsächlich daran liegen, so kann es dazu führen, dass man uClibc-Version spezifische Binaries ausliefern muss. Das ist auch irgendwie blöd - da sind die statisch gelinkten Binaries dann u.U. sogar die bessere Lösung.

die "feste Verdrahtung" dieses Pfades macht es eben bei allen mit dem "puren" Freetz-Trunk übersetzten Programmen notwendig, entweder über LD_LIBRARY_PATH eine andere Suchreihenfolge einzustellen oder die jeweiligen Packages gleich beim Erstellen (mit dem Freetz-Trunk) entsprechend zu patchen, damit die ihre eigene Suchreihenfolge benutzen bzw. einen anderen RPATH verwenden.
Diesen Punkt habe ich nicht ganz verstanden. Mal angenommen Freetz würde Binaries ohne RPATH erstellen oder Du würdest ein dynamisch gelinktes Binary von sonst wo bekommen. Sofern Du die notwendigen Libraries unter /lib bzw. /usr/lib nicht ablegen kannst, musst Du doch immer noch LD_LIBRARY_PATH setzen, damit die Libraries gefunden werden. Also ändert Freetz dadurch, dass es RPATH setzt, rein gar nichts an dem, was man machen muss, wenn nicht alle notwendigen Libraries auf der Box vorhanden sind.

Ich wollte nur aufzeigen, daß das Freetz-Buildsystem eben ziemlich genau auf das Erzeugen eines Freetz-Images abgestimmt ist (das ist ja sicherlich auch gut so) und man somit ohnehin immer eine abweichende Umgebung haben wird, wenn man eben keine Freetz-Images erzeugen will - der /usr/lib/freetz-Path ist da nur das prominenteste Beispiel, weil der praktisch bei jedem von mir verwendeten Paket aus dem Freetz-Trunk (soviele sind es auch wieder nicht) angepaßt werden muß und das aufgrund unterschiedlichen Vorgehens in den jeweiligen mk-Files auch immer von Fall zu Fall zu suchen ist.
Diesen Punkt habe ich auch nicht ganz verstanden. Sofern Du Freetz nur zum Übersetzen von den Binaries verwendest, reicht es an genau einer Stelle dieses /usr/lib/freetz anzupassen und dann wird ein anderer Pfad gesetzt/verwendet.

Eigentlich erstaunt mich sogar der Aufwand, den Du da betrieben hast ... jedenfalls in Anbetracht früherer Argumentationen, daß ja AVM eigentlich die Quellen zum AVM-BE-Format "liefern" müßte. Wenn die dann wirklich mal kommen, kannst Du ja nur überlegen, ob Du bei Deiner eigenen Implementierung bleibst oder Dir die ganze Arbeit noch einmal machst.
Hmm, die Argumentation bezog sich ausschließlich auf SquashFS-AVM-BE-Zeug. Da war der Aufwand eigentlich nicht so groß - der So. vor 3 Wochen, wo wir uns zerstritten haben (viele kleinen Commits und... lange Mails ;-) ) und der So. danach - ein einziger Commit r13265, wo ich es endgültig auf einen aus meiner Sicht recht guten Stand gebracht habe. Der gesamte Restaufwand galt irgendwelchen völlig anderen Baustellen.

Insofern warte ich an der Stelle auch erst einmal die AVM-Quellen ab (wie schon mal in einer E-Mail geschrieben, könnte ich mir sogar vorstellen, daß AVM das BE-Format nur über "actions" beim mksquashfs erzeugen läßt, was eine richtig elegante Lösung wäre) und vergleiche dann mit Deinem Ansatz.
Glaube ich eher nicht. Von dem, was ich in Bezug auf die actions in der letzten SquashFS git-Version gesehen habe, gibt es da keine Möglichkeit LE vs. BE über die actions zu swappen. Daten dynamisch zu generieren - ja, die internen FS Datenstrukturen zu swappen - nein. Ich glaube das ganze AVM-BE-Format ist eher ein Unfall bzw. eine Performance-Optimierung von AVM. Die Zielboxen sine alle BE-Boxen, daher BE (das ist bisher immer so gewesen, Endianess der Box hat mit der Endianness von SquashFS übereingestimmt) und das Block-Length-Feld ist einfach ein Unfall ;-)

Ich habe übrigens in r13295 versucht, das AVM-BE-Format mehr oder weniger zu dokumentieren.
 
Das ist auch irgendwie blöd - da sind die statisch gelinkten Binaries dann u.U. sogar die bessere Lösung.
Worin denkbare Ursachen liegen, ist schon klar ... aber daß es keine "echte" Exception gibt (und auch keine Fehlermeldungen vom LD), ist eben schon etwas komisch. Auch die Tatsache, daß ältere Versionen mit dynamischer Library-Nutzung (die squashfs3-Utilities in modfs stammen vom 03. Sept. 2014 und stützen sich auf den damals aktuellen Freetz-Trunk, denn das war der erste Vorschlag für diese "target tools" von mir) klaglos funktionieren, macht da einen Unterschied in der uClibc, der sich erst anschließend "eingeschlichen" hat, plausibel. Aber worin er nun wirklich liegt, habe ich nicht getestet ...

Für mich heißt das am Ende nur, daß Du vermutlich mit der Bereitstellung von Freetz für die 06.35 doch wenigstens noch so lange warten mußt (oder eben raten und probieren), bis wenigstens die Kernel- und uClibc-Konfiguration von AVM veröffentlicht wurde oder Du nimmst komplett eigene Libs für die Freetz-Pakete - meines Wissens momentan nicht der Fall oder ich bin wieder mal nicht auf dem Laufenden.

Mal angenommen Freetz würde Binaries ohne RPATH erstellen oder Du würdest ein dynamisch gelinktes Binary von sonst wo bekommen.
Ich meinte tatsächlich einen konfigurierbaren RPATH. Diese eine Variable im Basis-Makefile ist neu für mich ... wenn die über alle Packages auch tatsächlich durchgezogen wurde und nicht mehr direkt "vor Ort" angegeben wird (als ich damit begann, war das m.E. noch so, zumindest partiell), dann ist damit eines meiner Probleme tatsächlich Geschichte, ohne daß ich es bemerkt hätte.

Aber eben auch nur das der Suchreihenfolge nach Libraries ... die diversen anderen "Freetz-Patches", die z.B. die Config-Pfade usw. fest auf /mod/etc/irgendwas festtackern (m.W. ist "dropbear" das einzige Paket, das einen "externen" Einsatz explizit unterstützt und auch da wird dann eben ein Pfad /tmp/irgendwas fest gesetzt, was das Freetz-GUI wieder gar nicht kann), sind weitere Stellen, wo man bei einem "make" für "non-Freetz" eingreifen muß.

Wie gesagt, das ist ja vollkommen legitim und "gutes Recht" von Freetz ... wenn jemand das Build-System "mißbrauchen" will, muß er eben etwas mehr Aufwand treiben.

Aber teilweise würden schon winzige Änderungen (die ich gerne anhand von zwei oder drei Paketen konkret vorschlagen kann als Patch) zu einer erhöhten "Universalität" führen können, z.B. indem man kleine Include-Files in die mk-Files zieht, die im Normalfall nichts ändern (praktisch leer sind oder irgendeine "customized"-Variable setzen/enthalten oder sogar die sinnvoll zu ändernden Variablen als "Freetz-Standard" zusammenfassen), wo aber der Nutzer seine eigenen Einstellungen hinterlegen kann, ohne am mk-File herumdoktern zu müssen.

Dann hat man auch beim "svn update" nicht unbedingt ein "merge problem", denn die eigenen Einstellungen zum Überschreiben der Standards liegen ja dann unabhängig vom mk-File vor und dort ggf. vorgenommene Änderungen (das geht ja bei jedem Version-Bump schon los) führen nicht zu einem Konflikt - wenn so ein Include-File "M" ist, entsteht ja noch nicht automatisch auch ein Merge-Konflikt, solange die Upstream-Variante nicht auch neuer ist.

Und so kann man dann eben auch das "originale Freetz-Buildsystem" benutzen, um sich die ganzen Pakete, die in Binärform durch das Internet schwirren (von Busybox bis Apache mit PHP) und häufig genug bei den Boxen mit NAND-Storage unter /var/media/ftp auch direkt von dort gestartet werden, so zu konfigurieren, daß die Pfade zur eigenen FRITZ!Box passen - läßt man diese "custom configuration" weg, wird eben für Freetz "gebaut". Im Moment ist man jedenfalls ziemlich erschossen, wenn es um solche Fragen wie eine einheitliche Konfiguration der Pfade geht, weil das teilweise über Patch-Files und teilweise über Anweisungen im mk-File gehandhabt wird. Das kann man zwar sicherlich auch in die komplette Konfiguration einbauen (also für "make *config" zusätzliche Punkte daraus machen), aber das wäre dann für mich wieder Overkill, weil das auch nur einmal geändert wird vom Nutzer.

Aber wie weiter oben geschrieben ... wenn es inzwischen tatsächlich diese eine Make-Variable gibt (die man ja dann auch nur für einzelne Pakete gezielt ändern kann während des "make"), mit der man ein eigenes Verzeichnis an die Stelle von /usr/lib/freetz setzen kann, dann schaue ich mir bei den mir wichtigen Paketen demnächst den Inhalt des "make"-Verzeichnisses noch einmal an. Vielleicht kann ich da auch einige sehr alte Patches inzwischen "abschaffen" und durch einfachere Wege ersetzen (zumindest beim Relinken).

Aber wenn ich mir meine Liste der Pakete so ansehe, braucht eigentlich trotzdem jedes Paket mit einkompilierten Pfaden (dropbear ist da nur ein Beispiel und verwendet nicht einmal configure), die normalerweise beim "configure" gesetzt werden, seinen eigenen Patch ... meiner für das Dropbear-Paket sähe z.B. im Moment so aus (ein akuelles diff zwischen meinem Build-Verzeichnis und dem Freetz-Source-Verzeichnis, beschränkt auf die "options.h" - wo dropbear konfiguriert wird):
Code:
--- options.h
+++ options.h 
@@ -24,21 +24,21 @@
 #ifndef DB_NONFREETZ
 #define DSS_PRIV_FILENAME "/mod/etc/ssh/dss_host_key"
 #else
-#define DSS_PRIV_FILENAME "/var/tmp/dss_host_key"
+#define DSS_PRIV_FILENAME "/var/custom/services/secureshell/etc/dss_host_key"
 #endif
 #endif
 #ifndef RSA_PRIV_FILENAME
 #ifndef DB_NONFREETZ
 #define RSA_PRIV_FILENAME "/mod/etc/ssh/rsa_host_key"
 #else
-#define RSA_PRIV_FILENAME "/var/tmp/rsa_host_key"
+#define RSA_PRIV_FILENAME "/var/custom/services/secureshell/etc/rsa_host_key"
 #endif
 #endif
 #ifndef ECDSA_PRIV_FILENAME
 #ifndef DB_NONFREETZ
 #define ECDSA_PRIV_FILENAME "/mod/etc/ssh/ecdsa_host_key"
 #else
-#define ECDSA_PRIV_FILENAME "/var/tmp/ecdsa_host_key"
+#define ECDSA_PRIV_FILENAME "/var/custom/services/secureshell/etc/ecdsa_host_key"
 #endif
 #endif

@@ -64,7 +64,7 @@
 several kB in binary size however will make the symmetrical ciphers and hashes
 slower, perhaps by 50%. Recommended for small systems that aren't doing
 much traffic. */
-#define DROPBEAR_SMALL_CODE
+//#define DROPBEAR_SMALL_CODE

 /* Enable X11 Forwarding - server only */
 //#define ENABLE_X11FWD
@@ -112,7 +112,7 @@

 /* Enable CBC mode for ciphers. This has security issues though
  * is the most compatible with older SSH implementations */
-#define DROPBEAR_ENABLE_CBC_MODE
+//#define DROPBEAR_ENABLE_CBC_MODE

 /* Enable "Counter Mode" for ciphers. This is more secure than normal
  * CBC mode against certain attacks. This adds around 1kB to binary
@@ -141,7 +141,7 @@
 #define DROPBEAR_SHA1_96_HMAC
 #define DROPBEAR_SHA2_256_HMAC
 #define DROPBEAR_SHA2_512_HMAC
-#define DROPBEAR_MD5_HMAC
+//#define DROPBEAR_MD5_HMAC

 /* You can also disable integrity. Don't bother disabling this if you're
  * still using a cipher, it's relatively cheap. If you disable this it's dead
@@ -153,7 +153,7 @@
  * Removing either of these won't save very much space.
  * SSH2 RFC Draft requires dss, recommends rsa */
 #define DROPBEAR_RSA
-#define DROPBEAR_DSS
+//#define DROPBEAR_DSS
 /* ECDSA is significantly faster than RSA or DSS. Compiling in ECC
  * code (either ECDSA or ECDH) increases binary size - around 30kB
  * on x86-64 */
@@ -164,7 +164,7 @@
    with badly seeded /dev/urandom when systems first boot.
    This also requires a runtime flag "-R". This adds ~4kB to binary size (or hardly
    anything if dropbearkey is linked in a "dropbearmulti" binary) */
-#define DROPBEAR_DELAY_HOSTKEY
+//#define DROPBEAR_DELAY_HOSTKEY

 /* Enable Curve25519 for key exchange. This is another elliptic
  * curve method with good security properties. Increases binary size
@@ -202,7 +202,7 @@

 /* The MOTD file path */
 #ifndef MOTD_FILENAME
-#define MOTD_FILENAME "/etc/motd"
+#define MOTD_FILENAME "/var/custom/services/secureshell/etc/motd"
 #endif

 /* Authentication Types - at least one required.
@@ -299,7 +299,7 @@
  * OpenSSH), set the path below. If the path isn't defined, sftp will not
  * be enabled */
 #ifndef SFTPSERVER_PATH
-#define SFTPSERVER_PATH "/usr/lib/sftp-server"
+#define SFTPSERVER_PATH "/var/custom/services/secureshell/bin/sftp-server"
 #endif
 #endif

@@ -309,7 +309,7 @@
 #define _PATH_SSH_PROGRAM "/usr/bin/ssh"
 #else
 /* ssh is expected to be in PATH */
-#define _PATH_SSH_PROGRAM "ssh"
+#define _PATH_SSH_PROGRAM "/var/custom/services/secureshell/bin/ssh"
 #endif

 /* Whether to log commands executed by a client. This only logs the
@@ -352,7 +352,7 @@
 #define DEFAULT_IDLE_TIMEOUT 0

 /* The default path. This will often get replaced by the shell */
-#define DEFAULT_PATH "/usr/bin:/bin:/var/bin"
+#define DEFAULT_PATH "/var/custom/bin:/usr/bin:/bin"

 /* Some other defines (that mostly should be left alone) are defined
  * in sysoptions.h */
Am Ende führt so eben jede Änderung im Freetz, die den Ausgangszustand für diesen zusätzlichen Patch verändern würde (wenn man den mal als 900-irgendwas.patch ins make/<package>/patches gelegt hätte), zu Problemen ... da sich (bleiben wir mal bei diesem Beispiel mit dem dropbear) diese Werte auch außerhalb von "options.h" per -D beim gcc-Aufruf setzen ließen, wäre das eben ein solcher Fall, wo man mit einem Include-File für das mk-File anstelle eines Patches eine größere Flexibilität erreicht; von der Möglichkeit, da ein "Basisverzeichnis" zu verwenden - in meinem Falle eben "/var/custom(services/secureshell" anstelle von "/mod" beim Freetz - könnte man ja auch profitieren.

Wie gesagt, es gibt eine sehr enge "Verzahnung" zwischen den (vier) Teilen von Freetz, die sicherlich historisch gewachsen ist. Das ist weder verwerflich noch auf einen Schlag zu ändern ... aber u.a. solche Punkte meinte ich auch im Januar, als ich in der Mailingliste vom "Blick über den Tellerrand" geschrieben habe. Freetz war (und ist) sicherlich ein nettes Cross-Build-System, eine Quellcode-/Patch-Verwaltung für zusätzliche Pakete und sogar ein funktionierendes Tool zum Modifizieren von Stock-Firmware.

Was Freetz vielleicht einmal war (und es heute aber in meinen Augen nicht mehr ist), wäre eine moderne (und sichere) Oberfläche für die Verwaltung von Erweiterungen auf der FRITZ!Box. Da schlägt jedes NAS-GUI auch Freetz um Längen und selbst AVM hat beim GUI Freetz in meinen Augen lange abgehangen.

Das ist immer noch eine "Konfiguration für Spezialisten", was zum Zeitpunkt der Entstehung von Freetz sicherlich gerechtfertigt war, aber im Zeitalter von graphischen Oberflächen allerorten einfach nicht mehr so richtig zeitgemäß ist - genauso wenig wie die "starre Konfiguration" des Funktionsumfangs der Box zum Compile-Zeitpunkt.

Das mag auch für ältere FRITZ!Box-Modelle nicht ohne weiteres zu ändern sein ... aber für neue Modelle kann/muß man eben auch neue Wege gehen. Niemand erwartet von einer 7170, daß sie DECT kann ... warum sollte man erwarten, daß diese Box einfach per Download aus einem Repository einen OpenVPN-Server oder -Client "nachrüsten" kann? Für eine moderne 7490 oder 3490 ist das aber machbar (und heute irgendwie auch "erwartbar") und da muß man sich dann eben (meine Meinung) auch mental von solchen alten Schätzchen verabschieden und einfach mal sagen, man macht einen (begründeten(!), das ist ja keine Willkür) Schnitt.

Und solchen Möglichkeiten steht eben Freetz mit der "Fixierung" (nochmal, ich kann die auch verstehen, aber man darf sie ja trotzdem kritisieren) auf die Erstellung von Binaries für ein "Freetz-Image" ein klein wenig "im Wege".

Man wird sicherlich die Stock-Firmware immer in einem gewissen Umfang modifizieren müssen, um solche "dynamischen Pakete" verwirklichen zu können. Aber in erster Linie beim Skript-Code, um die diversen "Hooks" da irgendwo so einzubauen, daß die nachgerüsteten Erweiterungen von wichtigen Events benachrichtigt werden und eine Chance zur Reaktion erhalten.

Ansonsten würde sich so ein modifiziertes System eben ohne dynamische Pakete erst einmal 1:1 wie die Stock-Firmware verhalten ... das ist ein entscheidender Unterschied zum bisherigen Freetz-Ansatz. Daß selbst das bisherige Vorgehen in Freetz so seine Tücken hat und auch von einer einzigen AVM-Änderung schon kräftig durchgeschüttelt werden kann, brauche ich Dir ja nicht zu sagen ... die komplette Mount-Behandlung in Freetz ist eben sogar im Vergleich zur AVM-Implementierung ein echtes Monster, weil da sowohl ältere als auch neue Firmware-Versionen berücksichtigt werden sollen/müssen - von den "remove"-Patches funktionieren einige auch schon länger nicht mehr so, wie es früher einmal war (und sind größtenteils bei den NAND-Modellen ohnehin nicht notwendig, zumindest beim derzeitigen Umfang des root-FS).

Da ist eben auch Freetz auf den AVM-Weg eingeschwenkt (monolithische Software, die erst zum Ausführungszeitpunkt die konkrete Umgebung berücksichtigt und ggf. (bei AVM jedenfalls) auf der konkreten Box gar nicht verwendet werden kann) ... das ist aber kein Naturgesetz, daß man so vorgehen muß. Wenn es für einige Modelle eben "Spezialpakete" gibt (was sind heute wohl die Modelle in freier Wildbahn, die > 90% der FRITZ!Boxen ausmachen?), die nur die konkreten Gegebenheiten der jeweiligen Box berücksichtigen (wer wissen will, was ich damit meine, kann ja mal in der Firmware einer 7490 nach "DOCSIS" suchen - 248 Fundstellen bei der 7490), kann man einiges mit weit weniger Aufwand realisieren und muß nicht bei der nächsten größeren Änderung wieder eine zusätzliche "Sonderlocke" einbauen.

Für viele "normale Benutzer" ist vermutlich schon Freetz zu überladen ... wenn ich nur den Bedarf habe, einen OpenVPN-Client auf der Box nachzurüsten (und den auch per Knopfdruck wieder zu entsorgen), dann ist eben das Erstellen eines Freetz-Images für "geübte Linux-User" kein großes Problem, für viele andere aber schon.

Ich möchte auch nicht wissen, wieviele Freetz-Images schon sehr lange ihren Dienst tun, weil die Besitzer der Boxen die notwendigen Arbeiten bei einer Aktualisierung von Komponenten scheuen (eben die Erstellung eines kompletten neuen Images, möglichst noch mit einer VM, die zuletzt beim Erscheinen der 06.20 benutzt wurde) und mehr nach Artikel 3 des Rheinischen Grundgesetzes mit einer veralteten Installation leben.

Auch hier wäre eben ein modernerer Ansatz auf der Basis des Austauschs/der Erneuerung einzelner Pakete ein echter "Sicherheitsgewinn" ... ich sehe das bei meinen Kunden. Da stehe ich auch jedesmal (bei NOR-Modellen) vor der Frage, ob ich ein neues Image mit der gerade aktuellen OpenSSL-Version oder dem Version-Bump des OpenSSH-Pakets erzeuge oder bis zum nächsten Update warte. Kann ich das auch dynamisch austauschen (bei 7390 und Modellen mit NAND-Flash für das System ziemlich leicht zu realisieren), stellt sich die Frage nicht ... von der wesentlich leichteren Möglichkeit beim Test solcher Änderungen mal abgesehen.

Zwar kann man das theoretisch auch auf der Basis eines "external"-Images machen, aber auch das ist eben ein wesentlich höherer Aufwand als der gezielte Austausch eines einzelnen Pakets oder sogar nur einer Datei. Aber das ist am Ende tatsächlich eher "Philosophie", ob man da "external" und "einzelne Pakete" gleichsetzen will beim Austausch durch "fachkundiges Personal" ... das Ziel muß/soll es aber sein, solche Aktionen auch dem "weniger technikaffinen Benutzer" zu ermöglichen.

Die beliebtesten Erweiterungen dürften zweifellos ein SSH-Server, OpenVPN und meinetwegen noch dnsmasq sein ... damit hat man m.E. schon die Hälfte aller "Freetzer" bedient. Schon bei Asterisk dünnt das erheblich aus ... und alles andere sind dann ohnehin eher "Spezialfälle", wo sich der daran Interessierte sowieso entsprechend kundig machen muß.

Wenn man dann noch ein Apache-Paket - am besten auch noch PHP bzw. Perl, jeweils als gesondertes Paket - für entsprechend potente Boxen anbietet (das ist dann aber schon "hohe Schule"), fängt man auch noch einige Erweiterungen wie SaS und/oder FHEM wieder ein, von solchen Sachen wie der Wiedererweckung anderer Pakete (z.B. LCR) ganz zu schweigen. Daß man am Ende nicht allen Bedarf befriedigen kann, ist auch klar ... aber das machen nicht einmal "richtige Distributionen", daß sie für jeden erdenklichen Fall das passende Paket liefern.

Schon wenn man auf der Freetz-Seite eine Möglichkeit hätte, nur die OpenSSL-Libraries auf Knopfdruck auszutauschen, wäre das ein erheblicher Sicherheitsgewinn für viele Boxen (meine Meinung). Seitdem AVM da nicht mehr auf die eigenen Bibliotheken setzt (bzw. die höchstens noch als Wrapper zu den OpenSSL-Libs dienen), kann man auch durch den Austausch der SSL-Bibliotheken die Sicherheit der Stock-Firmware selbst verbessern, falls AVM für einen OpenSSL-Patch keine neue Firmware-Version auflegen will (was sicherlich auf absehbare Zeit noch jeweils nur bei anderen Änderungen miterledigt werden wird). Eigentlich hatte ich ja mal die Hoffnung, daß AVM beim Sprung auf einen 3er-Kernel so weit "hüpft", daß da gleich noch das OverlayFS auf Kernelebene mit drin ist (ab 3.18 m.W.) ... dann wäre das gezielte Ersetzen von SquashFS-Dateien ja schon mal "gegessen" (macht m.W. fast jedes "Live-System" heute so).

Wenn es aber am Ende wenigstens eine definierte Schnittstelle für "Freetz-Pakete" gäbe, mit denen man diese auch dynamisch nachrüsten kann (und da pfeife ich dabei auch darauf, wenn da ein paar Bibliotheken doppelt bzw. in jedem "Erweiterungspaket" vorhanden sind - notfalls hilft ja auch ein Symlink zum "AVM-Original" in /lib, wenn das gefunden wurde, damit da "sharing" funktioniert wg. des geringeren RAM-Bedarfs) ... dann gäbe es auch wieder eine Perspektive für Freetz und die "neue Nutzergeneration".

Die will eben eine FRITZ!Box eher so konfigurieren können wie das eigene Smartphone oder Tablet und hat zum größten Teil nicht mal eine Ahnung, was Linux eigentlich ist. Der Router ist aus der "Computer-Versteher-Ecke" eben auch heraus und wenn er daheim die Basis für das "Internet der Dinge" werden soll, dann muß er selbst vom "dummen Kunden" sehr einfach zu bedienen sein und weitgehend gegen Fehlkonfigurationen immunisiert werden.

Dem steht der derzeitige Ansatz mit einem kompletten Freetz-Image aber diametral entgegen ... AVM macht sich nach meinem Verständnis auf den Weg zu einem "Consumer-Gerät" (immer mehr Assistenten und aufgeräumte Interfaces, solange man "Standardansicht" verwendet) und das ist auch richtig so. Will man dann so eine Box nur ein kleines bißchen aufrüsten, braucht man im Moment aber noch "Spezialkenntnisse" und das zieht eben genau am anderen Ende des Stranges - vom abschreckenden Umfang der Freetz-"Erste Schritte"-Doku mal ganz zu schweigen. Die liest eben auch nur der Nerd, der seine Box tatsächlich unbedingt modifizieren will und neben dem Ehrgeiz auch die dazu notwendige Zeit zu investieren bereit ist - jeder normale Benutzer ist davon bereits verschreckt.

Das geht nicht gegen die Qualität und/oder den Umfang des Freetz-Wikis, das sind einfach "Zitate" von Leuten, denen ich die Verwendung von Freetz ans Herz gelegt habe und die schon bei der Installation eines VMware-Players auf ihrem Windows-PC die Segel streichen (selbst wenn der Hyper-V könnte). Im derzeitigen Zustand ist eben Freetz etwas für Nerds oder Geeks ... wenn es nichts weiter sein will, muß man da auch nichts ändern. Wenn es aber eine Perspektive geben soll und man eine breitere Nutzerbasis anstrebt (da kann man sogar die Leute einfangen, die vom Ausbau der debug.cfg und/oder des Telnet-Daemons betroffen sind), dann muß man sich eben der Masse der Nutzer annähern und darf nicht auf dem "von Geeks für Geeks"-Niveau verharren.

So, genug philosophiert ... vom hier schreiben entsteht ja nicht eine Zeile neuer Code und so bringt diese Diskussion - hoffentlich/wenigstens/vielleicht - neue Einsichten und/oder Mitstreiter oder auch mal einige andere Meinungen zu diesem Thema. Natürlich würde mich da in erster Linie die Meinung von Leuten interessieren, die die damit verbundene Arbeit einschätzen können und ggf. auch mitmachen wollen. Die Meinung der "Nur-Anwender" kenne ich bereits (aus Befragungen auch außerhalb des IPPF) ... wenn es so etwas gibt, nutzt man es auch.

Und da ich auch nicht zu den Leuten gehöre, die das Rad jedesmal neu erfinden müssen/wollen, wäre eines meiner Anliegen eben auch eine etwas größere Flexibilität des Freetz-Buildsystems (nicht auf einen Schlag - aber immer im Hinterkopf bei weiteren Änderungen) ... womit sich der Kreis dann wieder schließt und ich meine Gedanken doch wieder eingefangen hätte.
 
modfs und /var/custom/profile

Dieses RC-File namens /var/custom/profile … – das überdauert doch keinen Reboot, weil /var ein tmpfs (temporäres Filesystem) ist.

Aber welchen Sinn macht das dann?
Auch /var/custom ist natürlich schon nach dem Reboot weg.

Könnte ich da, bitte, eine Erklärung bekommen?
Ich habe schon gesucht, aber das hier war der einzige Treffer,
hat es aber nicht erklärt:

http://www.ip-phone-forum.de/showthread.php?t=272725
 
modfs und bootbare Systeme

Nach erfolgreicher Durchführung von modfs sehe ich unter "System / Sicherung / Neustart" also eine Liste möglicher, zu bootender Systeme.

Wenn ich unter "Neustart" mal nach "das inaktive System" (MTD2/MTD3) wechsle – wie komme ich wieder zurück zum (gemoddeten) laufenden System" in MTD0/MTD1 ?
 
Aber welchen Sinn macht das dann?
Man kann sich aber von der rc.user aus (oder meinetwegen von der debug.cfg aus, wenn der Name jemandem besser gefällt) dort ein Verzeichnis "/var/custom" und darin eine Datei "profile" anlegen. Diese enthält dann die Kommandos, die bei jedem Login auszuführen sind ... das kennt jeder Linux-Nutzer (es stammt allerdings tatsächlich aus dem Mainframe-Bereich vom VM/CMS meines Wissens) von jedem "normalen Login". Da kann man dann z.B. seine eigene Alias-Liste für Kommandos erstellen/laden, seine Einstellungen für den Editor vornehmen, den Suchpfad anpassen, usw..

Zwar kann man das auch auf anderem Wege erreichen ... aber die /etc/profile ist nun einmal read-only, die ash der Busybox kennt keine .shrc- oder .ashrc-Datei, ob eine ".profile" abgearbeitet wird, hängt auch davon ab, wo die gesucht wird (sprich, welches Verzeichnis als $HOME für den User "root" verwendet wird) - bleibt also noch das "Übermounten" der /etc/profile mit einer eigenen Version. Solange man dann - so wie es die Änderung macht - einfach am Ende der /etc/profile nachsieht, ob es eine nutzerspezifische Datei gibt oder nicht, spart das einem das bind-Mount. Man muß diese Modifikation ja auch nicht verwenden ... wer eigene Kommandos bei jedem Login ausführen will, kann diese Stelle sehr gut dafür verwenden. Punkt.

Wenn ich unter "Neustart" mal nach "das inaktive System" (MTD2/MTD3) wechsle – wie komme ich wieder zurück zum (gemoddeten) laufenden System" in MTD0/MTD1 ?
Gar nicht ... bzw. nicht auf demselben Weg, wenn das andere System diese Modifikation (gui_bootmanager) nicht auch enthält. Aber auch dann bleiben viele Möglichkeiten übrig, das geht von einer Telnet-Session mit manueller Umschaltung (oder mit meinem "bootmanager", auch wenn der mit pre-06.35 i.V.m. 06.35 nicht so richtig klarkommt - das ziehe ich auch nicht nach, der Aufwand ist mir zu groß) bis zu einem Pseudo-Image oder am Ende sogar bis zu einer FTP-Session für die EVA. Jeder dieser Punkte ist schon einmal irgendwo beschrieben, am Ende muß nur die Variable "linux_fs_start" irgendwie "umgeschaltet" werden, um das jeweils andere System zu starten. Wie Du das am Ende bewerkstelligst, ist nicht mehr Thema von modfs.
 
/var/custom/profile im Temp-Filesystem – hmm

Dieses RC-File namens /var/custom/profile … – das überdauert doch keinen Reboot, weil /var ein tmpfs (temporäres Filesystem) ist.

Aber welchen Sinn macht das dann?
Auch /var/custom ist natürlich schon nach dem Reboot weg.

Man kann sich aber von der rc.user aus (oder meinetwegen von der debug.cfg aus, wenn der Name jemandem besser gefällt) dort ein Verzeichnis "/var/custom" und darin eine Datei "profile" anlegen. Diese enthält dann die Kommandos, die bei jedem Login auszuführen sind ...

Du hast aus irgend einem (sicherlich guten aber nicht direkt nachvollziehbaren) Grund beim Zitieren weggelassen,
dass ich meinte, dass /var/custom nach dem Reboot weg ist.
Aber das war doch eigentlich mein Problem.
Natürlich ist /var/custom/profile eine gute Idee an sich – in Anbetracht eines fehlenden ~/.profile oder so.


Schlägst du vor, dass man sich bei Booten der Box in rc.user
das Verzeichnis /var/custom anlegt
und die Datei /var/custom/profile mit passendem Inhalt?

So verstehe ich das gerade. Das kann doch aber nicht sein, oder?
Worin liegt der Spaß, eine /var/custom/profile zu haben, die nicht das Rebooten übersteht?

Vielleicht soll aber /var/custom/profile auch nur ein Symlink auf externen Speicher sein, der ja an sich sowieso das Rebooten übersteht.
So etwa?
 
Aber das war doch eigentlich mein Problem.
Ja, das ist meinerseits tatsächlich so gedacht, daß da in der rc.user etwas in der Art steht:
Code:
mkdir -p /var/custom
cat >/var/custom/profile <<EOT
alias l="ls -lart"
EOT

Schlägst du vor, dass man sich bei Booten der Box in rc.user
das Verzeichnis /var/custom anlegt
und die Datei /var/custom/profile mit passendem Inhalt?
Exakt so.

Das kann doch aber nicht sein, oder?
Warum nicht?

Worin liegt der Spaß, eine /var/custom/profile zu haben, die nicht das Rebooten übersteht?
Es gibt nun mal nicht so viele Stellen, wo man so eine Datei (beschreibbar) ablegen kann. Da bietet sich das tmpfs an ... und wenn das "template" mal geändert werden muß, ändert man eben in der rc.user.

Vielleicht soll aber /var/custom/profile auch nur ein Symlink auf externen Speicher sein, der ja an sich sowieso das Rebooten übersteht.
Das kann jeder halten, wie er will ... deshalb auch ein "[ -e $file ]" (hoffentlich, ich benutze das etwas ausgebauter und nicht nur das simple Beispiel aus modfs) und kein "-L" oder "-f" usw. - sollte es ein "-f" sein, wäre das zwar auch nicht falsch (das Beispiel dreht sich ja um eine reguläre Datei unter /var/custom/profile), aber würde natürlich mit einem Symlink nicht funktionieren (der müßte in /var/custom ja aber auch erst angelegt werden). An dieser Stelle würde ich aber nicht freiwillig auf einen USB-Speicher verlinken, denn der ist immer im falschen Moment nicht angesteckt. Beim NAND-Flash unter /var/media/ftp ist das ein bißchen anders ... aber auch da muß man ja erst einmal über die rc.user (auch das ist ja nur eine Möglichkeit, wie man sich "einklinkt") irgendwelche Prozesse anschubsen.

Du darfst auch nicht vergessen/übersehen, daß die ganzen beigelegten "optionalen" Modifikationen nur das Potential aufzeigen sollten (steht hoffentlich auch so in #1) ... das Hauptaugenmerk lag am Beginn (so lautet ja auch das Thread-Thema) auf der Reanimation der "debug.cfg" (das ist auch das einzige, was automatisch erfolgt). Alles andere ist nur "Zuckerguß" und selbst die Pause mit der Möglichkeit zum Modifizieren des Images unmittelbar vor dem Packen ist eigentlich der Tatsache geschuldet, daß ich da dem Benutzer die Möglichkeit bieten wollte, noch seine eigenen Vorstellungen zu realisieren. Wenn Du lieber die Existenz einer ".profile" im NAND-FS (YAFFS2) in der /etc/profile prüfen willst, steht es Dir frei, das vor dem Einpacken zu ändern oder Dir gleich ein eigenes passendes "modscript" dafür zu erzeugen.

Nimm "modfs" besser als Framework zum Modifizieren wahr (mit ein paar Beispielen) und nicht als ein fertiges Programm. Der eigentliche Effekt liegt in den "modscripts", der Rest rundherum ist "nur Handwerk".
 
Die normale ~/.profile funktioniert auch.
Nur ist die Frage: Wo landest du denn (~) nach erfolgreichen Login?

Wenn dafür gesorgt wird, dass der telefon? oder /usr/sbin/telnetd aus /var/tmp gestartet wird, landet man auch da, nach erfolgreichen Login.
Beispiel (Das ist eine dropbear/ssh Verbindung)
Code:
pwd
[COLOR=#ff0000][B]/var/tmp/home/root[/B][/COLOR]
killall telnetd
telnetd -l /sbin/ar7login
Jetzt kommt das Login mit PuTTY/Telnet...
Code:
openelec:~# telnet deepbase
Trying 2003:45:ffff:ffff:ffff:ffff:ffff:ffff...
Connected to deepbase.fritz.box.
Escape character is '^]'.

Fritz!Box user: rumpelstilzchen
password:


BusyBox v1.20.2 (2014-09-26 13:25:19 CEST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

Mit grosser Macht kommt grosse Verantwortung
deepbase # pwd
[COLOR=#ff0000][B]/var/tmp/home/root[/B][/COLOR]
deepbase # l
drwxr-xr-x    2 root     root            80 Aug  5 11:36 ./
drwxr-xr-x    3 root     root            60 Aug  5 11:27 ../
-rw-------    1 root     root           382 Aug  5 12:18 .ash_history
-rwxr-xr-x    1 root     root           322 Aug  5 11:44 .profile*
PATH=/bin:/sbin:/usr/bin:/usr/sbin
PS1=$(echo -e "\033[1;35m$(hostname) # \033[0;37m\n")
TERM=xterm
export PATH TERM
alias ls='ls -AFp --color=auto'
alias l='ls -al'
echo "Mit grosser Macht kommt grosse Verantwortung"
echo "clear_id 87" > /proc/tffs
/sbin/eventadd 1 "telnetd: Login von $(netstat -tepn|grep telnetd)"
#EOF
deepbase #
...und wenn da eine .profile rumliegt, ist die ohne x Flag gültig und ohne SHEBANG und wird ausgeführt.

So

...viel lästiger ist /etc/profile, die gehört auf Nullbyte gesetzt.
 
Zuletzt bearbeitet:
modfs-0.3.1.tgz funktioniert bei mir auch für eine 7490 mit 113.06.35-31026

Die Zeile von Version 06.35 auf Version 06.35 Parameter - mit dem Kommentar "z.B. zum nachträglichen Aktivieren der rc.user und/oder des Telnet-Daemons" in der Tabelle in #1 hat für mich nun auf zwei 7490 mit 113.06.35-31026 funktioniert.

In einem Fall brauchte es ein "prepare_fwupgrade start_tr069".

Um modfs starten zu können, aktivierte ich den telnetd über ein Pseudo-Firmware-Update-Image mit dem /var/install aus #4 in dem Thread "LCR-Updater unter Fritz OS 6.30 möglich?".

Möglicherweise gibt es verschiedene Wege, um zu einem 113.06.35-31026 mit dauerhaft aktiviertem telnetd zu kommen, aber ich habe es so probiert, und es funktioniert, und es fühlt sich gut an.
 
auch bei mir hat modfs-0.3.1.tgz auf einer 7490 mit 6.30 perfekt funktioniert.

Vielen Dank an Peter!

Jetzt funktioniert auch endlich die Türklingel wieder, die ich basierend auf der hier im Forum vorgestellten Idee mit dem USB-LPT-Adapter aber mehr oder weniger direkt in C gebastelt habe (bitte nicht wundern, die header hab ich nicht sauber selektiert sondern per Copy/Paste aus einem komplexeren source geholt):

Code:
[FONT=courier new]// basic principle idea adopted from www.ip-phone-forum.de "Fritzbox und Türklingel" usb/lpt adapter and a close contact between pin 12 and 25[/FONT]
[FONT=courier new]/* Andrae Behrens, 07.08.2015[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new] build:[/FONT]
[FONT=courier new] ~/freetz-stable-2.0/toolchain/build/mips_gcc-4.6.4_uClibc-0.9.32.1/mips-linux-uclibc/bin/mips-linux-g++ -o doorbell doorbell.c -static[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new] behaviour:[/FONT]
[FONT=courier new] 1. open the given device file[/FONT]
[FONT=courier new] 2. loop to get the paper tray status by ioctl() as long[/FONT]
[FONT=courier new]    as ioctl() does not fail and no "media tray empty" was replied [/FONT]
[FONT=courier new] 3. if "media tray empty" open a TCP/IP socket to 127.0.0.1/1011 and send the "ring" command[/FONT]
[FONT=courier new] 4. wait for "ring" delay [/FONT]
[FONT=courier new] 5. send ATH0 to the socket to hangup ringing[/FONT]
[FONT=courier new] 6. close the socket [/FONT]
[FONT=courier new] 7. return 1 after ringing otherwise -values[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new] parameters:[/FONT]
[FONT=courier new] argv[1]: the device path to be opened and read (f.i. /dev/usblp0)[/FONT]
[FONT=courier new] argv[2]: the "ring" command (f.i. ATD**9)[/FONT]
[FONT=courier new] argv[3]: optional, the "ring" delay in seconds up to ATH0 (default RING_SECS)[/FONT]
[FONT=courier new] argv[4]: optional, the "request" delay in ms for the device (default IOCTL_IOCTL_MSECS)[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new] shell script proposal:[/FONT]
[FONT=courier new] #! /bin/sh[/FONT]
[FONT=courier new] DOORBELL_CMD="/var/media/ftp/doorbell/doorbell /dev/usblp0 ATD**9 3 333"[/FONT]
[FONT=courier new] while true[/FONT]
[FONT=courier new]   do[/FONT]
[FONT=courier new]     killall printserv 2>/dev/null[/FONT]
[FONT=courier new]     eventadd 1 "door bell sensitive"[/FONT]
[FONT=courier new]     $DOORBELL_CMD[/FONT]
[FONT=courier new]     res=$? [/FONT]
[FONT=courier new]     if [ $res -eq 1 ] [/FONT]
[FONT=courier new]     then[/FONT]
[FONT=courier new]       eventadd 1 "door bell was ringing"[/FONT]
[FONT=courier new]     else[/FONT]
[FONT=courier new]       eventadd 1 "doorbell error $res"[/FONT]
[FONT=courier new]     fi[/FONT]
[FONT=courier new]   done[/FONT]
[FONT=courier new]*/[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]#include <stdlib.h>[/FONT]
[FONT=courier new]#include <string.h>[/FONT]
[FONT=courier new]#include <stdio.h>[/FONT]
[FONT=courier new]#include <unistd.h>[/FONT]
[FONT=courier new]#include <fcntl.h>[/FONT]
[FONT=courier new]#include <time.h>[/FONT]
[FONT=courier new]#include <sys/ioctl.h>[/FONT]
[FONT=courier new]#include <linux/lp.h>[/FONT]
[FONT=courier new]#include <errno.h>[/FONT]
[FONT=courier new]#include <sys/time.h>[/FONT]
[FONT=courier new]#include <sys/types.h>[/FONT]
[FONT=courier new]#include <sys/time.h>[/FONT]
[FONT=courier new]#include <signal.h>[/FONT]
[FONT=courier new]#include <netinet/in.h>[/FONT]
[FONT=courier new]#include <sys/socket.h>[/FONT]
[FONT=courier new]#include <sys/file.h>[/FONT]
[FONT=courier new]#include <netdb.h>[/FONT]
[FONT=courier new]#include <arpa/inet.h>[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]#define IOCTL_MSECS             333[/FONT]
[FONT=courier new]#define RING_SECS               5[/FONT]
[FONT=courier new]#define ADDR                    "127.0.0.1"[/FONT]
[FONT=courier new]#define PORT                    1011[/FONT]
[FONT=courier new]#define HANGUP_CMD              "ATH0"[/FONT]
[FONT=courier new]#define ANY_PORT                0[/FONT]
[FONT=courier new]#define SOCKET_ERROR            -1[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]#define ERROR_PARAM_COUNT       -1[/FONT]
[FONT=courier new]#define ERROR_OPEN_DEVICE       -2[/FONT]
[FONT=courier new]#define ERROR_PARAM_RING_DELAY  -3[/FONT]
[FONT=courier new]#define ERROR_PARAM_IOCTL_CYLCE -4[/FONT]
[FONT=courier new]#define ERROR_BIND_CALL         -5[/FONT]
[FONT=courier new]#define ERROR_CONNECT_CALL      -6[/FONT]
[FONT=courier new]#define ERROR_SEND_CALL         -7[/FONT]
[FONT=courier new]#define ERROR_IOCTL_CALL        -8[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]int main(int argc, char** argv) {[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new] int res = 0;    [/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new] if (argc < 3) {[/FONT]
[FONT=courier new]   fprintf(stderr, "ERROR: usage: doorbell devicename ring_command [ring_delay in seconds] [ioctl_cycle in milliseconds]\n");[/FONT]
[FONT=courier new]   res = ERROR_PARAM_COUNT;[/FONT]
[FONT=courier new] }[/FONT]
[FONT=courier new] else {[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]   int fd = open(argv[1], O_RDONLY);    [/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]   if (fd < 0) {[/FONT]
[FONT=courier new]     fprintf(stderr, "ERROR: failed to open %s - errno:%d\n", argv[1], errno);[/FONT]
[FONT=courier new]     res = ERROR_OPEN_DEVICE;[/FONT]
[FONT=courier new]   }[/FONT]
[FONT=courier new]   else {[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]     unsigned        status;[/FONT]
[FONT=courier new]     char*           ring_cmd    = argv[2];[/FONT]
[FONT=courier new]     unsigned        ring_secs   = RING_SECS;[/FONT]
[FONT=courier new]     unsigned        ioctl_msecs = IOCTL_MSECS;[/FONT]
[FONT=courier new]     const char*     hangup_cmd  = HANGUP_CMD;[/FONT]
[FONT=courier new]     struct timespec ts;[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]     if (argc > 2) {[/FONT]
[FONT=courier new]       if (sscanf(argv[3], "%d", &ring_secs) != 1) {[/FONT]
[FONT=courier new]         fprintf(stderr, "ERROR: failed to read optional parameter: ring_delay in seconds\n");[/FONT]
[FONT=courier new]         res = ERROR_PARAM_RING_DELAY;[/FONT]
[FONT=courier new]       }[/FONT]
[FONT=courier new]     }[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]     if (argc > 3) {[/FONT]
[FONT=courier new]       if (sscanf(argv[4], "%d", &ioctl_msecs) != 1) {[/FONT]
[FONT=courier new]         fprintf(stderr, "ERROR: failed to read optional parameter: ioctl_cycle in milliseconds\n");[/FONT]
[FONT=courier new]         res = ERROR_PARAM_IOCTL_CYLCE;[/FONT]
[FONT=courier new]       }[/FONT]
[FONT=courier new]     }[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]     ts.tv_sec   = 0;[/FONT]
[FONT=courier new]     ts.tv_nsec  = ioctl_msecs;[/FONT]
[FONT=courier new]     ts.tv_nsec *= 1000000;[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]     while (!res) {[/FONT]
[FONT=courier new]       if (!ioctl(fd, LPGETSTATUS, &status)) {[/FONT]
[FONT=courier new]         if (!(status & LP_POUTPA) /* media tray empty */) {[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]           res = 1; /* media try empty was signaled and now we try to trigger the bells */[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]           int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]           sockaddr_in remAddr; [/FONT]
[FONT=courier new]           sockaddr_in locAddr;[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]           remAddr.sin_family      = AF_INET;[/FONT]
[FONT=courier new]           remAddr.sin_addr.s_addr = inet_addr(ADDR);[/FONT]
[FONT=courier new]           remAddr.sin_port        = htons(PORT);[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]           locAddr.sin_family      = AF_INET;[/FONT]
[FONT=courier new]           locAddr.sin_addr.s_addr = htonl(INADDR_ANY);[/FONT]
[FONT=courier new]           locAddr.sin_port        = htons(ANY_PORT);[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]           if (bind(sock, (struct sockaddr*)&locAddr, sizeof(locAddr)) == SOCKET_ERROR) {[/FONT]
[FONT=courier new]             fprintf(stderr, "ERROR: socket bind() failed - errno:%d\n", errno);[/FONT]
[FONT=courier new]             res = ERROR_BIND_CALL;[/FONT]
[FONT=courier new]           }[/FONT]
[FONT=courier new]           else {[/FONT]
[FONT=courier new]             if (connect(sock, (struct sockaddr*)&remAddr, sizeof(remAddr)) == SOCKET_ERROR) {[/FONT]
[FONT=courier new]               fprintf(stderr, "ERROR: socket connect() failed - errno:%d\n", errno);[/FONT]
[FONT=courier new]               res = -6;[/FONT]
[FONT=courier new]             }[/FONT]
[FONT=courier new]             else {[/FONT]
[FONT=courier new]               int len = strlen(ring_cmd);[/FONT]
[FONT=courier new]               int snd = send(sock, ring_cmd, len, 0);[/FONT]
[FONT=courier new]               if (snd == SOCKET_ERROR) {[/FONT]
[FONT=courier new]                 fprintf(stderr, "ERROR: socket send() \"ring\" command failed - errno:%d\n", errno);[/FONT]
[FONT=courier new]                 res = ERROR_CONNECT_CALL;[/FONT]
[FONT=courier new]               }[/FONT]
[FONT=courier new]               else {[/FONT]
[FONT=courier new]                 ts.tv_sec   = ring_secs;[/FONT]
[FONT=courier new]                 ts.tv_nsec  = 0;[/FONT]
[FONT=courier new]                 nanosleep(&ts, NULL);[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]                 len = strlen(hangup_cmd);[/FONT]
[FONT=courier new]                 snd = send(sock, hangup_cmd, len, 0);[/FONT]
[FONT=courier new]                 if (snd == SOCKET_ERROR) {[/FONT]
[FONT=courier new]                   fprintf(stderr, "ERROR: socket send() \"hangup\" command failed - errno:%d\n", errno);[/FONT]
[FONT=courier new]                   res = ERROR_SEND_CALL;[/FONT]
[FONT=courier new]                 }[/FONT]
[FONT=courier new]                 else[/FONT]
[FONT=courier new]                   fprintf(stdout, "door bell ring sequence successfully passed");[/FONT]
[FONT=courier new]               }[/FONT]
[FONT=courier new]             }[/FONT]
[FONT=courier new]           }[/FONT]
[FONT=courier new]           close(sock);[/FONT]
[FONT=courier new]         }[/FONT]
[FONT=courier new]       }[/FONT]
[FONT=courier new]       else {[/FONT]
[FONT=courier new]         fprintf(stderr, "ERROR: ioctl call failed - errno:%d\n", errno);[/FONT]
[FONT=courier new]         res = ERROR_IOCTL_CALL;[/FONT]
[FONT=courier new]       }[/FONT]
[FONT=courier new]       if (!res)[/FONT]
[FONT=courier new]         nanosleep(&ts, NULL);[/FONT]
[FONT=courier new]     }[/FONT]
[FONT=courier new]   }[/FONT]
[FONT=courier new] }[/FONT]
[FONT=courier new] return res;[/FONT]
[FONT=courier new]}[/FONT]
 
Ich bin jetzt auf der 7490 auch von der Labor.113.06.35-30987 auf die Labor.113.06.35-31026. Das hat wunderbar funktioniert. Bei den optionalen Anpassungen habe ich allerdings nur Telnet ausgewählt, nichts Anderes.

Die Box hatte ich vorher gerade neu gestartet. Somit war offensichtlich genug RAM frei, um den Vorgang ohne Absturz durchzubringen. Ich musste jedenfalls keine Services entladen. Lief alles perfekt durch. Das Packen am Ende ging auch recht flott - ich habe nur wieder vergessen, die Zeit zu stoppen :)

Telnet läuft, meine eigenen kleinen Modifikationen laufen, ich bin äußerst zufrieden. Vielen Dank nochmal an PeterPawn für dieses "Rundum-Sorglos-Paket" mit der einfachen Möglichkeit der "Jedermann-Modifikation" direkt während des Firmware-Updates!
 
Mir ist was aufgefallen: Versucht das script, nach /var/tmp zu entpacken? Ich habe das script mal pausiert.

Es scheint ein RAM Problem gewesen zu sein. Ich habe mal ein 256MB swap angelegt. Jetzt läuft das Script (modfs-0.3.1.tar.gz) durch. Bin jetzt mit der 7362SL auf FritzOS 6.30 mit telnet.

Gruß
schnurzelat
 

Zurzeit aktive Besucher

Statistik des Forums

Themen
246,356
Beiträge
2,250,754
Mitglieder
374,009
Neuestes Mitglied
HansRosenthal
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.