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 ( |
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.