Bei der Erstellung einer eigenen Embedded-Linux-Distribution mit Yocto besteht die Möglichkeit, eine unterstützte Linux-Distribution wie Ubuntu oder CentOS zu installieren und in diesem Rahmen die erforderlichen Werkzeuge zu installieren. Alternativ besteht die Möglichkeit, den gesamten Prozess in einem Docker-Container auszuführen.
Dies hat den Vorteil, dass man unabhängiger vom Host-Betriebssystem ist, da Docker Container sowohl unter Linux als auch auf Windows funktionieren. Im Fall von Linux ist die Auswahl der Distribution wesentlich flexibler, sofern Docker verfügbar ist.Die Installation von Docker selbst wird an anderer Stelle ausführlich erläutert, beispielsweise auf den Webseiten von Docker oder der verwendeten Linux-Distribution.
Zunächst wird ein Docker-Volume erstellt, in dem alle Dateien des Yocto Build-Systems abgelegt werden. Zu diesem Zweck wird ein Verzeichnis im Benutzerverzeichnis verwendet, was die Arbeit mit Yocto vereinfacht, da ein einfacher Zugriff auf die Dateien aus dem Hostsystem heraus möglich ist.
docker volume create yocto --opt type=none --opt device=~/yocto/ --opt o=bind
Im Anschluss wird der Docker-Container erstellt und gestartet, wobei das gerade erstellte Volume mit angegeben wird.
docker run --rm -it --name=crops-yocto -v yocto:/workdir crops/poky:debian-12 --workdir=/workdir
Wird der Container nun mittels exit verlassen, so wird dieser zwar gelöscht, sämtliche Daten bleiben jedoch erhalten. Der Container kann jederzeit mit dem oben genannten Befehl neu gestartet und die Arbeit fortgesetzt werden.
Im Anschluss werden die benötigten Git-Repositories ausgecheckt, sodass die erforderliche Verzeichnissstruktur sowie die erforderlichen Dateien erstellt werden. Für die Erstellung eines Images für den Raspberry Pi, welches die Qt-Bibliotheken enthalten soll, müssen noch zwei weitere Repositories angegeben werden.
git clone -b kirkstone git://git.yoctoproject.org/poky poky-kirkstone
cd poky-kirkstone
git clone -b kirkstone git://git.openembedded.org/meta-openembedded
git clone -b kirkstone git://git.yoctoproject.org/meta-security.git
git clone -b kirkstone git://git.yoctoproject.org/meta-raspberrypi
git clone -b 6.8.3 git://code.qt.io/yocto/meta-qt6.git
Beim Auschecken der Dateien wird der Branch „kirkstone“ verwendet, das ist die Version der Poky-Distribution, die verwendet werden soll. Im Falle von Qt wird der Branch 6.8.3 verwendet, welcher zum Zeitpunkt der Beitragserstellung die aktuelle Version darstellt. Es sei darauf hingewiesen, dass eine LTS-Version von QT ausschließlich unter Verwendung einer kommerziellen Lizenz nutzbar ist.
Im nächsten Schritt ist es erforderlich, die Build-Umgebung zu initialisieren, was wie folgt geschieht.
cd ..
source poky-kirkstone/oe-init-build-env rpi-build
Es wurde ein neues Verzeichnis mit der Bezeichnung rpi-build erstellt, in dem später alle erstellten Pakete, Images usw. abgelegt werden.
Das Verzeichnis rpi-build enthält ein Verzeichnis namens conf mit Dateien, die zur Konfiguration der individuellen Linux-Distribution benötigt werden. Die Dateien bblayers.conf und local.conf müssen jeweils an die spezifischen Anforderungen angepasst werden. Die Dateien können aus dem Hostsystem heraus editiert werden. Zunächst wird die local.conf angepasst.
rpi-build/conf/local.conf
# Machine Selection
#MACHINE ??= "raspberrypi5"
MACHINE ??= "raspberrypi4-64"
...
# Where to place downloads
DL_DIR ?= "${TOPDIR}/downloads"
...
# Where to place shared-state files
SSTATE_DIR ?= "${TOPDIR}/sstate-cache"
...
# Where to place the build output
TMPDIR = "${TOPDIR}/tmp"
...
IMAGE_FSTYPES = "ext4.xz rpi-sdimg"
SDIMG_ROOTFS_TYPE = "ext4.xz"
In der Datei bblayers.conf sind die für den Raspberry Pi benötigten Layer noch hinzuzufügen.
rpi-build/conf/bblayers.conf
# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"
BBPATH = "${TOPDIR}"
BBFILES ?= ""
BBLAYERS ?= " \
/workdir/poky-kirkstone/meta \
/workdir/poky-kirkstone/meta-poky \
/workdir/poky-kirkstone/meta-raspberrypi \
"
Die Build-Umgebung ist jetzt bereit und das erste Image kann mit dem folgenden Befehl erstellet werden. Das kann aber ein paar Stunden dauern.
bitbake core-image-minimal
Nach Abschluss des Imaging-Vorgangs wird das Image der SD-Karte in dem Verzeichnis rpi-build/tmp/deploy/images/raspberrypi4-64 gespeichert. Das Image trägt die Bezeichnung core-image-minimal-raspberrypi4-64.rpi-sdimg. Dieses Image kann mit dem Programm dd auf eine SD-Karte geschrieben werden.
sudo dd if=~/yocto/rpi-build/tmp/deploy/images/raspberrypi4-64/core-image-minimal-raspberrypi4-64.rpi-sdimg bs=1M of=/dev/sdb
Dabei ist /dev/sdb die SD-Karte, auf Windows können entsprechend andere Tools wie z.B. Balena Etcher verwendet werden.
