OpenWrt Buildroot unter Debian 6.0 "Squeeze" Howto
Einleitung
In vielen Projekten verwende ich die speziell für WLAN-Devices entwickelte Distribution OpenWrt als Basis zur Entwicklung neuer Systeme. Um die Firmware für seine eigenen Zwecke modifizieren zu können, benötigt man dabei eine entsprechende Entwicklungsumgebung, um sowohl Anpassungen an der Firmware vornehmen als auch diese kompilieren zu können. Ich verwende persönlich jeweils den aktuellsten Quellcode aus dem Entwicklerzweig trunk.
Die Entwicklungsumgebung für Anpassungen und Kompilierung von OpenWrt wird als Buildroot bezeichnet und bietet eine Art Sandbox an, die vom restlichen System (in meinem Fall eine Minimalinstallation von Debian GNU/Linux 6.0 “Squeeze”) isoliert ist und alle benötigten Werkzeuge, Programme und Bibliotheken enthält. Einerseits ermöglicht ein Buildroot das Kompilieren der gesamten Firmware als auch die Erzeugung einzelner Software-Pakete für OpenWrt.
Installation der benötigten Software
Zunächst benötigen wir einige Softwarepakete, die wir direkt aus dem Debian-Repository installieren:
# aptitude install bison flex build-essential cvs gawk libncurses5-dev mercurial
subversion zlib1g-dev unzip
Da wir unser Firmware-Image aus den Entwicklersourcen heraus kompilieren wollen, checken wir diese zunächst aus dem Subversion-Repository des Projekts aus:
$ cd ~
$ svn co svn://svn.openwrt.org/openwrt/trunk/
Nachdem unser Subversion-Client eine lokale Kopie der Entwicklersourcen erstellt hat, quittiert er diesen Vorgang mit der Angabe der ausgecheckten Revision. Aktuell ist die Revision 27170 verfügbar (Stand: Juni 2011):
...
Checked out revision 27170.
Kompilieren eines Firmware-Images
Nachdem wir die benötigten Tools und die Sourcen von OpenWrt installiert haben, können wir nun unsere Firmware kompilieren. Dazu wechseln wir in den Ordner trunk:
$ cd ~/trunk
... und rufen darin die Konfigurationsoberfläche von OpenWrt auf mittels:
$ make menuconfig
Je nach verwendeter Hardware, für die das Firmware-Image generiert wird, müssen wir an dieser Stelle einige wichtige Charakteristika der Firmware definieren. So müssen wir bspw. die Zielplattform angeben (zu finden unter Target System). Nachdem wir alle Optionen angepasst haben, lassen wir die Konfiguration automatisch speichern und finden diese anschließend in der Datei ~/trunk/.config.
Anschließend bauen wir das Firmware-Image mittels:
$ make V=99
Das Bauen des Buildroots und des OpenWRT Flash-Images kann dabei je nach verwendeter Hardware bis zu einigen Stunden dauern. Ist der Kompiliervorgang erfolgreich abgeschlossen, finden wir die einzelnen für uns wichtigen Dateien in den folgenden Verzeichnissen:
- OpenWRT Flash-Images:
~/trunk/bin(je nach Architektur in dem entsprechenden Unterverzeichnis, in unserem Fall alsoatheros) - IPK-Pakete, die später auf dem WLAN Router installiert werden können:
~/trunk/bin/atheros/packages(auch hier je nach Router-Architektur)
Bei einer Standardinstallation des Buildroots, wie oben beschrieben, wird lediglich eine minimalistische Basisversion von diesem gebaut. Der bis hierhin generierte Buildroot enthält lediglich alle benötigten Werkzeuge, erlaubt jedoch keine Integration weiterer Pakete in das Flash-Image. Für alle Pakete, die außerhalb dieses Basissystems gepflegt werden existieren sogenannte Feeds. Diese integrieren wir in die Buildroot Umgebung mittels der folgenden Kommandos:
$ cd ~/trunk
$ scripts/feeds update -a
$ scripts/feeds install -a
Nun können wir erneut die Konfiguration der Kompilieroptionen aufrufen und in der menuconfig-Oberfläche die entsprechenden Pakete auswählen, die in das Firmware-Image integriert werden sollen:
$ make menuconfig
An dieser Stelle können beliebige Pakete und Kompilieroptionen angegeben werden, die in das Flash-Image integriert werden sollen. Insbesondere kann an dieser Stelle unter dem Punkt Administration eine der beiden Managementoberflächen X-WRT bzw. LuCI gewählt werden.
Anschließend bauen wir die Firmware mittels:
$ make V=99
Die Kompilierung des Firmware-Images nimmt auch hier einige Zeit in Anspruch.
Tipps zum Umgang mit dem OpenWRT Buildroot
Innerhalb des OpenWRT Buildroots können unterschiedliche Kommandos ausgeführt werden, die uns die Arbeit mit dem Buildroot und dem generierten Flash-Image erleichtern. Ich werde einige dieser Kommandos im Folgenden erörtern.
Buildroot aktualisieren
Da wir zu jedem Zeitpunkt die aktuellen Entwickler-Sourcen verwenden wollen, aktualisieren wir zunächst den Buildroot, bevor wir darin andere Aktionen ausführen:
$ cd ~/trunk
$ svn up
Anschließend befinden sich die Sourcen innerhalb unserer Buildroot-Umgebung auf dem aktuellsten, von den Entwicklern verwendeten Stand.
Feeds für externe Pakete updaten
Da wir bspw. LuCI als Weboberfläche verwenden und nur die entsprechenden LuCI-Pakete von extern einbinden wollen, werden wir diese als Feed einbinden. Dazu erstellen wir die Konfigurationsdatei ~/trunk/feeds.conf und fügen ihr die folgende Zeile hinzu:
src-svn luci http://svn.luci.subsignal.org/luci/branches/luci-0.9/contrib/package
Anschließend führen wir die folgenden Kommandos aus:
$ cd ~/trunk
$ scripts/feeds update
Neue Programme aus den Feeds installieren
$ cd ~/trunk
$ scripts/feeds install -p -a luci
Kernel des OpenWRT-Images konfigurieren
$ cd ~/trunk
$ make kernel_menuconfig
Einzelne Pakete neu kompilieren
$ cd ~/trunk
$ make package/Paketverzeichnis/ clean
$ make package/Paketverzeichnis/ compile
