Freifunk Nord/Firmware selbst kompilieren

Aus wiki.freifunk.net
Wechseln zu: Navigation, Suche

Gluon ist die Firmware, die wir bei Freifunk Nord für unsere Router verwenden. Entwickelt wurde diese vom Freifunk Lübeck. Die Firmware basiert auf OpenWrt und bietet eine einheitliche Konfiguration für die gesamte Community. Beispielsweise ist es auf einem laufenden Router nicht ohne weiteres möglich die Konfiguration zu ändern. Hierzu sind ein erneutes Kompilieren der Firmware oder ein kompliziertes eingreifen mittels Befehlseingabe nötig. Welche Router man verwenden kann, ist in der Liste der mit Gluon kompatiblen Router zu finden.

Fertiges Image herunterladen

Wenn du kein Linux verwendest, du dich nicht mit Linux auskennst oder dir einfach nur die Arbeit ersparen willst, dann kannst du die fertigen Images in der Liste der mit Gluon kompatiblen Router herunterladen.

Hier findest du eine Anleitung wenn du Einen Knoten einrichten möchtest.

Kompilieren von Gluon

Important.png Info: Für die faulen die das schnell brauchen gibt es hier eine Github Repository von Rubo77 oder alternativ hier ein gist von MTRNord mit 2 build scripten, welche alles übernehmen.


# Um Gluon zu kompilieren installiert man die benötigten Pakete
sudo apt-get install git make gcc g++ unzip libncurses5-dev zlib1g-dev subversion gawk bzip2 libssl-dev wget

Dieses ist nur einmalig erforderlich und sollte nur passieren wenn die Pakete nicht vorhanden sind

# Diese Pakete werden benötigt, um nachher die Toolchain und die Firmware an sich zu kompilieren. Des weitern sollten mind. 7 GB je Target an freiem Speicher auf der Festplatte verfügbar sein. Bei aktuell 7 möglichen Targets sollten bis zu 49 GB an Platz eingeplant werden. Man kann den Freien Speicher im aktuellen Verzeichnis anzeigen mit
df -BG .
# Hinweis: Wer sein gluon Verzeichnis von der Festplatte gelöscht hat, der kann an dieser Stelle fortsetzen.
# Nun lädt man sich die Source-Files für Gluon aus dem GitHub-Repository von Freifunk Lübeck herunter:
git clone https://github.com/freifunk-gluon/gluon.git

Auch dieser Vorgang ist nur einmalig erforderlich. Die wiederholte Ausführung führt zu einem Fehler Wenn das Repository bereits erfolgreich geclont wurde wechselt man bei weiteren Kompilierungsversuchen stattdessen in das Verzeichnis gluon und führt den Befehl git pull aus um das lokale Repository auf den aktuellen Stand zu bringen.

# Wichtig hierbei ist, dass man sich die Dateien NICHT als root und auch ohne sudo herunterlädt, da es sonst später zu Problemen beim Kompilieren kommen kann:
if [[ $EUID -eq 0 ]]; then echo "cannot be run as root"; exit; fi;
# Als nächstes wechselt man in das automatisch erstellte Verzeichnis
cd gluon #(nicht erforderlich wenn man sich schon im gluon Verzeichnis befindet nach Update des gluon Repositories)
# Bevor man mit dem Kompilieren beginnen kann ist der richtige Versionszweig (branch, englisch revision) auszuwählen.
# Verfügbare Versionszweige anzeigen
git branch -a
# z.B. die z.Z. aktuelle stabile Version: 2016.2.x auswählen
 git checkout v2016.2.x
# Wer hier nichts auswählt landet in dem experimentellen Zweig master und riskiert, dass das Kompilieren fehlschlägt.
# (Eine Anleitung wie der Gluon Master erfolgreich gebaut werden kann ist weiter unten zu finden.)
# Wer bisher versucht hat eine experimentelle Version von Gluon zu bauen (gemäß der bisherigen Fassung dieser Anleitung) und auf den stabilen Zweig umsteigen möchte, der sollte sein gluon Verzeichnis auf der Festplatte rekursiv, also inclusive aller Unterverzeichnisse, löschen und neu auschecken also Gluon neu von github.com/freifunk-gluon rerunterladen.
# Da in diesem Repository noch keine Konfiguration dabei ist, muss diese extra heruntergeladen werden. Hierzu führt man in dem Verzeichnis gluon, wo man sich an dieser Stelle der Anleitung schon befinden sollte, folgenden Befehl aus:
git clone https://github.com/ffnord/site-nord.git site

Das letzte site speichert den Inhalt vom site-nord repo lokal ins site Directory Auch hier gilt Dieser Befehl ist nur einmalig ausführbar. Wer aktualisieren möchte wechselt stattdessen mit cd site in das site Verzeichnis und führt git pull aus

# Auch hier sicherheitshalber noch darauf achten, den richtigen Zweig auszuwählen.
cd site #(nicht erforderlich wenn man sich schon durch ein Update im site Verzeichnis befindet!)
git branch -a

# wähle den richtigen Zweig aus, z.B. 'master' um die aktuelle Version zu bauen
git checkout master
# (Die Version steht in der Variable DEFAULT_GLUON_RELEASE in der Datei site.mk)
# Dann in das übergeordnete Verzeichnis gluon zurückkehren
cd ..
# Nun sind fast alle Dateien vorhanden, um mit dem Kompilieren zu beginnen. Die letzten Dateien erhält man mit dem Befehl
make update #(dieses ist auch nach git pull erforderlich!)
# Dies dauert nur ca eine Minute.
# Nun startet man das Kompilieren
make

# Wer ein anderes Target als ar71xx-generic kompilieren möchte muss dieses seperat mit dem Parameter GLUON_TARGET=... angeben
# Eine Liste der vorhandenen Targets gibt es mit (Dieses ist Freifunk Nord spezifisch da wir ein default GLUON_TARGET in der site.mk definiert haben)
make GLUON_TARGET=?
# Seit Gluon Version 2014.4.x kann auch beim ersten Build der Paramiter -j siehe weiter unten zur Steigerung der Geschwindigkeit des Kompilierens genutzt werden.
# Von der Benutzung wird abgeraten da das Kompilieren fehlschlagen kann
# Es werden nur die gerade kompilierten Dateien angezeigt.
# Wer am Ende wissen möchte warum das Kompilieren fehlschlägt oder zuschauen möchte was im einzelnen passiert der benutzt
make V=s
# Für den Fall, dass du einen Prozessor mit mehreren Kernen verwendest kannst du hinter "make" die Option "-jX" setzen, wobei X der Anzahl der Kerne deines Prozessors +1 entsprechen sollte. Durch diese Zusatzoption arbeiten mehr Kerne am Kompilieren des Codes und es geht schneller als nur mit einem. Wenn man auf einem Server über SSH kompiliert, ist es zu empfehlen das ganze in einer screen, tmux o.ä. Sitzung auszuführen. Das komplette Kompilieren dauert ca. 2 Stunden mit einem Kern, bei einem i7-2600k mit der Option "-j9", also mit 8 Kernen nur kanpp 30 Minuten. Diese Option sollte nicht gesetzt werden wenn beim Kompilieren Fehler gesucht werden
# Die Anzahl Kerne zeigt der Befehl lscpu an, man kann dies automatisch in eine Variable setzen und dann den make Befehl ausführen
X=$(expr $(nproc) + 1)
make -j$X V=s
# Nun kann man sich einen Kaffee, eine Mate oder sonst etwas holen, ein paar Dehnübungen machen und warten.
# Sobald das Kompilieren ohne Fehler abgeschlossen ist, findet man die Images im gluon-Ordner unter
output/images/factory/ (Version zum Flashen wenn noch die Herstellerfirmware auf dem Router installiert ist)
output/images/sysupgrade 
(Version zum Ersetzen einer älteren oder anderen Gluon Version. Auch zum Ersetzen einer installierten OpenWrt/LEDE Firmware!)

Kompilieren des Gluon Master Branch (aktuell experimental LEDE)

nur für Experten die wissen was sie tun

Hierzu ist im wesentlichen die Anleitung der stable Version zu befolgen mit folgenden Änderungen:

  1. Der Branch von Gluon ist nicht v2016.2.x sondern master
  2. Der Branch für die Freifunk Nord site Dateien ist nicht master sondern lede
  3. Das Ergebnis des Kompiliervorgangs liegt unter ./output/images

Der Sinn den Master Branch zu Bauen und die experimentelle Version zu testen liegt darin, dass die Router auf LEDE basierend, z.B. eine verbesserte WLAN-Stabilität haben. Ausserdem wurde die Anzahl der supporteten Router erhöht.

Wer dieses Feature nutzen möchte kompiliert am Besten mit dem BROKEN=1 Parameter Dann wird zum Beispiel auch experimentelle Routermodelle unterstützt.

Der Aufruf des kompilierungsvorgangs lautet dann

make BROKEN=1 

Warnung: Das Bauen des Master Branches ist nur Linux Experten zu empfehlen.
Es kann nicht garantiert werden dass das Kompilieren erfolgreich verläuft da an dem Master Branch ständig gearbeitet wird.

Das Build Script

Um alle aktuell 7 Targets in einem Rutsch zu bauen ist ein Build Script erforderlich. Dieses kann so aussehen:

#!/bin/bash
RELEASE=2018.2.0~exp$(date '+%Y%m%d%H%M')
BUILD_BROKEN="BROKEN=1"
# or BUILD_BROKEN=""
T="ar71xx-generic ar71xx-tiny ar71xx-nand brcm2708-bcm2708 brcm2708-bcm2709 mpc85xx-generic ramips-mt7621 sunxi-cortexa7 x86-generic x86-geode x86-64 ipq40xx ramips-mt7620 ramips-mt76x8 ramips-rt305x"
if [ "$BUILD_BROKEN" != "" ] ; then
  T="$T ar71xx-mikrotik brcm2708-bcm2710 ipq806x mvebu-cortexa9"
fi
CORES=1
START=$(date +%s)
for TARGET in $T; do
  echo "################# $(date) start building target $TARGET ###########################"
  make -j$CORES GLUON_TARGET=$TARGET $BUILD_BROKEN DEFAULT_GLUON_RELEASE=$RELEASE || exit 1 
done && echo "alle Targets wurden erfolgreich erstellt im ordner output/"
echo -n "finished: "; date
echo "Dauer: $((($(date +%s)-$START)/60)) Minuten"


Quelle: https://github.com/rubo77/gluon-build-script

Die Anzahl Kerne kann man ermitteln mit

CORES=$(lscpu|grep -e '^CPU(s):'|xargs|cut -d" " -f2)

Es ist aber nicht empfohlen mit mehr als einem Kern zu bauen, da Gluon nicht dafür geeignet ist.

Fehlersuche falls der Build fehlschlägt

Da die Ausgabe recht umfangreich aussieht ist es erst mal schwierig die entscheidende Zeile zu finden, die einen auf die richtige Spur bringt. Suche in der Ausgabe des make Befehls nach

Collected errors:
 * opkg_install_cmd: Cannot install package 

oder Zeilen in der Art:

make[2]: *** [image/TLWR710] Error 2

Der Parameter BROKEN=1

Mit dem Parameter BROKEN=1 wird das Bauen von Images für experimentell unterstützte Hardware Aktuell z.B. Arcer C5/C7 ermöglicht. Als stable deklarierte Firmware sollte daher niemals mit BROKEN=1 kompiliert werden.

Signieren von Images

Wenn man die Gluon-Images für automatische Updates signieren möchte muss man zuerst eine Manifest-Datei erzeugen, in der die Signaturen enthalten sein werden. Wichtig hierzu ist, dass auf dem System die ECDSA Utils vorhanden sind.

Um die Manifest-Datei zu erzeugen gehen wir in das Gluon Verzeichnis und führen dort den folgenden Befehl aus:

make manifest GLUON_BRANCH=stable

Nun finden wir unter images/sysupgrade eine Datei mit dem Namen "stable.manifest".

Nun müssen wir nur noch den script zum signieren der Images ausführen. Die Befehlsreihenfolge ist die folgende:

./contrib/sign.sh pfad/zur/secret/key/datei pfad/zur/manifest/datei>


Links