FreeBSD auf Raspberry Pi

liv Friis-larsen, 123RF

Himbeere mit Sahne

Ein FreeBSD-System auf einem Raspberry Pi ist eine interessante Alternative zu den bekannten Linux-Systemen. Die Installation geht nicht ganz so leicht von der Hand, aber man wird mit einem äußerst stabilen System belohnt. Das ADMIN-Magazin führt durch den Prozess.
ADMIN 03/14 stellt Erste-Hilfe-Tipps zu Windows-Rettung, Backup und Recovery bei Datenbanken vor und verrät wie man Linux-Systeme vollständig sichert und ... (mehr)

Der Raspberry Pi kann praktisch alles. Als preiswerter Einplatinencomputer in der Größe einer Kreditkarte hat sich das Gerät der Raspberry-Pi-Foundation schnell zum Publikumsliebling gemausert – nicht nur unter Freunden der vielen eigens angepassten Linux-Distributionen, sondern auch unter jenen des ebenfalls freien FreeBSD-Betriebssystems [1].

Die wichtigste Komponente der Platine bildet das auf dem Raspberry Pi sitzende Ein-Chip-System von Broadcom. Es enthält einen 700-Megahertz-ARM-Prozessor sowie je nach Modell 256 oder 512 MByte Arbeitsspeicher. Man spricht von einem System-on-a-Chip (SoC), da es die drei Komponenten Mikroprozessor, Grafikprozessor, Arbeitsspeicher und ein paar Peripheriebausteine vereint (siehe Abbildung 1). Eine echte Festplattenschnittstelle fehlt dem Taschencomputer leider. Stattdessen kommen SD- oder MMC-Speicherkarten zum Einsatz. Darüber hinaus lassen sich am USB-Port externe Festplatten und USB-Sticks betreiben, allerdings nicht als Bootmedium. Tabelle 1 zeigt die Ausstattungen der beiden erhältlichen Modelle A und B im Detail.

Tabelle 1

Die Modellvarianten des Raspberry Pi

 

Modell A

Modell B

Preis

25 bis 30 Euro

40 bis 45 Euro

Größe

85,60mm x 53,98mm x 17mm (Kreditkartengröße)

System-on-Chip (SoC):

Broadcom BCM2835

Prozessor

ARM1176JZF-S (700 MHz)

Grafik

Broadcom VideoCore IV

Arbeitsspeicher (SDRAM)

256 MByte

512 MByte (ab November 2012)

USB-2.0-Anschlüsse

1

2 (über integrierten Hub)

Video

FBAS (Cinch), HDMI

Ton

3,5-mm-Klinkenstecker (analog) oder HDMI (digital)

Nicht flüchtiger Speicher

Kartenleser für SD (SDHC und SDXC)/MMC/SDIO

Netzwerk

10/100-MBit-Ethernet-Controller (LAN9512 von SMSC)

Schnittstellen

Bis 17 GPIO-Pins, SPI, I2C, UART, EGL

Echtzeituhr

Leistungsaufnahme

5 V, 500 mA (2,5 Watt)

5 V, 700 mA (3,5 Watt)

Stromversorgung

5-V-Micro-USB-Anschluss (Micro-B)

Betriebssysteme

GNU/Linux, BSD, RISC OS, Plan 9

Abbildung 1: Die Bausteine und Anschlüsse eines Raspberry Pi, Modell B.

Der Raspberry Pi bietet eine frei programmierbare Schnittstelle, bekannt als General Purpose Input/Output (GPIO). Sie ermöglicht es Programmierern, ihrer Fantasie freien Lauf zu lassen, indem sie Leuchtdioden, Sensoren, Displays und andere Geräte darüber ansteuern. Lediglich Apparaturen mit hohem Schaltstrom sollte man nicht anschließen, denn diese könnte die GPIO beschädigen.

Das System-on-a-Chip bietet sechs GPIOs, aber für Anwender ist vor allem eine interessant. Der auf der Platine mit P1 bezeichnete Anschluss lässt sich über eine Pfostenleiste mit 26 Pins ansteuern. Einige davon eignen sich als SPI (Serial Peripheral Interface) beziehungsweise I2C (Inter-Integrated Circuit). Diese von Motorola respektive Philips entwickelten Schnittstellen kommen in der Messtechnik zum Einsatz und bieten so vor allem für Anwendungen in dieser Richtung Potenzial. Revision 2 des Raspberry hat eine weitere GPIO-Schnittstelle mit der Bezeichnung P6 eingeführt. Sie bietet die Möglichkeit, den Raspberry zurückzusetzen oder zu starten, nachdem er heruntergefahren wurde.

Zur Steuerung der GPIOs existieren Bibliotheken in zahlreichen Programmiersprachen. Ihre Portierung für FreeBSD läuft allerdings noch, danach steht auch dieses Betriebssystem für messtechnische Projekte bereit.

Um die direkte Anbindung einer Kamera und eines LC-Displays kümmern sich ein CSI- (Camera Serial Interface) und ein DSI-Anschluss (Display Serial Interface). Für das CSI ist seit Mai 2013 eine Kamera mit einer Auflösung von fünf Megapixel erhältlich; unter FreeBSD steuert diese der Treiber »bktr(4)« an. Ein passendes Display für den DSI-Anschluss befindet sich zwar in Entwicklung, allerdings steht der Erscheinungstermin noch nicht fest.

Die Raspberry-Betriebssysteme werden in sogenannte Tiers kategorisiert. Bei FreeBSD handelt es sich um eine Tier-2-Plattform. Das bedeutet, dass sich Tools und Kernel-Quelltexte in der Entwicklungsphase befinden. Das Betriebssystem eignet sich durchaus für Produktiveinsätze, aber Installation und Upgrade laufen nicht ganz so flüssig von der Hand.

Karten austeilen

Der FreeBSD-Bootvorgang auf dem Raspberry Pi setzt eine SD-Karte mit mindestens 4 GByte Speicherplatz und zwei passend präparierten Slices voraus. Slices heißen die BSD-Pendants zu den unter Windows und Linux als Partitionen bezeichneten Abschnitten, während unter BSD die im Slice enthaltenen, mit Buchstaben gekennzeichneten Segmente Partitionen heißen.

Das erste Slice besteht aus einem bootfähigen FAT32- oder FAT16-Dateisystem. Beim Raspberry enthält nicht wie bei PCs üblich ein Flash-ROM die Firmware, sondern sie befindet sich im ersten Slice auf der SD-Speicherkarte (siehe Abbildung 2).

Abbildung 2: Einteilung einer SD-Karte für den Einsatz von FreeBSD auf dem Raspberry Pi.

Die Firmware eines Raspberry Pi enthält die folgenden Dateien:

  • Der Phase-3-Bootloader »start_cd.elf« kommt zum Zug, wenn der für die GPU reservierte Speicher weniger als 32 MByte Kapazität aufweist (»gpu_mem=16« ). Dabei handelt es sich um eine abgespeckte Version der Programmdatei »start.elf« .
  • Die Dateien »fixup.dat« und »fixup_cd.dat« enthalten den Programmcode, der den Speicher zwischen GPU und CPU aufteilt. Sie kommen in der dritten Phase des Bootvorgangs zum Einsatz. »fixup_cd.dat« wird wiederum für GPU-Speichergrößen von 16 MByte benötigt.
  • Bei dem File »boot.scr« handelt es sich um ein Skript, das aus der Datei »boot_ubl.txt« ins Binärformat übertragen wurde und das zu ladende Betriebssystem definiert. Im Fall von FreeBSD entspricht es dem an den Raspberry Pi angepassten Bootloader »ubldr« . Dieses Tool lädt in der Folge den Betriebssystemkern von FreeBSD.
  • Die Datei »devtree.dat« enthält alle verwendeten Gerätetreiber.

Das zweite Slice enthält schließlich das gewünschte Betriebssystem selbst, also FreeBSD. Um zu verstehen, wie man FreeBSD bootfähig auf der Speicherkarte installiert, folgt zunächst eine genauere Betrachtung des Bootvorgangs.

Mit der Kirche ums Kreuz

Der erste außergewöhnliche Schritt beim Booten des Raspberry Pi besteht darin, dass der Grafikprozessor (GPU) vor dem Mikroprozessor startet. Sobald der kleine Rechner mit Strom versorgt wird, startet ein Miniprogramm, das bei der Herstellung des Chips ins ROM gebrannt wurde. Es aktiviert zunächst das Boot-Slice der SD-Karte. Diesen Abschnitt des Bootprozesses nennt man First Stage und das Programm im ROM entsprechend Phase-1-Bootloader oder First Stage Bootloader. Darüber erhält das System Zugriff auf den Phase-2-Bootloader oder Second Stage Bootloader, zu dessen Programmcode die Datei »bootcode.bin« gehört.

Weil Mikroprozessor und Arbeitsspeicher an dieser Stelle immer noch nicht aktiviert sind, übernimmt die GPU den weiteren Bootvorgang. Dazu lädt das System den Programmcode aus »bootcode.bin« in den Cache der GPU und führt ihn aus. Erst jetzt wird der Arbeitsspeicher aktiviert und die GPU liest die Datei »start.elf« von der Speicherkarte. Sie steht für den Third Stage Bootloader oder Phase-3-Bootloader. Es handelt sich dabei um die Firmware des Grafikprozessors.

Der jetzt folgende dritte Schritt ist der wichtigste während der gesamten Initialisierungsphase. Der Third Stage Bootloader enthält Programmcode, der die Aufteilung des Arbeitsspeichers zwischen GPU und CPU vornimmt und anschließend die Konfigurationsdatei »config.txt« verarbeitet.

Im letzten Schritt wird die CPU initialisiert. Dazu lädt die GPU das Betriebssystem für den Mikroprozessor gemäß des Parameters »kernel=« in der Datei »config.txt« und aktiviert die CPU.

Bei FreeBSD lädt der Phase-3-Bootloader die Datei »uboot.img« . Dabei handelt es sich um ein Betriebssystem für die CPU; es fährt in diesem Fall also das FreeBSD-System hoch. Abbildung 4 illustriert den Bootvorgang.

Abbildung 4: Schematische Darstellung des Bootvorgangs eines Raspberry Pi.

Die Kompilierung von FreeBSD für den Raspberry Pi geschieht unter einem existierenden FreeBSD-Host-System. Dabei spielt es keine Rolle, ob dieses nativ oder in einer virtuellen Umgebung installiert ist. Mit der stabilen Version 10 ist man auf der sicheren Seite, nur etwas abenteuerlustigere Raspberry-Besitzer weichen auf die momentan unter »CURRENT« firmierende Version 11 aus.

Für die Installation legt man auf dem Host-System als Root ein separates Verzeichnis an. Das verhindert, dass sich Dateien des Hosts mit den für den Raspberry kompilierten vermischen; andernfalls käme es spätestens bei der Aktualisierung des Host-Systems zum Chaos.

$ su root
# mkdir /home/raspberry
# cd /home/raspberry

Damit FreeBSD auf dem Raspberry bootet, benötigt man außerdem den Bootloader:

# fetch http://www.dankoweit.de/Downloads/Raspberry/freebsd-uboot-20140101.tar.gz

Seit FreeBSD 9.2 kommt für die Verwaltung des Betriebssystem-Sourcecodes Subversion statt Csup zum Einsatz. Die Installation erfolgt – falls nicht ohnehin bereits geschehen – über die Paketverwaltung:

# pkg_add -r subversion

Alternativ holt man Subversion vom Portstree:

# make -C /usr/ports/devel/subversion install clean

Der letzte Schritt in der Vorbereitungsphase betrifft das Anlegen eines Disk-Image für die SD-Karte. Es sollte mindestens 512 MByte bemessen; besser sind 1024 MByte, damit Platz für den Portstree bleibt. Zunächst legt man mit »dd« eine leere Datei an, die das Kommando »mdconfig« dann in eine Memory Disk mit dem Treiber »md0« umwandelt:

# dd if=/dev/zero of=./rpi.img bs=1m count=1024
# mdconfig -a -t vnode -f ./rpi.img md0

Da sich die Datei »./rpi.img« wie eine Festplatte verhält, lassen sich im folgenden Schritt die einzelnen Slices anlegen. Als Partitionierungsschema ist die Auswahl von MBR (Master Boot Record) zwingend notwendig, weil die Firmware des Raspberry nur damit zurecht kommt.

Zuerst erstellt und formatiert man das Boot-Slice, auf das die Raspberry-Firmware kommt. Bei dessen Größe reichen 32 MByte aus:

# gpart create -s MBR md0
# gpart add -s 32m -t '!12' md0
# gpart set -a active -i 1 md0
# newfs_msdos -L boot -F 16 /dev/md0s1

Danach legt man das FreeBSD-Slice an und formatiert es ebenfalls. Es nimmt den gesamten restlichen Speicherplatz ein:

# gpart add -t freebsd md0
# gpart create -s BSD md0s2
# gpart add -t freebsd-ufs md0s2
# newfs -U -j /dev/md0s2a

Es folgt der Download der Quelltexte der gewünschten FreeBSD-Version. Der folgende Aufruf holt FreeBSD 10 aus dem Subversion-Repository:

# svn co svn://svn.freebsd.org/base/stable/10./fbsd

Diese Eingabe holt alternativ FreeBSD »CURRENT« , also derzeit Version 11:

# svn co svn://svn.freebsd.org/base/ head ./fbsd

In beiden Fällen landet der Quellcode im Unterverzeichnis »fbsd« , der Aufruf sollte deshalb aus dem anfangs eigens für diesen Zweck erstellten Verzeichnis »/home/raspberry« erfolgen.

Ähnliche Artikel

comments powered by Disqus

Artikel der Woche

Loadtests ohne Server

Für Loadtests der eigenen Server bietet sich die Cloud an, denn kurz getaktet lassen sich dort viele Rechnerinstanzen starten, die das eigene Budget nur wenig belasten. Noch flexibler, günstiger und besser skalierbar sind Tests mit einer Serverless-Infrastruktur wie AWS Lambda. Wir führen vor, wie Sie dort mit Serverless Artillery eigene Loadtests starten. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Container

Wie setzen Sie Container ein?

  • Gar nicht
  • Docker standalone
  • Docker mit Kubernetes
  • Docker mit Swarm
  • Docker mit anderem Management
  • LXC/LXD
  • Rocket
  • CRI-O auf Kubernetes
  • Container auf vSphere
  • Andere (siehe Kommentare auf der Ergebnisseite)

Google+

Ausgabe /2018

Microsite