- Mitglied seit
- 1 Feb 2006
- Beiträge
- 321
- Punkte für Reaktionen
- 0
- Punkte
- 16
Hallo,
ich möchte an dieser Stelle eine kleine Schritt-für-Schritt Anleitung geben, nach der sich ein statisches Build des Asterisks aus den aktuellen Quellen für die FritzBox kompilieren lässt. Gewisse Kenntnisse im Umgang mit Linux-System sind im Folgenden von Vorteil, wenn nicht sogar zwingend notwendig.
Einleitung
Anlass war für mich, dass ich mir hin und wieder gerne einen aktuellen Asterisk selber kompilieren möchte, um nicht auf vorgefertigte Pakete angewiesen zu sein. So kann man bei Bekanntwerden von Sicherheitslücken problemlos eine neue Version kompilieren, und kann diese bei Bedarf auch selber im Quelltext etwas modifizieren. Es lassen sich z.B. weitere Module in den Quelltext des Asterisks kopieren, die anschließend direkt mit kompiliert werden.
Als kleine Besonderheit habe ich mich dazu entschlossen, ein statisches Build des Asterisks zu erstellen. Jede etwas über Hello World hinaus gehende Software greift auf bestimmte Bibliotheken zurück, im Unix-Umfeld shared libraries genannt. Das ist im Prinzip eine feine Sache, denn so müssen z.B. die OpenSSL-Funktionen nicht in jedes einzelne Programm hinein kompiliert werden, sondern es genügt, wenn das Binary einen Verweis auf die Library hat. Beim Starten des Programms wird die Library dann automatisch dynamisch dazu gebunden. Das macht das eigentliche Programm-Binary deutlich schlanker. Diese Sache hat aber auch eine Negativseite: Ändert sich etwas grundlegendes an der Library, so kann diese u.U. von der dagegen kompilierten Software nicht mehr verwendet werden. Des Weiteren gibt es auf der FritzBox das Problem, dass es hin und wieder zu Instabilitäten kommt, wenn man z.B. die openssl-Library als shared library in die Firmware packt.
Um diesem ganzen Library-Dilemma zu entgehen, kommt nun das statische Build zum Einsatz. Hierbei werden wirklich alle benötigten Libraries direkt mit in das Binary einkompiliert. Das heißt das Asterisk-Binary besteht am Ende nicht nur aus dem eigentlichen Asterisk, sondern enthält z.B. auch eine Kopie der OpenSSL-Libraries etc.
Vorteil: Alles was zum Starten des Binaries von Nöten ist, ist darin enthalten.
Nachteil: Das Binary wird sehr groß (bei mir über 5 MB).
Ein USB-Stick als Speichermedium ist also unbedingt notwendig. Eine Integration des Asterisks in die Firmware ist auf diesem Wege nicht möglich. Es genügt aber bereits der billigste 1 GB USB-Stick für sehr wenige Euros. Und ein klein wenig Speicherplatz (auch für ein Swap-File) tut der FritzBox manchmal ganz schön gut.
Vorkompilierte Binaries
Als Alternative zum Selberkompilieren biete ich hier auch fertig vorkompilierte Binaries für die FritzBox 7270 (und binärkompatible) an. Weitere Informationen hierzu finden sich in folgendem Posting:
IPPF: Vorkompiliertes Statisches Asterisk Build
Die Downloads finden sich direkt im Anhang des Posting.
Die weiteren Abschnitte dieses Postings beziehen sich auf das Selberkompilieren des Asterisks.
Voraussetzungen
Was ihr auf jeden Fall braucht, ist eine funktionierende Freetz Buildumgebung. Das heißt ihr solltet bereits ein funktionierendes Freetz-Image für eure FritzBox gebacken haben. Dadurch ist schonmal gewährleistet, das alle wichtigen Entwicklungstools vorhanden sind.
Eine Anleitung zum Kompilieren von Freetz werde ich an dieser Stelle nicht geben - sondern wie gesatz voraussetzen. Wenn ihr noch kein Freetz kompiliert habt, braucht ihr an dieser Stelle auch gar nicht weiterlesen - ihr werdet keinen Erfolg haben. Weitere Infos zu Freetz gibt es unter www.freetz.org.
An dieser Stelle auch ein ganz großes Dankeschön an alle Freetz-Entwickler für die Bereitstellung der gesamten Entwicklungsumgebung.
Auf der FritzBox benötigt ihr aus Speicherplatzgründen einen USB-Stick. Dieser sollte mindestens 256 MB fassen, ich würde 1 GB empfehlen. Der USB-Stick (bzw. dessen Partition) sollte mit ext3 formatiert sein. Windows-Dateisysteme (wie z.B. FAT oder NTFS) würde ich vorsichtshalber nicht verwenden. Ich nehme im weiteren an, dass der USB-Stick in der FritzBox unter /var/media/ftp/uStor01 eingebunden ist. Der Asterisk wird später unter /var/media/ftp/uStor01/asterisk installiert werden.
Auf eurem Build-System nehme ich an, dass freetz-trunk unter /usr/src/freetz/freetz-trunk liegt. Die aktuelle Asterisk-Version habe ich nach /usr/src/freetz/asterisk-1.6.* entpackt.
Wenn ihr andere Pfade verwendet, so ist das natürlich gar kein Problem, ihr solltest sie dann nur konsequent anpassen. Also nicht einfach nur blind per copy&paste aus diesem Posting übernehmen.
Vorbereitung der Freetz-Umgebung
Zuerst sind einige kleine Anpassung an der Freetz-Umgebung nötig. Ich empfehle auf jeden Fall eine eigene Toolchain zu bauen. Im freetz-trunk Verzeichnis ruft ihr dazu ein
make menuconfig
auf, und schaut dass unter Advanced -> Compiler Options -> Toolchains die Option Build Toolchain ausgewählt ist. Des Weiteren muss die ncurses-Library ausgewählt sein. Anschließend die Konfiguration beenden und speichern.
Als nächstes geht es um die uclibc, in der ein paar zusätzliche Funktionen aktiviert werden müssen, die später vom Asterisk benötigt werden.
Dazu ruft ihr in eurem freetz-trunk Verzeichnis
make uclibc-menuconfig
auf.
Dort sind folgende zusätzliche Optionen zu aktivieren:
* Networking Support -> Support res_close()
* Big and Tall -> Support gnu glob() interface
Anschließend wird mittels make die neue Buildumgebung kompiliert.
Anmerkung: Ihr müsst das hieraus resultierende Freetz-Image nicht zwangsläufig auf eurer FritzBox installieren. Es geht nur darum, dass eine uclibc vorliegt, die über die o.g. Features verfügt, und somit vom Asterisk während des Kompilierens verwendet werden kann. Beim Kompilieren des Asterisks wird diese Library sowieso statisch mit einkompiliert, so dass es keine Rolle spielt, ob in der Firmware nun eine eine uclibc mit res_close Unterstützung vorhanden ist oder nicht.
Hilfsdatei zum Cross-Compiling
Unter Cross-Compiling versteht man, eine Software für eine andere Prozessorarchitektur zu kompilieren. In unserem Fall läuft euer Buildsystem z.B. auf einer Intel kompatiblen x86_64 CPU, das resultierende Asterisk Binary soll später aber auf einer little endian Mips CPU laufen. Entsprechende Cross-Compiling Werkzeuge, die Binaries speziell für die Mips CPU der FritzBox erstellen, sind bereits vollständig in Freetz enthalten (und kompilieren euch auch jedes Mal die Software für euer Freetz-Image). Um diese Werkzeuge aber auch außerhalb von Freetz nutzen zu können, müssen einige Umgebungsvariablen entsprechend gesetzt werden.
Erstellt euch daher unter /usr/src/freetz/compile_env eine Textdatei mit folgendem Inhalt. Diese setzt die notwendigen Umgebungsvariablen. Ggfs. müsst ihr die Pfade an euer System anpassen.
"Laden" tut ihr diese Hilfsdatei, indem ihr in eurer aktuellen Shell folgenden Befehl ausführt:
Anschließend solltet ihr beim Auflisten aller aktiven Umgebungsvariablen mit env die o.g. Variablen wieder finden.
Vorbereiten des Asterisk
Als nächstes geht's an den Asterisk. Wechselt daher in das Verzeichnis, in dem ihr euren Asterisk Sourcecode entpackt habt. Klassischer Weise wird in der Linux-Welt ein Programm mit dem drei Befehlen ./configure && make && make install installiert. Ganz so einfach wird es in unserem Fall jedoch nicht gehen.
Wichtig: Die Umgebungsvariablen für das Cross-Compiling müssen ab diesem Zeitpunkt gesetzt sein. Vorsichtshalber könnt ihr einfach nochmal den o.g. source-Befehl ausführen.
Nun wird der Asterisk mittels ./configure konfiguriert. Hierbei müssen wir ein paar Parameter übergeben, und zwar wie folgt:
Das Prefix gibt das Wurzelverzeichnis an, unter dem wir unseren Asterisk installieren wollen. Der host-Parameter gibt die Ziel-CPU an, für die wir kompilieren möchten, und disable-xmldoc schließt die XML-Dokumentation aus, welche wir nicht benötigen. Je nach persönlichem Geschmack lassen sich ggfs. noch weitere Features ausschließen.
Konfigurieren des Asterisk
Wenn der configure-Vorgang ohne Fehler durchgelaufen ist, geht es an die eigentliche Konfiguration des Asterisks. Um in das Konfigurationsmenu des Asterisks zu gelangen, sind folgende Befehle auszuführen:
In dem folgenden Menu könnt ihr euren Asterisk nach belieben Konfigurieren. In der Standardeinstellung sind so gut wie alle Features bereits aktiviert, was eigentlich so bereits in Ordnung ist.
Folgende Änderungen sind jedoch auf jeden Fall durchzuführen:
Compiler Flags: STATIC_BUILD an, LOADABLE_MODULES aus, LOW_MEMORY an
Module Embedding: Alle Optionen aktivieren
(Anmerkung: Bei Memory Leaks oder instabilem Verhalten LOW_MEMORY wieder deaktivieren.)
Anschließend speichert und beendet ihr das Konfigurationsmenu mit 'x'.
Kompilieren des Asterisk
Das eigentliche Kompilieren geschieht wieder ganz klassisch mit make. Wichtig ist, vorher wieder alle Umgebungsvariablen für das Cross-Compiling zu setzen. Für das Konfig-Menü mussten zuvor nämlich ein paar Variablen wieder zurückgesetzt werden.
Installieren des Asterisk
Wenn der Asterisk ohne Fehler kompiliert hat, könnt ihr in mit make install installieren. Und zwar in genau das Verzeichnis, das ihr zuvor bei ./configure als prefix angegeben habt. Da in meinem Fall das Verzeichnis /var/media/ftp/uStor01/asterisk auf meinem Buildsystem noch nicht existiert hat, lässt sich der Asterisk auch auf dem Build-System gefahrlos "installieren". Ausführen lässt er sich dort wegen der unterschiedlichen CPU natürlich nicht.
Strippen des Asterisk
Nach dem make install habt ihr im Verzeichnis /var/media/ftp/uStor01/asterisk bereits alles, was ihr braucht. Die dort installierten Asterisk-Binaries enthalten aber noch viele unnötigen Debug-Symbol u.a., was die Binaries auf über 50 MB aufbläht. Mit dem strip-Befehl lassen sich die Binaries um diese Ballast (und damit rund 90% Dateigröße) erleichtern.
Kopieren des Asterisk
Anschließend kopiert ihr das Verzeichnis /var/media/ftp/uStor01/asterisk einfach 1:1 auf eure FritzBox bzw. den USB-Stick. Das eigentliche Asterisk-Binary ist unter sbin/asterisk zu finden.
Mit etwas Glück könnt ihr dieses Binary dann direkt auf eurer FritzBox ausführen und euch über euren eigenen Asterisk freuen.
Häufige Fehler
undefined reference to `dlerror'
Wenn dieser Fehler beim Kompilieren auftritt, wird die libdl nicht mit eingebunden. Dies lässt sich ganz einfach beheben, indem ihr im asterisk-Verzeichnis die Datei makeopts öffnet und dort nach der Zeile OPENSSL_LIB sucht. Dort ist -ldl zu ergänzen, so dass es wie folgt aussieht:
Anschließend sollte der Asterisk mit make wieder weiter kompilieren.
Memory Leaks
Falls der RAM-Verbrauch des Asterisks auf der FritzBox linear zur Zeit ansteigt, und der Asterisk irgendwann wegen Out Of Memory stirbt, sollte zum Testen die Option LOW_MEMORY im Asterisk make menuselect deaktiviert werden. Damit benötigt der Asterisk beim Starten zwar deutlich mehr RAM, das Laufzeitverhalten scheint in manchen Fällen jedoch stabiler zu sein.
Ende
Ich hoffe, dass es mit dieser Anleitung auch außer mir noch jemandem gelingen wird, den Asterisk für die FritzBox zu kompilieren. Wie gesagt, ohne gewisse Kentnisse im Umgang mit Linux-Betriebssysteme wird es vermutlich sehr schwer sein, diese Anleitung nachzuvollziehen. Um sich dem Umgang mit Linux-Betriebssysteme zu nähern, würde ich aber auch nicht gleich mit Cross-Compiling beginnen. Um dagegen eine schlichte copy&paste Anleitung zu entwerfen, sind die Systeme einfach zu komplex. Somit sollte diese Anleitung eher als roter Faden mit einigen Hilfestellungen zu sehen sein.
Wer noch Fragen, Ideen, oder Anregungen hat, darf dies gern am besten hier im Forum von sich geben.
Gruß
David
ich möchte an dieser Stelle eine kleine Schritt-für-Schritt Anleitung geben, nach der sich ein statisches Build des Asterisks aus den aktuellen Quellen für die FritzBox kompilieren lässt. Gewisse Kenntnisse im Umgang mit Linux-System sind im Folgenden von Vorteil, wenn nicht sogar zwingend notwendig.
Einleitung
Anlass war für mich, dass ich mir hin und wieder gerne einen aktuellen Asterisk selber kompilieren möchte, um nicht auf vorgefertigte Pakete angewiesen zu sein. So kann man bei Bekanntwerden von Sicherheitslücken problemlos eine neue Version kompilieren, und kann diese bei Bedarf auch selber im Quelltext etwas modifizieren. Es lassen sich z.B. weitere Module in den Quelltext des Asterisks kopieren, die anschließend direkt mit kompiliert werden.
Als kleine Besonderheit habe ich mich dazu entschlossen, ein statisches Build des Asterisks zu erstellen. Jede etwas über Hello World hinaus gehende Software greift auf bestimmte Bibliotheken zurück, im Unix-Umfeld shared libraries genannt. Das ist im Prinzip eine feine Sache, denn so müssen z.B. die OpenSSL-Funktionen nicht in jedes einzelne Programm hinein kompiliert werden, sondern es genügt, wenn das Binary einen Verweis auf die Library hat. Beim Starten des Programms wird die Library dann automatisch dynamisch dazu gebunden. Das macht das eigentliche Programm-Binary deutlich schlanker. Diese Sache hat aber auch eine Negativseite: Ändert sich etwas grundlegendes an der Library, so kann diese u.U. von der dagegen kompilierten Software nicht mehr verwendet werden. Des Weiteren gibt es auf der FritzBox das Problem, dass es hin und wieder zu Instabilitäten kommt, wenn man z.B. die openssl-Library als shared library in die Firmware packt.
Um diesem ganzen Library-Dilemma zu entgehen, kommt nun das statische Build zum Einsatz. Hierbei werden wirklich alle benötigten Libraries direkt mit in das Binary einkompiliert. Das heißt das Asterisk-Binary besteht am Ende nicht nur aus dem eigentlichen Asterisk, sondern enthält z.B. auch eine Kopie der OpenSSL-Libraries etc.
Vorteil: Alles was zum Starten des Binaries von Nöten ist, ist darin enthalten.
Nachteil: Das Binary wird sehr groß (bei mir über 5 MB).
Ein USB-Stick als Speichermedium ist also unbedingt notwendig. Eine Integration des Asterisks in die Firmware ist auf diesem Wege nicht möglich. Es genügt aber bereits der billigste 1 GB USB-Stick für sehr wenige Euros. Und ein klein wenig Speicherplatz (auch für ein Swap-File) tut der FritzBox manchmal ganz schön gut.
Vorkompilierte Binaries
Als Alternative zum Selberkompilieren biete ich hier auch fertig vorkompilierte Binaries für die FritzBox 7270 (und binärkompatible) an. Weitere Informationen hierzu finden sich in folgendem Posting:
IPPF: Vorkompiliertes Statisches Asterisk Build
Die Downloads finden sich direkt im Anhang des Posting.
Die weiteren Abschnitte dieses Postings beziehen sich auf das Selberkompilieren des Asterisks.
Voraussetzungen
Was ihr auf jeden Fall braucht, ist eine funktionierende Freetz Buildumgebung. Das heißt ihr solltet bereits ein funktionierendes Freetz-Image für eure FritzBox gebacken haben. Dadurch ist schonmal gewährleistet, das alle wichtigen Entwicklungstools vorhanden sind.
Eine Anleitung zum Kompilieren von Freetz werde ich an dieser Stelle nicht geben - sondern wie gesatz voraussetzen. Wenn ihr noch kein Freetz kompiliert habt, braucht ihr an dieser Stelle auch gar nicht weiterlesen - ihr werdet keinen Erfolg haben. Weitere Infos zu Freetz gibt es unter www.freetz.org.
An dieser Stelle auch ein ganz großes Dankeschön an alle Freetz-Entwickler für die Bereitstellung der gesamten Entwicklungsumgebung.
Auf der FritzBox benötigt ihr aus Speicherplatzgründen einen USB-Stick. Dieser sollte mindestens 256 MB fassen, ich würde 1 GB empfehlen. Der USB-Stick (bzw. dessen Partition) sollte mit ext3 formatiert sein. Windows-Dateisysteme (wie z.B. FAT oder NTFS) würde ich vorsichtshalber nicht verwenden. Ich nehme im weiteren an, dass der USB-Stick in der FritzBox unter /var/media/ftp/uStor01 eingebunden ist. Der Asterisk wird später unter /var/media/ftp/uStor01/asterisk installiert werden.
Auf eurem Build-System nehme ich an, dass freetz-trunk unter /usr/src/freetz/freetz-trunk liegt. Die aktuelle Asterisk-Version habe ich nach /usr/src/freetz/asterisk-1.6.* entpackt.
Wenn ihr andere Pfade verwendet, so ist das natürlich gar kein Problem, ihr solltest sie dann nur konsequent anpassen. Also nicht einfach nur blind per copy&paste aus diesem Posting übernehmen.
Vorbereitung der Freetz-Umgebung
Zuerst sind einige kleine Anpassung an der Freetz-Umgebung nötig. Ich empfehle auf jeden Fall eine eigene Toolchain zu bauen. Im freetz-trunk Verzeichnis ruft ihr dazu ein
make menuconfig
auf, und schaut dass unter Advanced -> Compiler Options -> Toolchains die Option Build Toolchain ausgewählt ist. Des Weiteren muss die ncurses-Library ausgewählt sein. Anschließend die Konfiguration beenden und speichern.
Als nächstes geht es um die uclibc, in der ein paar zusätzliche Funktionen aktiviert werden müssen, die später vom Asterisk benötigt werden.
Dazu ruft ihr in eurem freetz-trunk Verzeichnis
make uclibc-menuconfig
auf.
Dort sind folgende zusätzliche Optionen zu aktivieren:
* Networking Support -> Support res_close()
* Big and Tall -> Support gnu glob() interface
Anschließend wird mittels make die neue Buildumgebung kompiliert.
Anmerkung: Ihr müsst das hieraus resultierende Freetz-Image nicht zwangsläufig auf eurer FritzBox installieren. Es geht nur darum, dass eine uclibc vorliegt, die über die o.g. Features verfügt, und somit vom Asterisk während des Kompilierens verwendet werden kann. Beim Kompilieren des Asterisks wird diese Library sowieso statisch mit einkompiliert, so dass es keine Rolle spielt, ob in der Firmware nun eine eine uclibc mit res_close Unterstützung vorhanden ist oder nicht.
Hilfsdatei zum Cross-Compiling
Unter Cross-Compiling versteht man, eine Software für eine andere Prozessorarchitektur zu kompilieren. In unserem Fall läuft euer Buildsystem z.B. auf einer Intel kompatiblen x86_64 CPU, das resultierende Asterisk Binary soll später aber auf einer little endian Mips CPU laufen. Entsprechende Cross-Compiling Werkzeuge, die Binaries speziell für die Mips CPU der FritzBox erstellen, sind bereits vollständig in Freetz enthalten (und kompilieren euch auch jedes Mal die Software für euer Freetz-Image). Um diese Werkzeuge aber auch außerhalb von Freetz nutzen zu können, müssen einige Umgebungsvariablen entsprechend gesetzt werden.
Erstellt euch daher unter /usr/src/freetz/compile_env eine Textdatei mit folgendem Inhalt. Diese setzt die notwendigen Umgebungsvariablen. Ggfs. müsst ihr die Pfade an euer System anpassen.
Code:
TOOLCHAIN=/usr/src/freetz/freetz-trunk/toolchain/build/gcc-4.2.4-uClibc-0.9.29/mipsel-linux-uclibc
TOOLCHAIN_BIN=$TOOLCHAIN/bin
TOOLCHAIN_LIB=$TOOLCHAIN/lib
TOOLCHAIN_INC=$TOOLCHAIN/include
export PATH=$TOOLCHAIN_BIN:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export AR=$TOOLCHAIN_BIN/mipsel-linux-uclibc-ar
export AS=$TOOLCHAIN_BIN/mipsel-linux-uclibc-as
export LD=$TOOLCHAIN_BIN/mipsel-linux-uclibc-ld
export NM=$TOOLCHAIN_BIN/mipsel-linux-uclibc-nm
export CC=$TOOLCHAIN_BIN/mipsel-linux-uclibc-gcc
export CPP=$TOOLCHAIN_BIN/mipsel-linux-uclibc-cpp
export GCC=$TOOLCHAIN_BIN/mipsel-linux-uclibc-gcc
export CC=$TOOLCHAIN_BIN/mipsel-linux-uclibc-gcc
export CXX=$TOOLCHAIN_BIN/mipsel-linux-uclibc-g++
export RANLIB=$TOOLCHAIN_BIN/mipsel-linux-uclibc-ranlib
export CFLAGS="-Os -s"
export LDFLAGS="-L$TOOLCHAIN_LIB"
export CPPFLAGS="-I$TOOLCHAIN_INC"
"Laden" tut ihr diese Hilfsdatei, indem ihr in eurer aktuellen Shell folgenden Befehl ausführt:
Code:
source /usr/src/freetz/compile_env
Anschließend solltet ihr beim Auflisten aller aktiven Umgebungsvariablen mit env die o.g. Variablen wieder finden.
Vorbereiten des Asterisk
Als nächstes geht's an den Asterisk. Wechselt daher in das Verzeichnis, in dem ihr euren Asterisk Sourcecode entpackt habt. Klassischer Weise wird in der Linux-Welt ein Programm mit dem drei Befehlen ./configure && make && make install installiert. Ganz so einfach wird es in unserem Fall jedoch nicht gehen.
Wichtig: Die Umgebungsvariablen für das Cross-Compiling müssen ab diesem Zeitpunkt gesetzt sein. Vorsichtshalber könnt ihr einfach nochmal den o.g. source-Befehl ausführen.
Nun wird der Asterisk mittels ./configure konfiguriert. Hierbei müssen wir ein paar Parameter übergeben, und zwar wie folgt:
Code:
source /usr/src/freetz/compile_env
./configure --prefix=/var/media/ftp/uStor01/asterisk --host=mipsel-linux --disable-xmldoc
Das Prefix gibt das Wurzelverzeichnis an, unter dem wir unseren Asterisk installieren wollen. Der host-Parameter gibt die Ziel-CPU an, für die wir kompilieren möchten, und disable-xmldoc schließt die XML-Dokumentation aus, welche wir nicht benötigen. Je nach persönlichem Geschmack lassen sich ggfs. noch weitere Features ausschließen.
Konfigurieren des Asterisk
Wenn der configure-Vorgang ohne Fehler durchgelaufen ist, geht es an die eigentliche Konfiguration des Asterisks. Um in das Konfigurationsmenu des Asterisks zu gelangen, sind folgende Befehle auszuführen:
Code:
source /usr/src/freetz/compile_env
unset CC CXX CFLAGS CPPFLAGS LDFLAGS
make menuselect
In dem folgenden Menu könnt ihr euren Asterisk nach belieben Konfigurieren. In der Standardeinstellung sind so gut wie alle Features bereits aktiviert, was eigentlich so bereits in Ordnung ist.
Folgende Änderungen sind jedoch auf jeden Fall durchzuführen:
Compiler Flags: STATIC_BUILD an, LOADABLE_MODULES aus, LOW_MEMORY an
Module Embedding: Alle Optionen aktivieren
(Anmerkung: Bei Memory Leaks oder instabilem Verhalten LOW_MEMORY wieder deaktivieren.)
Anschließend speichert und beendet ihr das Konfigurationsmenu mit 'x'.
Kompilieren des Asterisk
Das eigentliche Kompilieren geschieht wieder ganz klassisch mit make. Wichtig ist, vorher wieder alle Umgebungsvariablen für das Cross-Compiling zu setzen. Für das Konfig-Menü mussten zuvor nämlich ein paar Variablen wieder zurückgesetzt werden.
Code:
source /usr/src/freetz/compile_env
make
Installieren des Asterisk
Wenn der Asterisk ohne Fehler kompiliert hat, könnt ihr in mit make install installieren. Und zwar in genau das Verzeichnis, das ihr zuvor bei ./configure als prefix angegeben habt. Da in meinem Fall das Verzeichnis /var/media/ftp/uStor01/asterisk auf meinem Buildsystem noch nicht existiert hat, lässt sich der Asterisk auch auf dem Build-System gefahrlos "installieren". Ausführen lässt er sich dort wegen der unterschiedlichen CPU natürlich nicht.
Strippen des Asterisk
Nach dem make install habt ihr im Verzeichnis /var/media/ftp/uStor01/asterisk bereits alles, was ihr braucht. Die dort installierten Asterisk-Binaries enthalten aber noch viele unnötigen Debug-Symbol u.a., was die Binaries auf über 50 MB aufbläht. Mit dem strip-Befehl lassen sich die Binaries um diese Ballast (und damit rund 90% Dateigröße) erleichtern.
Code:
for i in /var/media/ftp/uStor01/asterisk/sbin/*; do mipsel-linux-strip $i; done
Kopieren des Asterisk
Anschließend kopiert ihr das Verzeichnis /var/media/ftp/uStor01/asterisk einfach 1:1 auf eure FritzBox bzw. den USB-Stick. Das eigentliche Asterisk-Binary ist unter sbin/asterisk zu finden.
Mit etwas Glück könnt ihr dieses Binary dann direkt auf eurer FritzBox ausführen und euch über euren eigenen Asterisk freuen.
Häufige Fehler
undefined reference to `dlerror'
Code:
dso_dlfcn.c:(.text+0x75c): undefined reference to `dlerror'
Code:
OPENSSL_LIB= -lssl -lcrypto -ldl
Memory Leaks
Falls der RAM-Verbrauch des Asterisks auf der FritzBox linear zur Zeit ansteigt, und der Asterisk irgendwann wegen Out Of Memory stirbt, sollte zum Testen die Option LOW_MEMORY im Asterisk make menuselect deaktiviert werden. Damit benötigt der Asterisk beim Starten zwar deutlich mehr RAM, das Laufzeitverhalten scheint in manchen Fällen jedoch stabiler zu sein.
Ende
Ich hoffe, dass es mit dieser Anleitung auch außer mir noch jemandem gelingen wird, den Asterisk für die FritzBox zu kompilieren. Wie gesagt, ohne gewisse Kentnisse im Umgang mit Linux-Betriebssysteme wird es vermutlich sehr schwer sein, diese Anleitung nachzuvollziehen. Um sich dem Umgang mit Linux-Betriebssysteme zu nähern, würde ich aber auch nicht gleich mit Cross-Compiling beginnen. Um dagegen eine schlichte copy&paste Anleitung zu entwerfen, sind die Systeme einfach zu komplex. Somit sollte diese Anleitung eher als roter Faden mit einigen Hilfestellungen zu sehen sein.
Wer noch Fragen, Ideen, oder Anregungen hat, darf dies gern am besten hier im Forum von sich geben.
Gruß
David
Zuletzt bearbeitet: