Embedded Software - Yocto Build Raspberry Pi 4 ein Screenshot eines Computers

Yocto erstellt Raspberry Pi 4

in einer Docker-Umgebung

Leitfaden zum Yocto-Projekt mit offenem Quellcode

Tipps zur Einrichtung von benutzerdefiniertem Linux auf Raspberry Pi mit Docker

Open Source Yocto Project Anleitung für benutzerdefiniertes Linux auf Raspberry Pi mit Tipps zur Einrichtung von Docker

Tauchen Sie ein in das Yocto-Projekt für benutzerdefinierte Linux-Systeme auf jeder Hardware. Perfekt für Entwickler und Embedded Systems-Enthusiasten. Fangen Sie jetzt an zu bauen!

Lernen Sie das Yocto-Projekt kennen, eine Open-Source-Initiative zur Erstellung von maßgeschneiderten Linux-Systemen für jede Hardware-Architektur. Lernen Sie, CROPS für die plattformübergreifende Entwicklung zu nutzen, Docker-Container einzurichten und maßgeschneiderte Linux-Images für eingebettete und IoT-Geräte zu erstellen. Unser Leitfaden behandelt die Einrichtung unter macOS, die Konfiguration von Build-Umgebungen und die Optimierung für Raspberry Pi. Egal, ob Sie Anfänger oder Experte sind, hier finden Sie Best Practices, Tools und Community-Support für Ihre Linux-Projekte.

Yocto läuft im Docker-Container

In den Yocto-Dokumenten gibt es ein Kapitel (2.2.2) zum Einrichten von Cross-Plattformen (CROPS) als Alternative zum Einrichten eines nativen Linux-PCs. Diese Alternative verwendet Docker-Container, um ein benutzerdefiniertes System-Image zu erstellen, z. B. für den Raspberry Pi.

Leider gibt es nach meinem Verständnis einige kleine Fehler in der Dokumentation zum Einrichten dieser Umgebung unter Mac OS X (Monterey).

Docker-Container für Mac OS X einrichten

Für die Verwendung des Crops-Dockers unter Linux, Windows und Mac OS X sind einige spezielle Einstellungen erforderlich. Bevor Sie den Container für Yocto einrichten, müssen Sie ein Docker-Datenvolumen erstellen, um die Ergebnisse zu speichern. Auch ein Docker-Container mit Samba wird verwendet, um die Dateien in Mac OS X bereitzustellen.

Docker-Datenvolumen erstellen

Geben Sie in einem Terminalfenster die folgenden Befehle ein:

docker volume create --name raspberry
docker run -it --rm -v raspberry:/workdir busybox chown -R 1000:1000 /workdir

# Erstellen und Ausführen eines Samba-Containers

OSX lässt Sie keine Verbindung zu einer lokal ausgeführten Samba-Freigabe herstellen. Daher müssen Sie zuerst einen Alias für 127.0.0.1 von 127.0.0.2 erstellen.

sudo ifconfig lo0 127.0.0.2 alias up

Erstellen Sie dann den Samba-Container, mit dem Sie die Dateien im Docker-Datenvolumen anzeigen können:

docker create -t --expose 445 -p 127.0.0.2:445:445 --name samba -v raspberry:/workdir crops/samba

Da Sie den Alias immer benötigen, um sich mit dem Samba-Container zu verbinden, können Sie den Start von Samba und Alias so kombinieren:

docker start samba && sudo ifconfig lo0 127.0.0.2 alias up

Nun können Sie workdir im Dateibrowser öffnen. Klicken Sie im Finder auf "Steuerung-K" und im Server-Adressfeld auf "smb://127.0.0.2/workdir" und klicken Sie auf "Verbinden". Nun sollten Sie den Inhalt des Docker-Datenvolumens im Finder sehen.

Erstellen und Starten des Yocto-Containers

Um den Yocto-Container zu erstellen und/oder zu starten, geben Sie in einem Terminalfenster Folgendes ein:

docker run --rm -it --name=crops-poky -v raspberry:/workdir crops/poky:ubuntu-20.04 --workdir=/workdir

Build-Umgebung im Container einrichten

Wenn der Docker-Container gestartet wird, gibt es eine Terminal-Eingabeaufforderung, die wie folgt aussieht: "pokyuser@d4ddfe042587:/workdir".

Jetzt können Sie die Build-Umgebung einrichten.

Poky-Version klonen

In meinem Fall verwende ich Yocto Version 3.4 mit dem Namen "Honister", da die Meta-Raspberry-Layers derzeit nicht für neuere Poky-Versionen verfügbar sind. Beim ersten Mal müssen Sie das Poky-Repository klonen:

git clone -b honister git://git.yoctoproject.org/poky poky-honister

Wenn Sie Poky auf die neueste Version aktualisieren möchten:

cd poky-honister
git pull --all --prune

Zusätzliche Meta-Layers für Raspberry Pi

Wechseln Sie zu "poky-honister" und klonen Sie die folgenden Repositories: meta-raspberry, meta-openembedded und bei Bedarf meta-qt5

cd poky-honister
git clone -b honister git://git.yoctoproject.org/meta-raspberrypi
git clone -b honister git://git.openembedded.org/meta-openembedded
git clone -b honister https://github.com/meta-qt5/meta-qt5.git

# Build-Konfiguration einrichten

Verlassen Sie das Poky-Honister-Verzeichnis und gehen Sie zum Verzeichnis /workdir. Beziehen Sie nun die Build-Umgebung mit dem Skript oe-init-build-env.

cd ..
source poky-honister/oe-init-build-env rpi-build

Es wird ein neues Verzeichnis "rpi-build" – Sie können es beliebig benennen – und ein conf-Verzeichnis mit den Dateien bblayers.conf, local.conf und templateconf.cfg erstellt.

Da im Container kein Texteditor installiert ist, müssen Sie entweder die Konfigurationsdateien im gemounteten Samba-Volume in Mac OS X bearbeiten oder einen Texteditor im Container installieren. Dazu müssen Sie ein zweites Terminalfenster öffnen – während der Yocto-Container läuft – und eine Bash-Shell im Container mit Root-Rechten starten:

docker exec -it --user=root crops-poky bash
apt-get install nano
exit

Dann können Sie die Konfigurationsdateien im Yocto-Container als Poky-User bearbeiten.

Hinweis

Der Editor wird nicht permanent installiert. Wenn Sie den Container verlassen und dann erneut Aufrufen, müssen Sie diesen erneut installieren

Fügen Sie der Datei bblayers.conf zuerst das Meta-Raspberry hinzu

nano conf/bblayers.conf

Fügen Sie "/workdir/poky-honister/meta-raspberrypi " hinzu, sodass es wie folgt aussieht

BBLAYERS ?= " \
  /workdir/poky-honister/meta \
  /workdir/poky-honister/meta-poky \
  /workdir/poky-honister/meta-yocto-bsp \
  /workdir/poky-honister/meta-raspberrypi \
  "

und speichern Sie dann.

Bearbeiten Sie im zweiten Schritt local.conf

Bearbeiten Sie die Datei local.conf:

nano conf/local.conf

Ändern Sie die folgenden Zeilen:

  • MACHINE ??= "qemux86-64" -> MACHINE ??= "raspberrypi4-64"

Je nachdem, welches Raspberry Sie verwenden möchten (Raspberrypi0, Raspberrypi0w, Raspberrypi3, Raspberrypi3-64, Raspberrypi4, Raspberrypi4-64, etc.)

Entkommentieren Sie die folgenden Zeilen:

  • DL_DIR ?= "${TOPDIR}/Downloads"
  • SSTATE_DIR ?= "${TOPDIR}/sstate-cache"
  • TMPDIR = "${TOPDIR}/tmp"

Fügen Sie die folgenden Zeilen am Ende hinzu, damit ein sdimg auf einer SD-Karte blinkt:

  • IMAGE_FSTYPES = "ext4.xz rpi-sdimg"
  • SDIMG_ROOTFS_TYPE = "ext4.xz"

Speichern Sie die Datei local.conf.

Bitbake das erste Image

Jetzt haben Sie minimale Einstellungen, um das erste Image zu erstellen:

bitbake -k core-image-minimal

In der Yocto-Dokumentation finden Sie eine kurze Beschreibung der verfügbaren Image-Beschreibungen.

Zum Beispiel:

  • core-image-minimal: Ein kleines Image, das gerade noch in der Lage ist, einem Gerät das Booten zu ermöglichen.
  • core-image-base: Ein Image nur für Konsolen, das die Hardware des Zielgeräts vollständig unterstützt.
  • core-image-full-cmdline: Ein reines Konsolen-Image mit installierter umfassenderer Linux-Systemfunktionalität.

Nach einer Weile – das kann beim ersten Mal mehrere Stunden beanspruchen – schließt das Bitbake seinen Vorgang ab und Sie finden die sdimg-Datei in folgendem Verzeichnis:

/workdir/rpi-build/tmp/deploy/images/raspberrypi4-64

Zusätzliche Konfigurationen

Extra Raspberry-Hardware-Konfigurationen

Für das Festlegen bestimmter Hardwareeinstellungen finden Sie weitere Informationen auf extra-apps.md und extra-build-config.md. Sie finden diese Dateien auch im Verzeichnis meta-raspberrypi/docs.

Das Meta-Layer bietet außerdem eine Image-Konfiguration "rpi-test-image" zur Verwendung mit Bitbake. Das Image basiert auf "core-image-base", das die meisten Pakete in meta-raspberrypi und einige Medienbeispiele enthält.

bitbake -k rpi-test-image

Zusätzliche Softwarekonfigurationen

Je nachdem, welche Image-Build-Konfiguration Sie verwenden, müssen Sie möglicherweise zusätzliche Softwarepakete installieren.

Sie können dies tun, indem Sie der Datei local.conf einige Einstellungen hinzufügen.

Fügen Sie zum Beispiel die folgenden Zeilen hinzu, um ssh-server, pi-user und systemd festzulegen:

## packages
IMAGE_INSTALL:append = " openssh-sftp-server sudo python3 python3-pip rpi-gpio raspi-gpio"
IMAGE_FEATURES:append = " ssh-server-openssh"

## systemd settings
DISTRO_FEATURES:append = " systemd"
VIRTUAL-RUNTIME:init_manager = "systemd"
VIRTUAL-RUNTIME:initscripts = ""
IMX_DEFAULT_DISTRO_FEATURES:append = " systemd"

Oder fügen Sie Python hinzu:

IMAGE_INSTALL:append = " python3 python3-pip rpi-gpio raspi-gpio"

Hinweis

Das Leerzeichen am Anfang von " python3 python3-pip rpi-gpio raspi-gpio" ist wichtig, da der Text an die vorhandene Konfiguration angehängt wird und mit diesem Leerzeichen getrennt werden muss.

Urheberrechtslizenz

Copyright © 2022 Interelectronix e.K.
Dieser Projekt-Quellcode ist unter der GPL-3.0 Lizenz lizenziert.

Danksagungen

Quellen, die zum Erstellen dieser Anleitung verwendet werden:

Vielen Dank an alle.