Ideen zum Nachladen für 7050

hermann72pb

IPPF-Promi
Mitglied seit
6 Nov 2005
Beiträge
3,726
Punkte für Reaktionen
16
Punkte
38
Da die letzte Diskussion über 7050
http://www.ip-phone-forum.de/showthread.php?t=132936
sich mehr in Richtung NFS und Erfahrungsaustausch entwickelt hat, mache ich hier ein neues Thema auf, wo die Ideen diskutiert werden sollen, wie man die großen Binaries vom externen Webinterface / FTP-Server runterladen und anschließend im ds-mod nutzen kann. Die Web-CGIs von gewünschten Paketen samt Konfigurationen sollen von Originalpaketen benutzt werden.

Einige Vorkenntnisse:
1. Wie man die Binaries aus der Image bei "image too big" löscht und das Image nachher ohne die Binaries aufbaut wird aus dem Posting
http://www.ip-phone-forum.de/showpost.php?p=837267&postcount=3
klar.
2. debug.cfg alleine reicht zum Nachladen der Binaries nicht aus, weil sie zu spät aufgerufen wird. Es wird ein addon-Paket benötigt, welches die Binaries aus dem Web holt, bevor die Dienste mit nachladbaren Dateien gestartet werden.

Ideen:
1. Aus der Image alle zu großen Binaries rauslöschen
2. Auf der Box unter tmp ein Verzeichnis erstellen und Patch-Variable wie folgt modifizieren:
Code:
mkdir /var/tmp/bin
export PATH=/var/tmp/bin:$PATH
Diese Operation kann das Nachlade-Skript übernehmen.
3. Mit dem Nachladeskript (wird irgendwo in rc.S aufgerufen) fehlende Binaries nach /var/tmp/bin nachladen.
4. Nun kann die Box die fehlenden Binaries in diesem Verzeichnis finden und von dort anstatt /sbin oder /bin (u.a.) starten.

Ist es grundsätzlich möglich?

MfG

Hermann
 
Ja. Du könntest sogar in /etc/inittab sowas machen:
Code:
::sysinit:/etc/init.d/rc.download_binaries
::sysinit:/etc/init.d/rc.S
Dann würde Dein Skript vor rc.S als allererstes aufgerufen. Mini_fo wird bspw. so in den Mod frühzeitig eingebunden, um von Beginn an ein Root-Dateisystem zu etablieren.
 
Ist denn zu diesem Zeitpunkt dsld schon gestartet und gibt es Verbindung zum Internet? Das konnte ich leider aus rc.S nicht eindeutig entnehmen. Ich vermute eher nicht. Und ganz früh brauche ich es auch nicht. Es sollte genügen, es vor denjenigen ds-mod Paketen zu starten, wo die Binaries ausgelagert sind. "mini-fo" ist ein Sonderfall und das lassen wir erstmal außer Betracht. Wo ich dieses rc.download_binaries paken würde:
1. Anfang von rc.mod
oder
2. Ganz am Ende von rc.S, wo rc.mod aufgerufen wird
oder
3. Ganz sauber am Anfang von static.pkg

Welche von den drei Möglichkeiten sollte man bevorzugen?

Und zum Punkt 3 habe ich dann eine Folgefrage. Ich würde gerne die ganze Geschichte als addon ausprobieren. Von addon wird erstmal ein eigenes static.pkg erzeugt. Ich vermute, dass "make" nachher einfach die beiden static.pkg (von festintegrierten Paketen und von addons) zusammenführt. Die Frage ist nur, in welcher Reihenfolge? Mir wäre es lieber, wenn die addons-Einträge ganz vorne in static.pkg stehen würden. Ob sie es wirklich tun? Oder liege ich da ganz falsch und die Reihenfolge wird irgendwie anders geregelt?

MfG

Hermann
 
Zu bevorzugen ist wohl die Methode, die am weitesten entfernt ist vom Patchen der Original-AVM-Dateien und am nächsten an einer reinen Benutzerkonfiguration liegt. Als Präferenzreihenfolge würde ich 3, 1, 2 nennen bezogen auf Deine Liste. Grundsätzlich kannst Du es aber machen, wie Du möchtest, denn es ist ja Deine FW.

Ein bißchen Hilfe zur Selbsthilfe:
  • Wo wird der dsld gestartet?
    Schau einfach nach:
    Code:
    find build/modified/filesystem/etc/init.d | xargs grep dsld
    Danach schaust Du in rc.S, an welcher Stelle die gefundene rc.x gestartet wird.
  • Die Paket-Reihenfolge für static.pkg wird dort festgelegt, wo auch der Mod gebaut wird: im Skript fwmod. Schau mal, ob Du es findest. Falls nicht, frag gern nochmal.
Viel Spaß beim Stöbern!
 
Danke kriegaex für dein Support!

dsld wird wahrscheinlich in /etc/init.d/rc.net gestartet. Letztes wird ziemlich am Ende von rc.S nach dem Laden des dsl-Moduls wie folgt aufgerufen:
Code:
zeile  code
527   modprobe kdsldmod
528   /etc/init.d/rc.net
static.pkg wird genau anders rum aufgebaut, als es mir lieber wäre. Dafür heißen die Pakete auch "addons", um hinterher angehängt zu werden. Aber ich schaue es mir bei mini_fo oder anderen Paketen ab, wie man die Skripte an die passende Stelle in static.pkg bringen kann. Zunächst kann man das auch per Hand machen.

Nun habe ich eine weitere Frage. Mit den binaries wird es wahrscheinlich mit dem Umleiten der PATH-Variable funktionieren. Wie sieht es denn mit den Bibliotheken aus? Ich vermute sehr stark, dass alleine Binaries auszulagern nicht ausreicht. Die betroffenen Bibliotheken liegen unter /usr/lib. Gibt es denn auch so eine Variable wie PATH, wo die Pfade zu Bibliotheken beschrieben werden? Ich würde dann zu dem Suchpfad z.B. /var/tmp/lib von vorne hinzuaddieren.
Einige würden mir natürlich sagen, dass man lieber statisch-gelinkte Binaries kompillieren sollte. Das können aber hier im Forum sowieso nur ein dutzend Leute. Außerdem ist meine Idee, die bestehenden Pakete zu nutzen, möglichst ohne sie groß zu modifizieren.

MfG

Hermann
 
Ich rede hier über Dinge, die ich selbst nicht tue (auslagern, Libs verschieben), also genieße alles mit der nötigen Vorsicht, das nur nebenbei.

Zum Thema: dsld wird tatsächlich in rc.net gestartet, nicht nur wahrscheinlich. Es steht doch im grep-Output, den ich Dir anzuschauen geraten hatte:
Code:
~/ds26/build/modified/filesystem$ find etc/init.d | xargs grep -n dsld
etc/init.d/rc.S:518: modprobe kdsldmod
etc/init.d/rc.net:209:      AVMDAEMONS="avmike dsld igdd websrv multid"
etc/init.d/rc.net:258:     if [ "`pidof dsld`" = "" ] ; then
[B]etc/init.d/rc.net:260:         dsld -i -n $NICEPARAM -r 600
etc/init.d/rc.net:262:         dsld -i -n $NICEPARAM[/B]
etc/init.d/rc.net:298:         AVMDAEMONS="avmike dsld igdd multid"
etc/init.d/rc.net:305:         # before terminating dsld, unregister sip first
(...)

Bibliotheken auszulagern, kannst Du versuchen, aber schau doch erst mal, ob es nicht reicht mit den Binaries. Experimentiere einfach, halte eine Recovery-Möglichkeit bereit und hab Spaß. Einen Pfad für Bibliotheken gibt es auch, den LD_LIBRARY_PATH. Er wird vom Mod auch benutzt, wie man unten sieht, und Du kannst ihn erweitern:
Code:
$ env | grep -i lib
LD_LIBRARY_PATH=/mod/lib
 
danke!

mit grep konnte ich es zu dem Moment nicht tun, weil Friboli gerade am rumkompillieren war. Ich hatte mir über Samba-Freigabe die beiden Dateien angeschaut gehabt und die gleichen Zeilen wie du gefunden. "Wahrscheinlich" stand dort eben deswegen, weil es mehrmals vorkommt und deswegen für mich nicht eindeutig war.

Zu den Bibliotheken. Nein, es reicht nicht aus, wenn man z.B. OpenVPN haben will. Ich lasse ja die ganzen web-cgis und sonstige Sachen in dem Image drin. Dadurch kommt schon was zusammen. Ich habe mittlerweile testweise ein Image mit ausgelagerten dropbear, dnsmasq, mc und openvpn gebaut. Es ist zwar noch nicht lauffähig, da ohne Nachladeskripte, aber nur so konnte ich ein Image mit etwa 33kB unter der Schmerzgrenze bauen.
Ausgelagert sind:
Code:
dnsmasq
dropbearmulti
libcrypto.so.0.9.8
liblzo2.so.2.0.0
libssl.so.0.9.8
mc.bin
openvpn
Da ich die drei Bibliotheken nicht unter Original-Frmware gefunden habe, hoffe ich, dass sie zu dropbear und openvpn gehören.

Mit LD_LIBRARY_PATH habe ich es inzwischen auch gefunden. Etwas wundert mich allerdings das Ziel /mod/lib. Auf meiner 7050 mit derzeitigem ds-mod ist dieses Verzeichnis leer. Zeigt es vielleicht doch auf irgendeine mir unbekannte Weise auf /lib? Aber das ist eigentlich egal. Die Hauptsache, dass die Box nachher in den Verzeichnissen LD_LIBRARY_PATH auch sucht.

Zu Recovern und Box-Zerschießen bin ich mir schon bewußt. Ich gehe recht langsam vor und teste es erstmal auf der laufenden Box im /var/tmp (mit PATH hat es funktioniert). Außerdem habe ich eine zusätzliche 7050 zum spielen.

MfG

Hermann
 
hermann72pb schrieb:
mit grep konnte ich es zu dem Moment nicht tun, weil Friboli gerade am rumkompillieren war.

Tip fürs bequeme Arbeiten: FriBoLi hat vermutlich mehrere Textkonsolen, wie jedes normale Desktop-Linux. Mit welchen Tastenkombinationen man wechselt, weiß ich nicht, aber Du kannst ja mal forschen. Weitere Möglichkeiten, mit mehreren Konsolen zu arbeiten, sind Telnet- oder SSH-Login (gibt es auch in FriBoLi, evtl. nur vorher telnetd oder sshd starten) oder screen.

Edit: SSH und Telnet haben noch den Charme, daß Copy & Paste kein Problem ist, weil die Clients ja auf Deinem Host-Betriebssystem laufen...

hermann72pb schrieb:
Da ich die drei Bibliotheken nicht unter Original-Frmware gefunden habe, hoffe ich, dass sie zu dropbear und openvpn gehören.

Und gleich noch ein Tip: Seit gerade eben kannst du das verbesserte Menuconfig aus dem 14.3er Thread herunterladen. Damit kannst Du das dann viel besser herausfinden als bisher. :D
 
Die Bibliotheken werden zuerst in /mod/lib und dann in /lib gesucht.

MfG Oliver
 
Das heißt, wenn ich diesen LD_LIBRARY_PATH um /var/tmp/lib vor dem /mod/lib erweitere, also in etwa so:
Code:
export LD_LIBRARY_PATH=/var/tmp/lib:$LD_LIBRARY_PATH
dann wird nach Bibliotheken erstmal in /var/tmp/lib gesucht.

Jetzt habe ich eine generelle Frage zu PATH-Variable. Ich habe gesehen, dass diese Variable an -zig Stellen in dieversen Skripten und cgi-s absolut gesetzt wird. In etwa
Code:
PATH=/bin:/sbin:/usr/bin:/usr/sbin
Laufe ich hier die Gefahr, dass die Setzung meines Pfades zu /var/tmp/bin gnadenlos während des Betriebes von einem der Skripte oder CGI-s überschrieben wird? Oder liege ich hier falsch? In rc.mod wird PATH-Variable um einiges erweitert. Diese Einstellung bleibt auch erhalten und wird nicht mit anderen Skripten überschrieben.
 
Wenn eine Variable in einem Shellskript gesetzt wird, dann gilt sie normalerweise nur für dieses Skript. Außer du setzt ". " davor.
Warum willst du den LD_LIBRARY_PATH verbiegen? Mach doch die Libs einfach nach "/var/mod/lib".

MfG Oliver
 
Ich wusste nicht, dass /var/mod/lib physikalisch im RAM liegt. Aber wenn es so ist, dann macht es die Sache einfacher.
Ich habe gerade festgestellt, dass das Gleiche für /var/mod/bin und /var/mod/sbin gilt. Das heißt, ich brauche gar nicht die Verzeichnisse anzulegen und PATH-Variablen "verbiegen", alles ist schon vorbereitet. Einfach binaries nach bin oder sbin paken und libs in lib. rc.mod definiert diese Pfade, von daher sollte alles dort gefunden werden.

MfG
Hermann
 
Alles unter /var liegt im RAM außer /var/flash, das hat eine Sonderrolle.
 
Erste zum Teil erfolgreiche Versuche

Nun habe ich meine Ideen zum Teil implementiert. download-Skript ist samt cfg-Datei und cgi in erster Fassung fertig. Ich konnte es sogar in ds-mod fest integrieren. Dateien werden schön runtergeladen, erst danach starten die Pakete. Man sieht es sogar an der langsam aufbauender Paketliste von ds-mod. Zum starten konnte ich allerdings nur dnsmasq bringen. openvpn habe ich noch gar nicht getraut zu starten, dropbear wird nicht gefunden, sowie mc.bin. Ursachen sind die Symlinks, die in diesem Fall ins Leere zeigen. Ich hatte mal gehoft, dass zumindest mc -> mc.bin nicht absolut ist, sondern es dabei in allen Pfaden gesucht wird. Dem ist es leider nicht so.
Gelernt haben wir daraus Folgendes: Es reicht nicht die Dateien (binaries oder libs) einfach zu löschen und zu hoffen, dass sie anderswo gefunden werden.
Abhilfe: Ich werde anstatt gelöschten Dateien nun symlinks auf ihre neue Orte unter /mod/bin usw. anlegen. Und hoffen, dass es dann klappt.
Positiv anzumerken ist, dass die Box auch mit nicht gefundenen Binaries trotzdem stabil läuft. Ich teste es noch weiter.

MfG

Hermann
 
Symlinks zeigen immer auf einen festen Ort, da gibt es keine Pfadsuche. Der Link kann dabei relativ oder absolut sein, aber wohin er zeigt, ist von vorne herein klar. Der Link-Name selbst wird im Pfad gesucht. Beispiel:

Wenn Du "mcview" eingibst und über PATH dabei /usr/bin/mcview gefunden wird, dieses Objekt dann wiederum ein Symlink "-> mc" ist, dann wird mc an genau einem Ort gesucht: in /usr/bin. Mit korrekten Symlinks, die dann z.B. nach /var/my-fancy-mount-dir zeigen, so wie Du es jetzt vorhast, wird es funktionieren.
 
Alle Symlinks mühsam eingefügt. Nun geht alles erstmal ohne Probleme. Mit toten Verweisen ist mir die Box in etwa nach 3 Stunden abgeschmiert. Mal sehen wie lange sie jetzt hält.
Wie erkenne ich eigentlich, dass Speicher überläuft, von dem hier immer befürchtet wird? Die grüne Anzeige auf der DS-MOD-Titelseite bleibt in etwa zwischen 17 und 18 MB. Theoretisch ist es weit vom Limit entfernt.
Als Bild ist meine gebastelte CGI und Startlog bei.

MfG

Hermann
 

Anhänge

  • downloader.jpg
    downloader.jpg
    65.8 KB · Aufrufe: 59
  • startlog.jpg
    startlog.jpg
    73.3 KB · Aufrufe: 47
Freien Speicher ermitteln

Was die DS-Mod-Infoseite macht, ist Folgendes:
Code:
#!/bin/sh
total="$(cat /proc/meminfo | grep '^MemTotal:' | sed s/[^0-9]//g)"
free="$(cat /proc/meminfo | grep '^MemFree:' | sed s/[^0-9]//g)"
cached="$(cat /proc/meminfo | grep '^Cached:' | sed s/[^0-9]//g)"
let usedwc="total-cached-free"
let percent="100*usedwc/total"
echo "Gesamt: $total KB"
echo "Belegt: $usedwc KB (ohne Cache)"

Nun kenne ich mich überhaupt nicht aus mit dieser Sache, aber intuitiv würde ich mir eher den Wert MemFree anschauen, anstatt Cached (was immer das bedeutet) noch vom belegten Speicher abzuziehen.

Anstatt /proc/meminfo direkt auszulesen kannst Du auch einfach
Code:
free
eingeben, falls Dir dessen Ausgabeformat lieber ist.
 
Code:
/var/mod/root $ free
              total         used         free       shared      buffers
  Mem:        30364        28644         1720            0         1812
 Swap:            0            0            0
Total:        30364        28644         1720
/var/mod/root $
Naja, damit sieht es etwas enger aus. Ob es so schlimm ist, weiß ich nicht.

MfG

Hermann
 
Da mein Downloader an sich gut funktioniert, frage ich einmal pauschal, ob Interesse besteht, es als Paket zu machen. Fast alles nötige habe ich im Prinzip da: Skript, rc.datei, datei.cfg, datei.cgi (s. oben). Das einzige, was hier fehlt, man muss diesen Downloader an die erste Position von static.pkg bringen. Entweder macht man es per Hand, oder jemand hilft mir dazu ein Skript zu schreiben.

Ich denke solche webbasierte Download-Möglichkeit beim Start der Box (bevor die Pakete geladen sind!) würde schon einen oder anderen hier interessieren. Nicht nur dafür, wofür ich es verwende. Dann kann man in debug.cfg die wget und chmod Zeilen ersparen.

Natürlich bleiben noch tausende anderen Fragen offen: wie man z.B. die Binaries und Libs aus dem Image nach dem make-Durchlauf automatisch rausnimmt, damit Image ohne Fehlern erstellt werden kann. Die kann man aber nach und nach automatisieren.

MfG

Hermann
 
Olistudent hat Inotify am Laufen, nachdem wir erst mal einen kleinen Kernel-Bug bzgl. eines Automatisierungsskripts im Build-Prozeß beheben mußten. Sobald noch eine letzte Frage geklärt ist und Oliver es eincheckt, kann ich damit herum spielen. Danach überlege ich mir mal, wie man das auf eine Inotify-Analyse des Bootprozesses gestützte Aussondern großer Binaries ordentlich in den Build rein bekommt. Im Grunde ist es mir schon klar, aber gemacht werden muß es eben. Die Screenshots Deines Web-UI sehen hübsch aus, finde ich. Für zusätzliche Download-Pakete außerhalb der der FW entnommenen Binaries ist das wirklich schön. Falls das Separieren der Binaries beim Build tatsächlich mal automatisch laufen würde, könnte man die Lade-Skripten aber auch gleich dort erzeugen und bräuchte zu dem Zweck die Oberfläche dann nicht mehr. Aber das kann ja noch ein Weilchen dauern, und trotzdem ein Package oder Add-On daraus zu machen, wäre schön. Der Nutzwert ist da, und es steckt viel Arbeit von Deiner Seite aus drin. Gratulation, daß es so schön klappt jetzt. :)
 
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.