Die nachfolgende Beschreibung ist aus einem neuen Kapitel im Skript, das ich eben hinzugefügt habe. Neben diesem Kapitel enthält es noch weitere neue Kapitel zur Integration von Node.JS sowie grafischer Oberflächen in die mit Buildroot erstellte Firmware.


Dem Linux-Kernel können beim Starten verschiedene Parameter mitgegeben werden, um das Verhalten des Betriebssystems zu beeinflussen. Beispielsweise bekommt der Kernel oftmals den Namen der Root-Partition als Parameter übergeben, damit er diese während dem Startvorgang mounten und somit nutzbar machen zu können. Wo die Parameter einzutragen sind hängt dabei von der jeweiligen Hardware-Plattform sowie dem verwendeten Boot-Loader ab. Im Falle des Rasperry Pi ist es aber ganz einfach. Dort befindet sich auf der ersten Partition der SD-Karte eine Datei namens cmdline.txt. Sie enthält genau eine Zeile mit den an den Kernel zu übergebenen Bootparametern.

dennis@metropolis:/run/media/dennis/0FBE-CE26$ more cmdline.txt 
root=/dev/mmcblk0p2 rootwait console=tty1 console=ttyAMA0,115200

Wie Sie sehen bekommt der Kernel hier folgende Parameter übergeben:

root=/dev/mmcblk0p2

Teilt dem Kernel mit, dass die zweite Partition (p2) der SD-Karte (/dev/mmcblk) das Dateisystem mit dem Root-Verzeichnis beinhaltet.

rootwait

Weist den Kernel an, beim Einhängen der Root-Partition ohne Timeout auf die SD-Karte zu warten.

console=tty1

Sorgt dafür, dass alle Kernel-Meldungen auf der ersten virtuellen Konsole ausgegeben werden. Deshalb sehen Sie so viele Meldungen vorbeiziehen, während das System startet.

console=ttyAMA0,115200

Weist den Kernel an, seine Meldungen mit einer Baudrate von 115200 Bits / Sekunde auf dem Serial Port auszugeben. Diese Möglichkeit wird insbesondere von eingebetteten Systemen genutzt, um die Kernelmeldungen verfügbar zu machen, ohne Sie auf dem Display des Geräts anzuzeigen.

Eine gute Übersicht der möglichen Kernel-Parameter finden Sie zum Beispiel auf redsymbol.net (http://redsymbol.net/linux-kernel-boot-parameters/). Ein weiterer nützlicher Parameter könnte in diesem Zusammenhang auch quiet sein. Durch ihn unterdrücken Sie sämtliche Kernel-Meldungen bis auf wirklich schwerwiegende Fehler, wodurch das System auch ein wenig schneller startet. Um ihn zu ergänzen, hängen Sie ihn einfach durch ein Leerzeichen getrennt an die Zeile in der cmdline.txt-Datei an:

dennis@metropolis:/run/media/dennis/0FBE-CE26$ more cmdline.txt 
root=/dev/mmcblk0p2 rootwait console=tty1 console=ttyAMA0,115200 quiet

Allerdings hat dieses Vorgehen den Nachteil, dass die Änderung bei jeder Neuerstellung der Firmware verloren geht. Sie müssten die Änderung daher jedes mal wiederholen, wenn Sie ein neues Firmeware-Image bauen und auf die SD-Karte schreiben. Nachfolgend soll daher gezeigt werden, wie Sie die Änderung in den Build-Prozess von Buildroot integrieren können. Leider ist dies etwas aufwändig, da hierfür überraschenderweise keine einfache Möglichkeit in Buildroot vorgesehen ist. Sehr schwer ist es aber nicht.

Zunächst müssen Sie verstehen, wie nach dem Zusammenstellen des Wurzeldateisystems das finale Abbild der SD-Karte erzeugt wird. Hierfür ist die folgende Konfigurationsoption zuständig:

System configuration → Custom scripts to run after creating filesystem images

Wie Sie sehen, ist dort der Wert board/raspberrypi3/post-image.sh voreingestellt, wobei sich der Pfad auf das Buildroot-Verzeichnis bezieht. Der vollständige Pfad lautet daher ~/buildroot/board/raspberrypi3/post-image.sh. Wenn Sie sich das Skript dabei anschauen, fällt Ihnen am Ende des Skripts sicher folgender Befehl auf:

genimage                           \
    --rootpath "${TARGET_DIR}"     \
    --tmppath "${GENIMAGE_TMP}"    \
    --inputpath "${BINARIES_DIR}"  \
    --outputpath "${BINARIES_DIR}" \
    --config "${GENIMAGE_CFG}"

Dieser Befehl ist es, der die fertige sdcard.img-Datei erzeugt. ${TARGET_DIR} verweist dabei auf das Verzeichnis mit dem assemblierten Wurzeldateisystem (Partition 2 auf der SD-Karte). ${BINARIES_DIR} hingegen ist das Verzeichnis, in dem die Dateien für die Boot-Partition abgelegt werden, indem sich auch die Datei cmdline.txt befindet. Die Idee, um den Inhalt dieser Datei anzupassen, ist daher, ein eigenes Skript zu schreiben, das vor dem bereits hinterlegten Skript läuft und die cmdline.txt für uns anpasst.

Legen Sie hierfür im custom-Verzeichnis eine neue Datei mit folgendem Inhalt an und sorgen Sie dafür, dass die Datei ausführbar ist. Den genauen Inhalt müssen Sie natürlich anpassen, je nachdem welche Bootparameter Sie an den Kernel übergeben möchten. Achten Sie beim Abschreiben auch auf die genaue Schreibweise und dabei insbesondere auf falsch platzierte Leerzeichen, da das Skript sonst nicht funktioniert.

buildroot@debian:~/custom$ nano cmdline.sh
#! /bin/sh
echo ">> Füge weitere Bootparameter in der cmdline.txt hinzu"

# Einlesen der Bootparameter aus cmdline.txt
CMDLINE_TXT="$BINARIES_DIR/rpi-firmware/cmdline.txt"
BOOT_PARAMS=""

while read line; do
    if [ -z "$BOOT_PARAMS" ]; then
        BOOT_PARAMS="$line"
    else
        BOOT_PARAMS="$BOOT_PARAMS $line"
    fi
done < "$CMDLINE_TXT"

# Fügen Sie hier nach Bedarf weitere Parameter hinzu
BOOT_PARAMS="$BOOT_PARAMS quiet"

# Veränderten Inhalt in cmdline.txt schreiben
echo "$BOOT_PARAMS" > "$CMDLINE_TXT"
buildroot@debian:~/custom$ chmod +x cmdline.sh

Anschließend starten Sie das Buildroot-Konfigurationsmenü und ändern Sie folgenden Wert, damit das neue Skript aufgerufen wird:

System configuration → Custom scripts to run after creating filesystem images:
$(BR2_EXTERNAL_DHBW_PATH)/cmdline.sh board/raspberrypi3/post-image.sh

Anschließend bauen Sie ein neues Firmware-Image. Wenn alles geklappt hat, beinhaltet die cmdline.txt auf der ersten Partition nun die veränderten Bootparameter.

Anpassen der Linux Bootparameter