Freetz on a stick

DrG

Neuer User
Mitglied seit
26 Mrz 2006
Beiträge
30
Punkte für Reaktionen
0
Punkte
0
Ich würde gerne meine FritzBox 7270 nicht mit Freetz flashen aber trotzdem gerne die Funktionalität von Freetz nutzen wollen.

Meine Vorstellung ist, das Freetz Filesystem auf einen USB-Stick zu kopieren und von dort die FritzBox (neu) starten.

Leider klappt es nicht so ganz wie gewünscht.

Meine Tests so weit:

1. Ich stoppe alle laufenden Dienste:

/etc/hotplug/storage stop
/etc/init.d/rc.voip stop
/etc/init.d/rc.net stop # stoppt nur wenig
killall ctlmgr
(Den ctlmgr konnte ich nicht anders stoppen.)

2. Die Mounts /proc/bus/usb, /proc und /var/sysfs umount'en.

3. Kopiere /var unter das Freetz Verzeichnis.

4a. Nun wäre es schon, mit pivot_root das Freetz Verzeichnis als neue root zu setzen. Allerdings erhalte ich immer den Fehler "Invalid argument". Laut http://www.busybox.net/lists/busybox/2006-March/019322.html liegt es daran, dass die aktuelle root vom Typ rootfs ist. Komischerweise wird das doch aber auch per rc.usbroot in Freetz gemacht!?

4b. Da pivot_root nicht geht, wechsle ich per chroot ins Freetz Wurzelverzeichnis.

5. Die Mounts /proc/bus/usb, /proc und /var/sysfs mounte ich nun unter der neuen Wurzel.

6. Nun will ich alle Dienste neu starten:
/etc/init.d/rc.net start
Das funktioniert nicht. Es gibt einige Problemmeldungen. Sehr schwerwiegend ist:
Code:
*** 16:33:40(1) [Segmentation fault] dsld(2324) CRASHED at crwmmap_writerlock+0x24 (/lib/libavmcsock.so.2 at 0001a818) accessing 00000000 (?) ***
Die gleiche Meldung erhalte ich übrigens auch, wenn ich ohne Freetz die Dienste stoppe und wieder neu starte.

Ich würde mich sehr über Eure Ideen freuen: Was habe ich falsch gemacht, was könnte ich noch probieren? Oder haltet Ihr meine geniale Idee :) für doch nicht so gut?
 
Hi.
Unsere 3 Varianten mini_fo, nfs und usbroot umgehen dieses Problem indem die Skripte vor init gestartet werden. Das geschieht durch den Eintrag init=/etc/init.d/script in /proc/cmdline.
pivot_root bekomm ich auf einer laufenden Box auch nicht ausgeführt und mit chroot kommt man nicht wirklich weit.

MfG Oliver
 
Die gleiche Meldung erhalte ich übrigens auch, wenn ich ohne Freetz die Dienste stoppe und wieder neu starte.

Dann gibt es ein grundsätzliches Problem, das unabhängig davon ist, daß Du das Verzeichnis wechseln willst. Du solltest erst die Ursache und die Lösung fpr dieses Problem finden, bevor du weiter machst.

Und "ctlmgr -s" sollte den ctlmgr stoppen.
 
... und mit chroot kommt man nicht wirklich weit.

Das kann man so nicht sagen. Meine 7270 läuft so. Der Trick liegt darin, mittels "mount -o bind ..." sämtliche mount points auch im neuen root-system auf dem USB-Stick zu mounten. Dann mit chroot /usr/bin/modload und dann /etc/init.d/rc.mod starten. Ganz grob.

Etwas detailierter:

Es wird das normale Image von AVM geflasht. Alle Funktionen, die AVM bietet, funktionieren so (nach Konfiguration in deren Web-Oberfläche).

Freetz als "addon" vom USB-Stick starten. D.h. vom Entwicklungskit den Baum .../freetz-trunk/build/modified/filesystem auf den USB-Stick unter /freetz (als Beispiel) kopieren. /dev nicht mitkopieren oder auf dem Stick löschen.

Stick an die FB, per Telnet einloggen und Stick mounten.
Ein start-Script starten, das im Prinzip folgendes folgendes macht:

1. Alle vorhandenen mount points - wie erwähnt - auch in "/pfad-zum-stick/freetz" anlegen. Zusätzlich evt. das original root-fs als ".../freetz/flashroot" mounten (damit man da noch via Dropbear rankommt).

2. Einige wenige Teile aus /etc/init.d/rc.S: /var/flash/freetz anlegen (genauso wie in rc.S), /var/mod/etc anlegen und var.tar entpacken.

3. chroot .../freetz .../freetz/usr/bin/modload

4. chroot .../freetz .../freetz/etc/init.d/rc.mod

Danach laufen alle AVM-Services wie im Orginal, alle Freetz-Services im USB-Stick-root. Loggt man sich z.B. über Dropbear ein, sieht man das USB-Stick-root als "/". Jetzt einmalig /dev erzeugen mit "makedevs -d /etc/device.table /".

Das Start-Script läßt sich natürlich auch aus /var/flash/debug.cfg starten (nachdem dort auch der Stick gemountet wurde, was AVM bei einem ext2/ext3 stick nicht tut).

Wenn man die Scripts einmal hat, liegt der Vorteil darin, nichts an der AVM-Software verändert zu haben und trotzdem (fast) alle Freetz-Software nutzen zu können (alles, was auf Kernel-Replacement baut, geht natürlich nicht). Ausserdem braucht man nicht ständig flashen und kann viele Services von Freetz nutzen (64MB Memory ist schon eine ganze Menge...).

Sollte die FB mal nicht richtig funktionieren, läßt man den Freetz-Start einfach weg und hat dann praktisch eine Orginal-FB. Wenn´s dann immer noch nicht geht, ist AVM schuld... Wenn doch, haben wir ein Problem.

E.
 
Zuletzt bearbeitet:
Das hat zumindest den Nachteil, dass syslog nicht funktioniert, da /dev/log nicht existiert und auch nicht im bestehenden /dev angelegt werden kann.
Wenn das Problem gelöst werden könnte, wäre ich schon ein größes Stück weiter.
 
Wenn man bereit ist, alle laufenden Prozesse zu stoppen, kann man auch versuchen, alles nach dem chroot neu zu starten. Dann sollte auch /dev/log und alles andere vom Stick kommen.
 
Aber genau das funktioniert ja (bei mir) nicht - [post=1069901]s.o.[/post]
 
Zuletzt bearbeitet:
Das hat zumindest den Nachteil, dass syslog nicht funktioniert, da /dev/log nicht existiert und auch nicht im bestehenden /dev angelegt werden kann.

syslog funktioniert mindestens für Prozesse, die unter freetz gestartet wurden. Kernel-logs kommen offenbar auch an - jedenfalls sehe ich die Meldungen von kdsld (das ist ein Module). multid messages sieht man auch, da der beim Start von dnsmasq sowieso neu gestartet wird und eben nun unter freetz läuft. Mit anderen AVM-Services habe ich es nicht probiert.

E.
 
SOLVED - siehe Edit...

Hi!

Mir gefällt die Idee "Freetz on a stick" weshalb ich gerade versuche, das umzusetzen :)

Ich bin auch schon recht weit gekommen, aber irgendwo klemmts noch mit der chroot-Umgebung, aber eines nach dem anderen:
Der USB-Stick hat momentan eine "PHOENIX"-Partitionierung:
  • /dev/sda1 - FAT32 mit den Modulen für ext2 und einem init-Skript
  • /dev/sda2 - ext2 mit Freetz im root-Verzeichnis (aus build/modified/filesystem)
  • /dev/sda3 - swap (momentan nicht genutzt)

Die /var/flash/debug.cfg ist wie folgt vorbereitet, wenn auch momentan noch ungenutzt
Code:
# get drivename 
# 1) mount lists all devices
# 2) grep for "/var/media/ftp/*"
# 3) cut off "/var/media/ftp/" to get pure name of mounted Stick
STICKNAME=`mount | grep -o '\/var\/media\/ftp\/[a-zA-Z0-9-]*' | sed 's/\/var\/media\/ftp\///'`

# execute init-script
/var/media/ftp/$STICKNAME/init.sh $STICKNAME

Das init-script wiederrum sieht so aus:
Code:
#!/bin/sh

# Parameters
# $1 = name of USB Drive
# As we're executing this script, there must be smarter way
# to get the INITPATH.
# But for now, the name has to be passed in...
INITPATH=/var/media/ftp/$1

# create root directories for Fradd
mkdir /var/chreetz

# grant full access
# revisit, if necessary
chmod 777 /var/chreetz

# add modules for ext2/ext3 to Fritz-Fw
/sbin/insmod $INITPATH/src/7270/mbcache.ko
/sbin/insmod $INITPATH/src/7270/ext2.ko
# /sbin/insmod $INITPATH/src/7270/ext3.ko
modprobe ext2
# modprobe ext3

# mount Fradd partition
mount /dev/sda2 /var/chreetz
chmod 777 /var/chreetz

# enable swap
# /var/chreetz/bin/busybox swapon /dev/sda3

# mount necessary directories to chroot-environment
mount -t proc none /var/chreetz/proc
mount -o bind /dev /var/chreetz/dev

# some additional mounts, has to be revisted
# mount /dev/sda1 /var/chreetzmedia/sda1-fradd-boot
# mount /dev/sda2 /var/fradd/sda2/media/sda2-fradd-root
# mount / /var/fradd/sda2/media/rootfs-FritzBox-root
# mount /var /var/fradd/sda2/media/rootfs-FritzBox-root/var

# change root...
/var/chreetz/bin/busybox chroot /var/chreetz sh
Btw: chreetz = ch(root) + (fr)eetz :)

So, das script an sich läuft auch sauber durch. Sda2 wird gemountet und sieht, soweit ich das beurteilen kann, auch in Ordnung aus.

chroot wird von der Freetz-busybox aufgerufen, weil die Orig-Busybox das nicht unterstützt.
Der "chroot" - Aufruf selbst meldet sich mit
Code:
BusyBox v1.12.3 (2009-01-14 22:50:45 CET) built-in shell (ash)
Enter 'help' for a list of built-in commands.

/ #
was für mich auch noch in Ordnung aussieht.

Aber: "ls" (und auch /bin/busybox ls) gibt nur einen einsamen Punkt aus. Ein cd funktioniert erwartungsgemäß.
Ausgabe von "ls -l" (egal in welchem Verzeichnis):
Code:
?-wSr-S-wT    0 16893    2               0 Jan  1  1970 .

Tjoa, und da steh ich nun...
Einen Schritt, den ich ehrlich gesagt schlichtweg nicht verstanden hab, ist das mounten "/dev". Ich habs mal in PHOENIX-Manier gemacht. Testweise hab ich aber auch makedevs, wie in diesem Thread beschrieben, ausgeführt.

Any ideas?
Danke schonmal im voraus :)
Jens


Edit 21.01.2009
So, habs nun selbst rausgefunden und darauf konnte aus der Ferne nun wirklich keiner drauf kommen.
Ich hatte aus Unwissenheit "freetz-trunk" kompiliert, weil Freetz-1.0.1 wegen veralteter Firmware nicht möglich war. Freetz-Stable-1.1 hatte ich irgendwie übersehen...

Wenn ich jetzt auch noch das eigentliche Ziel (Freetz-Packages zum Laufen bringen), dann schreibe ich eine Schritt für Schritt Anleitung, versprochen!
 
Zuletzt bearbeitet:
Wenn ich jetzt auch noch das eigentliche Ziel (Freetz-Packages zum Laufen bringen), dann schreibe ich eine Schritt für Schritt Anleitung, versprochen!


Hallo ,,

ist zwar schon älter der thread , aber interessant.

Könntest Du eventuell eine Schritt für Schritt Anleitung machen , inklusive benötigter Pakete ect ect.
ich bekomm das momentan noch irrgendwie nicht hin
Auf USB Stick sda1 (ext3) liegt bereits rootfs
 
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.