Aus Raspberry Pi Geek 04/2017

Den Raspberry Pi 3 im 64-Bit-Modus betreiben (Seite 2)

Abbildung 3: Anders als es die Foundation vorsieht, lässt sich der Raspberry Pi 3 durchaus als 64-Bit-System nutzen.

Abbildung 3: Anders als es die Foundation vorsieht, lässt sich der Raspberry Pi 3 durchaus als 64-Bit-System nutzen.

Das 64-Bit-Linux für den Raspberry Pi ist zwar abgespeckt, ansonsten aber voll funktionsfähig. Auch die Konfiguration fällt rudimentär aus und aktiviert beispielsweise das Netzwerk nicht per Default. Einmal mit dem Netzwerk verbunden, lässt sich das System jedoch updaten problemlos aktualisieren und beliebig erweitern: Debian hält hierfür bekanntlich einen reichen Schatz an Paketen bereit.

Listing 1

 

/* hello.c */
#include <stdio.h>
int main( int argc, char **argv, char **envp ) {
  printf("Hello World\n");
  printf("Es handelt sich um eine %d-Bit-Architektur\n", sizeof(int *)*8);
  return 0;
}

Kernel selbst herstellen

Wenn Sie es etwas aufregender möchten, kompilieren Sie einen eigenen, aktuellen 64-Bit-Kernel. Auf dem Raspberry Pi 3 selbst ist das allerdings ein zeitraubender Vorgang. Schneller geht es als Cross-Entwicklung von einem PC aus [5]. Auf einem aktuellen Ubuntu lassen sich die dazu benötigten Entwicklungswerkzeuge als Paket gcc-aarch64-linux-gnu problemlos installieren.

Der Quellcode des Linux-Kernels ist ohnehin fürs Crosscompiling vorbereitet. Dafür benötigen Sie die Kernel-Quellen aus dem Raspberry-Pi-Archiv, die sich zwar nur wenig vom Vanilla-Linux-Kernel unterscheiden, aber ein fehlerfreies Übersetzen garantieren. Insbesondere bringt das Archiv der Foundation die für 64 Bit benötigte Default-Konfiguration bcmrpi3_defconfig mit, die dem Original fehlt.

Den Quellcode legen Sie im Verzeichnisbaum beispielsweise mithilfe von git clone unterhalb von /usr/src/arm/ ab. Das Git-Archiv enthält alle Kernel-Versionen, sodass Sie lokal nur noch die aktuelle Kernel-Version (4.8) auschecken müssen. Dann kann es schon losgehen.

Als Erstes setzen Sie zwei Environment-Variablen, die das Kernel-Buildsystem anweisen, statt des Hostcompilers gcc den Crosscompiler aarch64-linux-gnu-gcc zu verwenden. Vor dem Start der Generierung konfigurieren Sie den Kernel für den Raspberry Pi 3, ein make -j 4 Image dtbs modules startet den Build. Die Option -j 4 erlaubt es Make, bis zu vier Prozesse parallel laufen zu lassen.

Das Übersetzen des Kernels, der Module und des Device Tree kann abhängig von der eingesetzten Hardware durchaus eine gute Stunde dauern. Die genauen Kommandos vom Herunterladen des Quellcodes bis zum Generieren aller Komponenten fasst Listing 2 mit Kommentaren versehen zusammen.

Listing 2

 

$ sudo su
// Crosscompiler installieren
# apt-get install gcc-aarch64-linux-gnu
// Kernel-Quellcode fuer den Raspberry Pi downloaden
# mkdir -p /usr/src/arm/
# cd /usr/src/arm
# git clone https://github.com/raspberrypi/linux.git
# cd linux
// im Git-Archiv vorhandene Versionen anzeigen
// und eine aktuelle Version auschecken
# git branch -a
# git checkout rpi-4.8.y
// Cross-Generierung des Kernels
# export CROSS_COMPILE=aarch64-linux-gnu-
# export ARCH=arm64
# make bcmrpi3_defconfig
# make -j 4 Image dtbs modules

Die Karte ausspielen

Die Installation von Kernel, Modulen und Device Tree gestaltet sich etwas komplizierter. Als Grundlage dient uns eine mit dem “Xylnao”-System [4] präparierte Micro-SD-Karte, die wir in den Entwicklungsrechner stecken. Das dort laufende Ubuntu hängt die beiden Partitionen der Karte (Boot und Root) automatisch unterhalb von /media/User/ ein, wie die Ausgabe des Kommandos lsblk in Abbildung 4 zeigt.

Abbildung 4: Hier hat Ubuntu die Micro-SD-Karte eingehängt. Der »cp«-Befehl kopiert lediglich den selbst übersetzten Kernel als Datei »Image« auf die Boot-Partition. Dann kann man die Boot- und Root-Partitionen wieder aushängen.

Abbildung 4: Hier hat Ubuntu die Micro-SD-Karte eingehängt. Der »cp«-Befehl kopiert lediglich den selbst übersetzten Kernel als Datei »Image« auf die Boot-Partition. Dann kann man die Boot- und Root-Partitionen wieder aushängen.

Zum Einspielen des eigenen Kernels bieten sich zwei Möglichkeiten an: die Variante für Ungeduldige und die professionelle Spielart. Ungeduldige kopieren lediglich den selbst kompilierten Kernel arch/arm64/boot/Image auf die Boot-Partition (Abbildung 4). Das auf der Boot-Partition befindliche U-Boot-Skript erwartet ihn dort unter diesem Namen, sodass man sich ein Ändern der Konfiguration spart. Wollen Sie auf Nummer sicher gehen, retten Sie den auf der SD-Karte unter gleichem Namen liegenden 64-Bit-Kernel, bevor Sie ihn mit dem eigenen Kernel überschreiben.

Für einen ersten Test eignet sich der auf der SD-Karte ebenfalls schon vorhandene Device Tree. Sie hängen also die Karte direkt nach dem Kopieren des Kernels aus und stecken sie in den Raspberry Pi. Mit Strom versorgt, sollte dieser nun den selbst generierten Kernel booten.

Profis konfigurieren U-Boot

Die professionelle Installation sieht vor, den Kernel unter einem eigenen Namen auf die Micro-SD-Karte zu kopieren, den richtigen Device Tree zu verwenden und vor allem die Kernel-Module auf die Root-Partition zu platzieren. Die neuen Namen für Kernel und Device Tree erzwingen allerdings ein Anpassen der Bootloader-Konfiguration von U-Boot [6].

Listing 3 zeigt das entsprechende U-Boot-Skript boot.txt dafür, das mithilfe des Programms Mkimage aus dem Paket u-boot-utils einen U-Boot-Header erhält (Listing 4). Haben Sie alles so weit vorbereitet, hängen Sie die beiden Partitionen wieder aus und halten nun ein voll funktionsfähiges System in der Hand.

Der U-Boot-Bootloader lässt sich übrigens ähnlich leicht als 64-Bit-Variante generieren wie der Kernel. Dazu holen Sie per Git den Quellcode auf die heimische Maschine, setzen die Generierungsvariablen ARCH und CROSS_COMPILE, konfigurieren U-Boot für den Raspberry Pi 3 und lassen das Boot schließlich per Make vom Stapel.

Listing 3

 

fatload mmc 0:1 ${fdt_addr_r} bcm2710-rpi-3-b.dtb
fatload mmc 0:1 ${kernel_addr_r} Image.4.8
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rw
booti ${kernel_addr_r} - ${fdt_addr_r}

Listing 4

 

$ sudo su
# cd /usr/src/arm/linux
// Kernel und Device Tree installieren
# cp arch/arm64/boot/Image /media/quade/A828-120E/Image.4.8
# cp arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dtb /media/quade/A828-120E/
// Kernel-Module installieren
# make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 \
  INSTALL_MOD_PATH=/media/quade/efcb352e-67ea-4eea-9ba4-205be4000670/ \
  modules_install
// U-Boot-Skript anlegen
# cd /media/quade/A828-120E
# vim boot.txt
//Bootloader-Skript generieren
# apt-get install u-boot-tools
# mkimage -A arm64 -O linux -T script -C none -d boot.txt boot.scr.uimg
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben