<>

Allgemeines

In den Freifunk-Netzwerken wird auf den Nodes nicht die originale Firmware der Router-Hersteller genutzt, sondern eine speziell für diesen Zweck von den Mitgliedern der Communities erstellte eigene Firmware. Diese basiert generell auf OpenWrt, welches durch verschiedene Pakete ergänzt wird.

Leider gibt es keine einheitliche "Freifunk-Firmware", stattdessen erstellt jede Community ihre eigene Variante. Diese unterscheiden sich teilweise erheblich, wie auch die gesamte darunterliegende Infrastruktur. Es spricht aber nichts dagegen, beim Aufbau einer neuen Community die Firmware einer anderen Community zu nutzen und diese an die eigene Infrastruktur anzupassen. Trotzdem bleibt zumindest die schwierige Aufgabe, sich für eine der Firmware-Varianten zu entscheiden. Da auch die Infrastruktur dazu passen muß, ist eine spätere Umstellung nicht ganz einfach.

Um das Erstellen der Firmware zu erleichern, wurden im Laufe der Zeit verschiedene Frameworks entwickelt. In letzter Zeit verbreitet sich besonders Gluon, welches von der Lübecker Community entwickelt wird. Da es sich um ein aktuell stark entwickelndes Framework mit vielen interessanten Funktionen handelt, haben wir uns auch in unserer Community für Gluon entschieden.

Firmware erstellen

Im Normalfall wird die aktuell in der Community verwendete Firmware für die unterstützten Routertypen fix und fertig zum Download zur Verfügung gestellt. Diese muß dann nur noch auf dem Router installiert werden. Demgegenüber wird im Folgenden beschrieben, wie man sich das Firmware-Paket selbst erstellen kann, sei es nur "für die Wissenschaft" oder um z.B. ein nicht unterstütztes Routermodell zu verwenden.

Voraussetzungen

Das Erstellen der Firmware erfolgt unter Linux. Im Prinzip ist jede aktuelle Distribution nutzbar, wir verwenden meist Gentoo. Da es sich hierbei um eine Source-Distribution handelt, sind die benötigten Build-Tools (GCC usw.) i.d.R. bereits installiert. Zusätzlich wird Git zum Zugriff auf die Versionsverwaltung benötigt. Gluon verfügt über eine gute Dokumentation, diese benutzen wir als Grundlage für die folgenden Schritte.

Download der Quellen

Die Quellen werden nach dem Wechsel ins Build-Root mitels Git ausgecheckt (heruntergeladen):

$ mkdir -p ~/Develop/Freifunk
$ cd ~/Develop/Freifunk
$ export RELEASE="ffggrz-1.0.2"
$ export GLUON_RELEASE="1.0.2"
$ git clone https://github.com/ffggrz/gluon.git gluon-$RELEASE -b $RELEASE
$ cd gluon-$RELEASE

export GLUON_RELEASE="1.0.2" gibt an, daß wir nachfolgend unsere Firmware-Version 1.0.2 erstellen wollen. Diese Versionsnummer ist später in den Image-Namen enthalten und wird z.B. auch in der Karte angezeigt.

Durch export RELEASE="ffggrz-1.0.2" wird in diesem Beispiel das mit "ffggrz-1.0.2" markierte GLUON-Release unserer Community (eigener Fork auf Github) ausgecheckt und anschließend gebaut. Um stattdessen den aktuellen Entwicklungsstand zu verwenden, kann man

$ export RELEASE="master"

angeben. Das sollte aber nur für Experimente genutzt werden.

Site-Konfiguration

Jede Community nutzt eine eigene Infrastruktur, welche sich zumindest durch Hostnamen und IP-Adressen von der anderer Communities unterscheidet. Diese Unterschiede müssen in der eigenen Firmware hinterlegt werden. Dazu gibt es die sogenannte Site-Konfiguration, normalerweise ist jede Community eine eigene Site. Theoretisch könnten sich aber auch mehrere Communities eine Infrastruktur teilen und haben dann eine identische Site-Konfiguration. Andererseits könnte eine große Community mehrere Sites mit unterschiedlicher Infratruktur und damit unterschiedlicher Konfigurationen betreiben.

Im Verzeichnis docs/site-example befindet sich eine Beispiel-Konfiguration. Diese wird in das site-Verzeichnis kopiert und anschließend an die eigene Infrastruktur angepaßt:

$ cp -r docs/site-example site

Die aktuell von unserer Community genutzte Konfiguration ist in unserem Repository auf GitHub abgelegt. Um diese zu verwenden, wird statt dem Kopierbefehl mit Git ausgecheckt:

$ git clone https://github.com/ffggrz/site-ffggrz.git site -b $RELEASE

Damit wird die zum Bauen der in $RELEASE definierten Firmware-Version (im Beispiel 1.0.2) genutzte site-Konfiguration heruntergeladen. Die zum Bauen der letzten experimentellen Version genutzte Konfiguration liegt im Master-Branch, um diese auszuchecken, kann einfach das "-b $RELEASE" weggelassen werden.

Firmware bauen

Die Firmware wird nun mit den folgenden Kommandos erstellt:

$ export GLUON_LANGS="en de"
$ export GLUON_BRANCH=stable
$ make update
$ make GLUON_TARGET=ar71xx-generic

Mittels "make update" werden die aktuellen Sourcen der verschiedenen Projektbestandteile heruntergeladen.

Das anschließende make-Kommando baut dann die Firmware. Dabei kennzeichnet "GLUON_BRANCH=stable" die Firmware als stabile Variante, das ist wichtig für den Auto-Updater. In unserer site.conf sind noch die Branches "beta" und "experimental" definiert. GLUON_LANGS="en de" ergibt die Sprachunterstützung für deutsch und englisch. "GLUON_TARGET=ar71xx-generic" erstellt die Firmware für die üblichsten der unterstützten Router (AR71xx-basierend).

Alle derzeit verfügbaren Targets können mit dem Script "buildalltargets" auf einmal erstellt werden:

$ export GLUON_LANGS="en de"
$ export GLUON_BRANCH=stable
$ make update
$ buildalltargets

Router flashen

Die erstellte Firmware befindet sich, ausgehend vom Build-Root (~/Develop/Freifunk/gluon-$RELEASE) im Verzeichnis "output/images". Die factory-Images werden zum Flashen von Routern benutzt, welche noch die Original-Firmware des Herstellers besitzen. Mit den sysupgrade-Images werden Router upgedatet, welche bereits mit der Freifunk-Firmware oder einer anderen OpenWRT-Version laufen.

Update

Ein Update von Gluon erfolgt mit folgender Befehlssequenz:

$ cd ~/Develop/Freifunk
$ export RELEASE="ffggrz-1.0.2"
$ export GLUON_RELEASE="1.0.2"
$ export GLUON_LANGS="en de"
$ export GLUON_BRANCH=stable
$ cd gluon-$RELEASE
$ git pull
$ make update
$ make GLUON_TARGET=ar71xx-generic

Nach "git pull" sollte noch kontrolliert werden, ob die site-Konfiguration angepaßt werden muß.

Signieren

Damit die automatischen Updates der Nodes funktionieren, muß die Firmware signiert werden. Dafür benötigt man die ECDSA-Utils:

# emerge -av ecdsautils

Danach werden die Key erzeugt:

$ cd ~/Develop/Freifunk
$ mkdir Update-Signaturen
$ cd Update-Signaturen
$ ecdsakeygen -s > user-secret
$ ecdsakeygen -p < user-secret > user-public

Der public Key (Inhalt von user-public) wird in die site.conf eingetragen. Das Signieren erfolgt dann mittels:

{{{ $ cd ~/Develop/Freifunk $ export RELEASE="ffggrz-1.0.2" $ export GLUON_BRANCH=stable $ cd gluon-$RELEASE $ make manifest $ ./contrib/sign.sh ~/Develop/Freifunk/Update-Signaturen/user-secret ./output/images/sysupgrade/$GLUON_BRANCH.manifest }}}