Openembedded
OpenEmbedded ([1]) ist ein "build framework" für Linux, welches eine Erstellung einer kompletten Linux Distribution ermöglicht. Es ermöglicht auch eine "cross-compilation", d.h. es ermöglicht z.b. auf einem x86 Host PC die Linuxdistribution für z.b. ein AVR32 basierendes System zu erstellen. Im Gegensatz zu build-root können viele Packages, wie z.b. GTK+, QT, X etc "cross-compiled" und installiert werden. Man hat auch die Möglichkeit, eigene Packages zu definieren.
Im folgenden möchte ich kurz vorstellen, wie ich OpenEmbedded verwendet habe, um ein einfaches Linux auf einem ATNGW100 zu erstellen. Es basiert auf dem "Getting Started" Wiki Artikel ( http://wiki.openembedded.net/index.php/Getting_started ).
Erstellen des Arbeitsverzeichnisses:
mkdir OE_ATNGW100
OpenEmebdded basiert auf dem Python Programm Bitbake. Von [2] kann man eine aktuelle Version beziehen und in OE_ATNGW100/bitbake entpacken.
Openembedded wird laufend weiterentwickelt. Die aktuellste Version kann mittels GIT erhalten werden:
git clone git://git.openembedded.org/openembedded
OpenEmbedded wird über das File openembedded/local/local.conf konfiguriert. Die Datei openembedded/conf/local.conf.sample enthält eine Beispielkonfigurationsdatei. Im folgenden erkläre ich meine eigene Version (Die Konfigrationsdatei verlangt absolute Pfade; hier habe ich meine angegeben - diese müssen noch angepaßt werden!). Kommentare sind mit einem vorangestellten # gekennzeichnet.
# Download Verzeichnis angeben.
DL_DIR = "/home/cnovak/OE_ATNGW100/sources"
# Die Konfiguration, Kompilierung & Installation der einzelnen Packages von
# OpenEmbedded werden über sogenannte Recipes gesteuert. Wir stellen den Pfad
# zu den Recipes ein.
BBFILES := "/home/cnovak/OE_ATNGW100/openembedded/recipes/*/*.bb"
# Wir wollen Linux fürs atngw100...
MACHINE = "atngw100"
# ...und zwar eines, das auf der ulibc basiert
TARGET_OS = "linux-uclibc"
# Distributionsnamen festlegen - Ich bin mir nicht sicher, aber man sollte
# diesen verwenden.
DISTRO = "angstrom-2008.1"
# Dateityp des erstellten Images.
IMAGE_FSTYPES = "tar.bz2"
# Offensichtlich sind diese switches notwendig für die ulibc - ganz klar,
# was da passiert, ist es mir aber nicht.
ANGSTROM_MODE = "uclibc"
ANGSTROMLIBC = "uclibc"
PREFERRED_VERSION_uclibc ?= "0.9.30"
PREFERRED_VERSION_uclibc-initial ?= "0.9.30"
Bevor es jetzt wirklich losgeht, müssen noch ein paar Pfade angepaßt werden
export OEBASE=/home/cnovak/OE_ATNGW100
export PATH=$OEBASE/bitbake/bin:$PATH
export BBPATH=$OEBASE/build:$OEBASE/openembedded
export BB_ENV_EXTRAWHITE="OEBASE"
Wie schon oben erwähnt, werden die einzelnen OpenEmbedded Packages über sogenannte recipes erstellt. Ein recipe besteht aus einem Verzeichnis, welches in openembedded/recipe/package_name/ zu finden ist (z.B. enthält openembedded/recipes/nano das recipe für den texteditor nano). Im recipe Verzeichnis ist dann eine *.bb (Text)Datei, die alle Informationen zum Erstellen des entsprechenden Packages enthält; speziell ist angegeben, welche anderen packages benötigt werden.
Eine spezielle recipe Art sind images, das sind komplette Linuxdistributionen. Diese beschreiben, welche recipes in der Distribution enthalten sein werden. Die zugehörigen recipes befinden sich in openembdded/recipes/images. Man kann entweder fertige images verwenden, oder (basierend auf den vorhandenen) eigene images verwenden. Ich habe hier ein eigenes Image in der Datei my_image.bb definiert:
# der verwendete SSH daemon
DISTRO_SSH_DAEMON ?= "dropbear"
# Hier sind alle packages angegeben, die das image verwendet und die
# installiert werden sollen. Weitere Abhängigkeiten werden automatisch
# berücksichtigt. Damit sind diese Zeilen die Wichtigsten - hier wird
# angegeben, was das fertige image kann
DEPENDS = "ctorrent dhcpcd ${DISTRO_SSH_DAEMON} portmap"
IMAGE_INSTALL = "task-boot dhcpcd ctorrent ${DISTRO_SSH_DAEMON} portmap"
IMAGE_LINGUAS = ""
# wir verwenden busybox
IMAGE_LOGIN_MANAGER = "busybox"
IMAGE_DEV_MANAGER = "udev"
IMAGE_INIT_MANAGER = "sysvinit sysvinit-pidof"
IMAGE_INITSCRIPTS = ""
inherit image
# genannt wird das Ganze my-image
export IMAGE_BASENAME = "my-image"
Das image wird mit
bitbake my_image
erstellt. Das ganze braucht eine Menge Zeit (mit einem Pentium Dual Core 2GB Ram mehrere Stunden) und viel Platz (Größenordnung mehrere 10GByte). Es werden die Sourcen runtergeladen, eine cross-Toolchain kompiliert und mit dieser das Linuximage erstellt. Wenn alles gut gegangen ist, befinden sich die Resulte in
OE_ATNGW100/build/tmp/deploy/uclibc/images/ATNGW100/
. Dort befinden sich folgende Dateien
uImage-atngw100.bin # Link auf Linux Kernel
my-image-atngw100.tar.bz2 # Link auf das Root Dateisystem.
Die beiden Files können in das flash gebrannt werden oder auf eine SD Karte kopiert werden & das System kann booten. Zusätzlich befindet sich in einem Unterverzeichnis die cross-compile Toolchain. Diese kann man zum Kompilieren von eigenen Programmen verwenden (wenn man für diese kein eigenes recipe erstellen will).