Raspberry Pi: Einrichten

Prof. Jürgen Plate

Raspberry Pi: Einrichten

Bei der ersten Einrichtung des Raspberry Pi sind Monitor und Tastatur hilfreich, insbesondere, wenn bei der verwendeten Distribution SSH standardmäßig abgeschaltet ist.

Hinweise:

Grundsätzlich ist der Raspberry Pi nicht unbedingt etwas für jemanden, der Linux noch nie verwendet hat - oder es gibt eine anfangs extren steile Lernkurve. Wer bisher Mikrocontroller programmiert hat, die ohne jedes Betriebssystem auskamen, wird auch merken, dass durch Linux manche Dinge einfach anders sind. Unter anderem kann man nicht mehr so einfach mit Timern, Interrupts etc. hantieren, sondern ist auf System-Calls angewiesen. Besser ist es daher, wenn Sie schon etwas Erfahrung mit dem Arbeiten auf der Linux-Kommandozeile haben, da alle grundlegenden Dinge bei Linux über die Kommandozeile erledigt werden können (das geht dann auch über's Netz per SSH). Eventuell hilft Ihnen das Skript zur UNIX/Linux-Vorlesung weiter.

SD-Karte erstellen

Anstelle einer Festplatte nutzt der Raspberry Pi eine SD-Karte, wobei das Basis-Betriebssystem etwa 2 GByte auf der Karte belegt. Für vernünftiges Arbeiten empfiehlt sich eine Karte mit 4 GByte oder mehr mit Geschwindigkeitsklasse 4. Bevor es aber losgehen kann, muss erst einmal das Betriebssystem auf die Speicherkarte kommen. Inzwischen gibt es eine Reihe von Betriebssystemvarianten für den Raspberry Pi, darunter:

Wenn Ihnen die Wahl schwer fallen sollte, laden Sie sich am Besten das Image von "New Out of Box Software" (NOOBS) auf eine mindestens 4 GByte große SD-Karte. Beim ersten Booten können Sie dann unter etlichen der o. g. System auswählen. Im folgenden beziehe ich mich auf das Standard-System Raspbian. Die anderen Systeme (mit Ausnahme der beiden Media-Center) unterscheiden sich nicht allzu sehr davon.

Zuerst müssen Sie das Betriebssystem (oder NOOBS) auf die SD-Karte kopieren. Dazu laden Sie sich von der offiziellen Raspberry-Pi-Webseite das aktuelle Raspian-Image herunter (http://downloads.raspberrypi.org/raspbian_latest). Das Image kommt als ZIP-Datei und muss erst einmal entpackt werden. Anschließend kann es dann auf die SD-Karte geschrieben werden. Das Image selbst enthält drei Paritionen, von denen unter Windows nur die erste sichtbar ist:

  1. Boot-Partion, Typ VFAT (Windows), auf der sich die zum Systemstart nötigen Dateien sowei einige Konfigurationsdateien befinden,
  2. Linux-Partition, Type Ext4, mit den Linux-Verzeichnissen und
  3. Linux-Boot zum Booten.
Um das Image auf die SD-Karte zu bringen, kann man es nicht einfach als Datei drauf kopieren. Da es ein Abbild der "Platte" ist, muss es in binärer Form (mit Bootsektor und Partitionstabelle) auf die SD-Karte gelangen. Je nach Betriebssystem ist unterschiedliches Vorgehen notwendig:

Generelle Einstellungen für den SoC, die noch vor dem Starten des Betriebssystems geladen werden, kann man in der Datei /boot/config.txt ändern. Näheres dazu am Ende dieser Einführung.

SD-Karte bearbeiten

Wenn Sie Linux verwenden, könnten Sie das Raspberry-Linux an Ihrem Linux-PC vor der Inbetriebnahme beliebig anpassen. Dazu stecken Sie die SD-Karte einfach in den Katenlesers Ihres PCs. Je nach Distribution werden die beiden Partitionen (boot und root) meist automatisch gemountet. Andernfalls bemühen Sie das mount-Kommando. Danach ist die SD-Karte wie eine weitere Platte eingebunden und Sie könen nun beispielsweise Dateien in das Heimatverzeichnis des Users "pi" kopieren (nicht vergessen, die Benutzer- und Zugriffsrechte anzupassen). Oder Sie machen sich über die Konfigurationsdateien im Verzeichnis /etc her. In /etc/network/interfaches könnten Sie z. B. schon eine feste IP-Konfiguration eintragen. Nachdem Sie alles Mögliche angepasst haben, lassen Sie die SD-Karte auswerfen (bei Automount) oder geben die Partitionen mittels umount-Kommando wieder frei. Es kann sinnvoll sein, nach dem Aushängen der SD-Karte das nun individuell angepasste System in einer neuen Image-Datei zu speichern - dann läßt sich jederzeit eine Kopie produzieren. Dazu wird wieder das dd-Kommando verwendet, nur in der anderen Richtung, z.B.:

dd bs=4M if=/dev/sdc of=2014-11-25-wheezy-raspbian.img

Konfiguration

Wenn Sie im vorhergehenden Schritt alles richtig gemacht haben, können Sie den Raspberry Pi nun booten. Dazu stecken Sie die SD-Karte in den Kartenleser des Raspberry Pi und schließen USB-Tastatur, Monitor und ggf. Netzwerkkabel an. Nun das Netzteil in die Steckdose stecken. Die "Power"-LED sollte angehen und das Flackern der "Act"-LED (Activity) zeigen, das von der SD-Karte gebootet wird. Beim erstmaligen Booten von Raspbian startet automatisch das Konfigurationsprogramm raspi-config. Damit können alle grundlegenden Einstellungen sehr einfach per Auswahl gemacht werden. Sie können das Programm natürlich jederzeit auch von Hand starten, um Änderungen vorzunehmen. Solange die Tastatur auf "amerkanisch" steht, finden Sie das Minuszeichen unter der "ß"-Taste:

In den Menüs können Sie per Tabulator-Taste navigieren und mit der Leertaste einzelne Punkte auswählen (die Anzeige "[ ]" wechselt dann auf "[*]" und zurück). Das Konfigurationsprogramm ruft seinerseits die entsprechenden Dienstprogramme auf. Da raspi-config auch nur ein Shell-Skript ist, können Sie sich den Quellcode ansehen und schauen, was bei jedem Menüpunkt an Kommandos ausgeführt wird.

Der Standard-Benutzer heißt übrigens "pi", das Passwort "raspberry". Wegen des voreingestellten amerikanischen Tastaturlayouts sind die Zeichen "y" und "z" vertauscht. Falls es also mit dem Passwort "raspberry" nicht klappt, geben Sie auf der deutschen Tastatur "raspberrz" ein. Nach dem ersten Anmelden am Raspberry Pi sollten Sie das Passwort mit dem Kommando passwd ändern, was für größere Sicherheit im Betrieb sorgt.

Doch nun einige Erläuterungen zu den Konfigurationsoptionen:

Expand Filesystem
Das Raspbian-Image ist für eine 2 GByte große Speicherkarte konzipiert, was auch die Download- und Schreibdauer für das Image verkürzt. Für das Arbeiten mit dem Rechner sollte die SD-Karte jedoch 4 oder mehr GByte Kapazität besitzen. Daher wird bei einer größeren SD-Karte der Speicherplatz nicht voll ausgenutzt. Um den gesamten verfügbaren Platz auf der Karte zu nutzen, muss die Root-Partition vergrößert werden. "Expand Filesystem" erweitert die Systempartition entsprechend. Die Änderung wird aber erst beim nächsten Bootvorgang wirksam.

Meine Erfahrungen haben gezeigt, dass keineswegs alle 8-GByte-SD-Karten gleiche Speicherkapazität besitzen. Damit kann man sich wunderbar ins Knie schiessen. Für Praktika hatte ich ei einer SD-Karte natürlich die Konfiguration mit raspi-config vorgenommen, die Karte mit zusätztlichen Paketen bestückt und diverse Konfigurationen vorgenommen (Webserver, Netzwerk usw.). Dann das Image gespeichert:
2015-11-11-raspbian-master.img, 8.010.072.064 Byte
Dann wollte ich auf auf Blanko-Karten kopieren und bekam prompt eine Fehlermeldung, das Ziel habe zu geringe Speicherkapazität, nämlich nur 7.948.206.080 Byte. Daher der Rat: Machen Sie möglichst alles mit der Standardkapazität von 4 GByte und expandieren Sie erst ganz zum Schluss das Dateisystem. Alternativ könnten Sie auch das Root-Dateisystem unberührt lassen und dafür eine separate Homepartition anlegen (und die dann etwas kleiner lassen). Wie das geht, ist weiter unten beschrieben.
Change User Password
Da Raspbian mit dem Standardpasswort "raspberry" initialisiert ist, sollte man das Passwort für den Benutzernamen "pi" ändern (siehe oben). Das können Sie aber auch jederzeit mit dem Kommando passwd nachholen.
Enable Boot to Desktop
Raspbian startet standardmäßig im textbasierten Modus, die grafische Oberfläche kann aber jederzeit mittels startx gestartet werden. Soll beim Systemstart automatisch die grafische Oberfläche booten, so kann dies hier ausgewählt werden.
Internationalisation Options
Hier werden alle Länder- und Sprachspezifischen Einstellungen vorgenommen.
  1. Change Locale
    Wahl des Zeichensatzes und der Sprache des Systems. Für ein deutsches System wählen Sie "de_DE.UTF-8" aus und bestätigen mit "OK". Falls später enger Kontakt zu Windows-Systemen vorgesehen ist, kann ggf. auch "de_DE.ISO-8859-15" in Frage kommen. Im nächsten Dialog müssen Sie die Wahl noch als Standardeinstellung wählen und bestätigen.
  2. Change Timezone
    Die Uhrzeit des Raspberry Pis ist in der Grundeinstellung auf GMT-Zeit eingestellt. Um die Zeitzone entsprechend anzupassen wählen Sie zunächst "Europe" und danach "Berlin" aus. Der Pi besitzt keine Echtzeituhr, er speichert die aktuelle Uhrzeit und das aktuelle Datum nicht intern. Da man aber die aktuelle Uhrzeit und das Datum für viele wichtige Zwecke braucht, versucht Raspbian sich beim Systemstart mit einem Zeitserver im Internet zu verbinden und stellt Uhrzeit und Datum automatisch ein. Ist der RasPi offline, sollten Sie mit dem date-Kommando due Einstellung vornehmen.
    sudo date --set="2015-11-29 11:44:00"
    
    Das ist einerseits nicht so genau wie eine automatische Einstellung und Sie müssen die Einstellung bei jedem Neustart des Pi vornehmen, was leicht vergessen wird.
  3. Change Keyboard Layout
    Bei der Tastatur ist ist die Standardeinstellung "UK". Über eine Auswahlliste können das passende Tastaturlayout und die Sprache ausgewählt werden. Für eine Standard-PC-Tastatur übernehmen Sie die Voreinstellung "Generic 105-key (Intl) PC". Bei der Sprachversion wählen Sie "Other" und danach "German". Im anschließenden Dialog muss nochmals "German" sowie "The default for the keyboard layout" und zuletzt "No compose key" ausgewählt werden. Damit haben Sie die wichtigsten Einstellungen im Kasten.
Enable Camera
Soll das Kamera-Modul (Raspberry Pi Kamera-Karte) am Anschluss CSI betrieben werden, können Sie die Treiber dazu über diesen Menüpunkt einfach aktivieren.
Add to Rastrack
Rastrack (http://rastrack.co.uk/) ist eine Internetseite, die registrierte Raspberry-Pi-Systeme auf einer Karte anzeigt. Dieser Dienst ist freiwillig und kostenlos, gibt aber Informationen über Sie preis.
Overclock
Übertackten von Rechnern war schon beim Ur-PC mit 4,77, MHz Taktfrequenz Gesprächsstoff. Wer unbedingt meint, dass er den Zuwachs an Geschwindigkeit braucht, kann seinen Raspberry Pi übertakten. Zum einen kann die Übertaktung zur Instabilität des Systems führen (höhere Betriebstemperatur, höherer Strombedarf) und zum anderen bringt meist die Verbesserung der Programmalgorithmen einen höheren Gewinn.
Advanced Options
Die wichtigste dieser Optionen ist die Freigabe von SSH. Alles andere kann man auch später erledigen.
About raspi-config
Zeigt Informationen zum Konfigurationsprogramm an.

Nachdem alle Einstellungen vorgenommen wurden, kann das Programm mit "Finish" beendet und der Raspberry Pi neu gebootet werden. Nun können Sie sich beim Login-Prompt als User "pi" anmelden. Wenn Ihnen die Arbeit als "root"-User geläufig ist und Ihnen das ständige Aufrufen von sudo können Sie nun auch ein Passwort für den Superuser vergeben und sich für administrative Arbeiten als "root" einloggen (bzw. per su-Kommando die Identität wechseln) - aber bitte nur für Administratives!

Bevor Sie nun richtig loslegen, ist es sinnvoll, nach allen Konfigurations- und den weiter unten beschriebenen Einstellungsarbeiten sowie nach dem Installieren eventuell noch weiterer benötigter Software die komplette SD-Karte als neues Image zu sichern. Wenn dann später irgend etwas schief geht, sparen Sie sich viel Arbeit und können schnell auf ein voll funktionierendes Image zurückgreifen. Das Sichern funktioniert im Prinzip wie das Erzeugen der SD-Karte, nur sind Quelle und Ziel nun vertauscht.

Swap-Datei (Auslagerungsdatei) erstellen

Da der Raspberry Pi einen relativ kleinen Arbeitsspeicher besitzt, kann der Arbeitsspeicher durch eine Swap-Datei etwas unterstützt werden, falls mal ein Programm sehr viel Speicher benötigt. Der Nachteil dabei ist, dass der Rechnern beim Verwenden der Datei als "Hauptspeicherersatz" sehr langsam wird. Ein Swapfile ist schnell erstellt. Die Datei (256 MByte groß) wird angelegt, mit Nullbytes gefüllt und als Swapfile deklariert (alles als root-User):
sudo dd if=/dev/zero of=/var/swapfile bs=1M count=256
sudo mkswap /var/swapfile
Anschließend kann die Auslagerungsdatei schon aktiviert werden:
sudo swapon /var/swapfile
Sinnvoll ist es natürlich, auch die Auslagerungsdatei in die File System Table einztragen. Dazu wird /etc/fstab um eine weitere Zeile ergänzt:
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
UUID=009D-304B  /media/usbdisk  vfat    defaults,rw       0       0
/var/swapfile   none            swap    sw                0       0

Raspberry Pi tunen

Hier ist nicht das Übertakten gemeint, sondern es handelt sich um ganz normale Verbesserungen, die sich nach der gewünschten Anwendung richten.

CPU-Frequenz und -Temperatur

Im Pseudoverzeichnis /sys gibt es viele interessante (Pseudo-)Dateien, darunter auch zwei zur CPU, die sich per Shell-Skript auslesen lassen:

echo -n "CPU-Frequenz:   " ; cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
echo -n "CPU-Temperatur: " ; cat /sys/class/thermal/thermal_zone0/temp

Speicherzuteilung ändern

Für das Raspberry-Modell B mit 512 MByte Gesamtspeicher kann nach Einsatzzweck die Zuteilung des Speichers geändert werden:
RAMGrafik-VRAMAnwendungszweck
256 MByte256 MByteBetrieb mit GUI, Anwendungen mit Videofunktionen, Abspielen, Streamingetc., notwendig für Full-HD-1920-Wiedergabe.
384 MByte128 MByteBetrieb mit GUI, Anwendungen wie oben, mit reduzierter Grafikleistung.
448 MByte64 MByteBetrieb mit GUI höchstens bei niedriger Auflösung, kein Abspielen von Videos, kein Streaming, keine Hardware-Videobeschleunigung etc.
496 MByte16 MByteBetrieb ohne GUI, kein Video etc. Für Embedded- Anwendugnen und Netzwerkservices.

Die Aufteilung wird über einen Parameter in der Konfigurationsdatei config.txt gesteuert (siehe unten). Durch die Angabe von beispielsweise gpu_mem=16 weisen Sie dem Grafikspeicher eine Größe von 16 MByte zu. Der nicht der Grafikkarte zugeordnete Speicher wird automatisch als RAM-Speicher genutzt.

Schreibzugriff auf SD-Karte reduzieren

Werden bestimmte Dateien regelmäßig erstellt oder geändert, z. B. Bilddateien einer Webcam oder Messwerte, sollten diese möglichst ins RAM oder einen USB-Speicher ausgelagert werden, denn das ständige Löschen und Wiederbeschreiben ist trotz aller schlauer Algorithmen der Controllerbausteine Gift für die Lebensdauer der SD-Karte. Deshalb sollte für alle Dateien eine RAM-Disk eingerichtet werden - bei der sogar ein noch schnellerer Zugriff als Nebeneffekt hinzukommt. Dazu gibt es zwei Möglichkeiten:

Die Verwendung des tmpfs-Dateisystems:
Das tmpfs-Dateisystem ist eigentlich kein reines RAM-Dateisystem, sondern die Daten landen im Festplatten-Swap, sobald der Speicherplatz im RAM knapp wird. Mit dem folgenden Shell-Befehl wird das Verzeichnis /var/tmp zur RAM-Disk:

sudo mount -t tmpfs none /var/tmp
oder, falls die Größe festgelegt werden soll:
sudo mount -t tmpfs -o size=5M none /var/tmp
Es werden dynamisch immer so viele Ressourcen abgezweigt, wie gerade benötigt werden, auch wenn eine Größe angegeben wurde. Ist das Laufwerk also leer, belegt es auch keinen Platz im RAM. Es ist möglich, diese Partition standardmäßig beim Systemstart einzubinden, indem man eine Zeile in die Datei /etc/fstab einfügt:
tmpfs    /var/tmp    tmpfs    defaults,size=5M      0       0

Um beispielsweise /var/log und /var/run in den Arbeitsspeicher auszulagern, müssen Sie folgende Einträge in der /etc/fstab hinzufügen:

none    /var/run     tmpfs    size=5M,noatime       0       0
none    /var/log     tmpfs    size=5M,noatime       0       0

Die Verwendung des ramfs-Dateisystems:
Das ramfs-Dateisystem lagert im Gegensatz zum tmpfs keine Daten in den Swap aus, ist also ein reines RAM-Dateisystem. Die Kommandos sind fast identisch wie oben:

sudo mount -t ramfs ramfs /var/tmp
Damit erhält man eine RAM-Disk, die sich ebenfalls dynamisch der benötigten Größe anpasst. Um die Partition beim Systemstart automatisch einzuhängen, fügt folgende Zeile in der Datei /etc/fstab hinzu:
ramfs   /var/tmp     ramfs   defaults        0       0
Das ramfs-Dateisystem hat im Gegensatz zu tmpfs keine Mountoptionen und bietet somit auch keine Möglichkeit, die Größe zu limitieren. Eventuell hat das System dann keinen freien Hauptspeicher mehr zur Verfügung und kann nur noch auf die Festplatte auslagern.

Verlagern Sie Dateien und Verzeichnisse auf diese Weise ins RAM, sollte Ihnen klar sein, dass diese nach einem Neustart nicht mehr verfügbar sind.

Watchdog

Das SoC des Raspberry Pi, der BCM2708 von Broadcom, verfügt standardmäßig über einen Hardware-Watchdog, der das System bei auftretenden Problemen neu starten kann. Um diesen zu nutzen, wird ein Kernelmodul und ein Daemon benötigt, der dem Watchdog in regelmäßigen Zeitabständen mitteilt, dass das System funktioniert. Kommt es nun zu einem Hänger im System, erhält der Watchdog keine Nachrichten mehr vom Daemon und setzt daraufhin das System zurück.

Zu Aktivieren und Einrichten des Watchdog wird zuerst das Kernelmodul geladen und dann der Daemon installiert (beachten Sie unbedingt die beiden ">>" beim echo-Kommando):

sudo modprobe bcm2708_wdog
sudo cp /etc/modules /etc/modules.orig
sudo echo "bcm2708_wdog" >> /etc/modules
sudo apt-get install watchdog
Anschließend muss noch die Konfigurationsdatei des Watchdog-Daemon, /etc/watchdog.conf, angepasst werden, um die Gerätedatei des Watchdogs und die Bedingungen für einen Reset festzulegen. In der Konfigurationsdatei weden die folgende beiden Zeilen ent-kommentiert (Doppelkreuz am Anfang der Zeile entfernen):
watchdog-device    = /dev/watchdog
max-load-1         = 24
Zum Abschluss der Konfiguration wird der Watchdog-Daemon neu gestartet:
sudo /etc/init.d/watchdog restart

sudo

Überall kann man es in irgendwelchen Anleitungen lesen: sudo dies, sudo jenes, sudo irgendwas usw. Wenn man schon weiss, dass jetzt eine Kommandoorgie als Root-User fällig ist, wird man einfach mit sudo bash oder sudo su dauerhaft "root" und führt dann alle Kommandos ohne sudo davor aus.

Beim RasPi ist der Benutzer "pi" für die Verwendung von sudo bereits freigeschaltet und auch ein Passwort ist nicht nötig. Das ist zwar praktiksch, aber nicht besonders sicher. Will man erreichen, dass auch der User "pi" sein Passwort eingeben muss, wenn er "root" werden will, muss die Konfiguration von sudo angepasst werden. Dazu ruft man das Kommmando sudo visudo auf. Dann erscheint die Konfiguration von sudo im Editor (meinst jedoch nicht vi, wie der Kommandoname impliziert, sondern nano oder dergleichen). Da ändern Sie die Zeile

pi ALL=(ALL) NOPASSWD: ALL
in
pi ALL=(ALL:ALL) ALL
Dann kann man gleich noch eine weitere Einstellung vornehmen. Wenn man sich beim Passwort vertippt, darf man es nach einem freundlichen Hinweis noch zwei Mal probieren. Aber sudo kann bei falschen Passworteingaben auch etwas rüde reagieren. Dazu fügen Sie hinter den Zeilen die mit "Defaults" beginnen, eine weitere Zeile Defaults insults ein. Das Ergebnis sieht dann etwa so aus:
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:$
Defaults        insults

Bootverhalten erweitern

Im Text RasPI_Onboard-LEDs wurden zum Test zwei Kernel-Module geladen, die aber beim nächsten Bootvorgang wieder verschwunden sind. Im Zusammenhang mit Schnittstellen (z. B. GPIO) sind jedesmal Kommandos nötig, um die Funktionen der Schnittstelle einzustellen. Diese Kommandos müssen oft auch mit root-Berechtigung ausgeführt werden. All das von Hand nach jedem Einschalten zu wiederholen, ist natürlich nicht sinnvoll. Linux bietet die Möglichkeit, all das automatisch beim Bootvorgang zu erledigen.

Module laden/entladen

Grundsätzlich ist der Linux-Kernel monolithisch aufgebaut, er bietet jedoch die Möglichkeit, zusätzliche Treiber, die sogenannten Kernel-Module, zur Laufzeit zu laden und entladen. Die meisten Linux-Distributionen verwenden etliche Kernel-Module, da die bestmögliche Hardwarekompatibilität beim Booten mit nur einem sehr einfachen, allgemein gehaltenen Kernel erreicht werden kann. Nach den Bootvorgang werden entsprechend der erkannten Hardware alle noch notwendigen Module geladen, so dass der Nutzer sich nicht weiter darum kümmern muss. Bei optionalen Modulen, wie z. B. das bei der Activity-LED verwendete ledtrig_heartbeat muss der Administrator jedoch selbst aktiv werden.

Für die Modulverwaltung gibt es einige Kommandos:

Anmerkungen:
insmod hat im Gegensatz zu modprobe den Nachteil, dass eventuelle Abhängigkeiten der Module nicht automatisch aufgelöst werden. Im Gegensatz zu modprobe -r werden bei rmmod Module, die aus Abhängigkeitsgründen zum entfernenden Modul in den Kernel geladen wurden, nicht mit entfernt. Daher ist modprobe <Optionen> <Modul(e)> das Kommando der Wahl für das Ein- und Aushängen von Modulen.

Diee wichtigste Optionen von modprobe sind:

OptionBeschreibung
-vErzeugt eine ausführliche Ausgabe
-nSimuliert das Laden des Moduls, lädt es aber nicht.
-aLade alle in der Kommandozeile angegebenen Module. Nötig, wenn mehrere Module auf einmal geladen werden.
--show-dependsZeige alle Abhängigkeiten des Moduls.
-lListe alle verfügbaren Module (geladen oder nicht geladen).
-rEntladen der angegebenen Module.

Manche Module können erst verwendet werden, wenn andere Module geladen sind, von denen sie abhängen. Diese Abhängigkeiten stehen in der Datei /lib/module/<Kernelversion>/modules.dep. Diese Datei wird bei der Installationerzeugt. Installiert man zusätzliche eigene Module, muss die Datei mit depmod neu erstellt werden.

Nach dieser langen Vorrede, endlich die Lösung des eingangs beschriebenen Problems: Möchte man ein nicht standardmäßig vom Kernel geladenes Modul beim Systemstart automatisch laden, so trägt man den Modulnamen einfach in die Datei /etc/modules ein (Editieren mit root-Rechten).Pro Zeile wird nur ein einziger Modulname eingetragen. Ab dem nächsten Bootvorgang werden alle angegebenen Module (zusätzlich) geladen.

Soll ein Modul immer mit bestimmten Option(en) geladen werden, kann dies in der Datei /etc/modprobe.conf eingetragen werden. Diese Datei muss ggf. angelegt werden. Es gibt auch hier nur einen Eintrag pro Zeile. Um eine Option zu setzen, gibt man ein:

options Modulname1 Option1=Wert1
options Modulname2 Option1=Wert Option2=Wert ...

Manchmal kann es sinnvoll sein, das Laden bestimmter Module explizit zu verbieten. Dies geschieht durch den Eintrag des entsprechenden Moduls in eine Blacklist-Datei. Am einfachsten geht das mit zusätzlichen Einträge in der Datei /etc/modprobe.d/blacklist.conf. Auch hier gilt: nur ein Eintrag pro Zeile:

blacklist    Modulname1
blacklist    Modulname2
   ...

die Datei /boot/config.txt

Da der Raspberry Pi kein konventionelles BIOS besitzt, gibt es auch kein BIOS-Setup für diverse Harware-Parameter. Stattdessen stehen alle diese Parameter in der Datei /boot/config.txt. Diese Textdatei kann natürlich bei laufenden RasPi ganz normal bearbeitet werden (mit root-Rechten). Aber auch auf der SD-Karte ist sie in der boot-Partition erreichbar und kann auch z. B. mit dem Windows-Notepad geändert werden (Notepad! Nicht irgendeine Frickel-Textverarbeitung wie Word oder Wordpad!). Diese Datei wird noch vor der Initialisierung des ARM-Core verarbeitet.

So ist es u. a. möglich, Parameter für die Video-Ausgabe zu setzen, die Speicher-Aufteilung zwischen CPU und GPU zu ändern oder die CPU zu übertakten. Generell sollte man eher vorsichtig mit dieser Datei umgehen, da sie bei falscher Verwendung auch mal dazu führen können, dass das Betriebssystem nicht mehr bootet oder das System instabil wird. Sie enthält eine Vielzahl von Optionen, die alle genau beschreiben sind unter:

HDMI-Display bleibt dunkel

Grundsätzlich ist der HDMI-Ausgang des Raspberry Pi nur aktiviert, wenn ein Monitor oder ein Fernsehgerät angeschlossen ist, bevor der Raspberry Pi eingeschaltet wird. Standardmäßig enthält die Datei /boot/config.txt folgende HDMI-Einstellungen:
# Force the monitor to HDMI mode so that sound will be sent over HDMI cable
hdmi_drive=2
# Set monitor mode to DMT
hdmi_group=2
# Set monitor resolution to 1024x768 XGA 60Hz (HDMI_DMT_XGA_60)
hdmi_mode=16
# Make display smaller to stop text spilling off the screen
overscan_left=20
overscan_right=12
overscan_top=10
overscan_bottom=10
Um das Verhalten zu ändern, muss bei einige Parametern das Kommentarzeigen (#) gelöscht oder - falls sie fehlen - die Parameter hinzugefügt werden:
# Always force HDMI output and enable HDMI sound
hdmi_safe=1
config_hdmi_boost=4
hdmi_force_hotplug=1
hdmi_drive=2
Wenn es dann immer noch nicht klappt, weil beispielsweise das Display nicht ganz HDMI-kompatibel ist, hilft eventuell die "save-mode"-Einstellung aus der RasPi-Dokumentantion:
hdmi_force_hotplug=1
config_hdmi_boost=4
hdmi_ignore_edid=0xa5000080
hdmi_group=2
# 640x480 	60Hz
hdmi_mode=4
disable_overscan=0
overscan_left=24
overscan_right=24
overscan_top=24
overscan_bottom=24
Alle HDMI-Modes sind in der Dokumentation der config.txt aufgeführt. Siehe auch Monitor am RasPi.

Die diversen Video-Modi für DMT (hdmi_group = 2) sind:

HDMI_DMT_640x350_85 = 0x1, /**<640x350 */
HDMI_DMT_640x400_85 = 0x2, /**<640x400 */
HDMI_DMT_IBM_VGA_85 = 0x3, /**<720x400 */
HDMI_DMT_VGA_60 = 0x4, /**<640x480 (60Hz is same as VGA in CEA above) */
HDMI_DMT_VGA_72 = 0x5
HDMI_DMT_VGA_75 = 0x6
HDMI_DMT_VGA_85 = 0x7
HDMI_DMT_SVGA_56 = 0x8, /**<800x600 */
HDMI_DMT_SVGA_60 = 0x9
HDMI_DMT_SVGA_72 = 0xA
HDMI_DMT_SVGA_75 = 0xB
HDMI_DMT_SVGA_85 = 0xC
HDMI_DMT_SVGA_120 = 0xD
HDMI_DMT_848x480_60 = 0xE, /**<848x480 */
HDMI_DMT_XGA_43 = 0xF, /**<1024x768 – interlaced, DO NOT USE */
HDMI_DMT_XGA_60 = 0x10, /**<1024x768 */
HDMI_DMT_XGA_70 = 0x11
HDMI_DMT_XGA_75 = 0x12
HDMI_DMT_XGA_85 = 0x13
HDMI_DMT_XGA_120 = 0x14
HDMI_DMT_XGAP_75 = 0x15, /**<1152x864 */
HDMI_DMT_WXGA_RB = 0x16, /**<1280x768 reduced blanking */
HDMI_DMT_WXGA_60 = 0x17
HDMI_DMT_WXGA_75 = 0x18
HDMI_DMT_WXGA_85 = 0x19
HDMI_DMT_WXGA_120 = 0x1A, /**<120Hz with reduced blanking */
HDMI_DMT_1280x800_RB = 0x1B, /**<1280x800 reduced blanking */
HDMI_DMT_1280x800_60 = 0x1C
HDMI_DMT_1280x800_75 = 0x1D
HDMI_DMT_1280x800_85 = 0x1E
HDMI_DMT_1280x800_120 = 0x1F, /** reduced blanking */
HDMI_DMT_1280x960_60 = 0x20, /**<1280x960 */
HDMI_DMT_1280x960_85 = 0x21
HDMI_DMT_1280x960_120 = 0x22, /** reduced blanking */
HDMI_DMT_SXGA_60 = 0x23, /**<1280x1024 */
HDMI_DMT_SXGA_75 = 0x24
HDMI_DMT_SXGA_85 = 0x25
HDMI_DMT_SXGA_120 = 0x26, /** reduced blanking */
HDMI_DMT_1360x768_60 = 0x27, /**<1360x768 */
HDMI_DMT_1360x768_120 = 0x28, /**<120 Hz with reduced blanking */
HDMI_DMT_SXGAP_RB = 0x29, /**<1400x1050 reduced blanking */
HDMI_DMT_SXGAP_60 = 0x2A
HDMI_DMT_SXGAP_75 = 0x2B
HDMI_DMT_SXGAP_85 = 0x2C
HDMI_DMT_SXGAP_120 = 0x2D, /** reduced blanking */
HDMI_DMT_1440x900_RB = 0x2E, /**<1440x900 reduced blanking */
HDMI_DMT_1440x900_60 = 0x2F
HDMI_DMT_1440x900_75 = 0x30
HDMI_DMT_1440x900_85 = 0x31
HDMI_DMT_1440x900_120 = 0x32, /** reduced blanking */
HDMI_DMT_UXGA_60 = 0x33, /**<1600x1200 60Hz */
HDMI_DMT_UXGA_65 = 0x34
HDMI_DMT_UXGA_70 = 0x35
HDMI_DMT_UXGA_75 = 0x36
HDMI_DMT_UXGA_85 = 0x37
HDMI_DMT_UXGA_120 = 0x38, /** reduced blanking */
HDMI_DMT_SWXGAP_RB = 0x39, /**<1680x1050 reduced blanking */
HDMI_DMT_SWXGAP_60 = 0x3A, /**<1680x1050 60Hz */
HDMI_DMT_SWXGAP_75 = 0x3B
HDMI_DMT_SWXGAP_85 = 0x3C
HDMI_DMT_SWXGAP_120 = 0x3D, /** reduced blanking */
HDMI_DMT_1792x1344_60 = 0x3E, /**<1792x1344 60Hz */
HDMI_DMT_1792x1344_75 = 0x3F, /**<1792x1344 75Hz */
HDMI_DMT_1792x1344_120 = 0x40, /** reduced blanking */
HDMI_DMT_1856x1392_60 = 0x41, /**<1856x1392 60Hz */
HDMI_DMT_1856x1392_75 = 0x42, /**<1856x1392 75Hz */
HDMI_DMT_1856x1392_120 = 0x43, /** reduced blanking */
HDMI_DMT_WUXGA_RB = 0x44, /**<1920x1200 reduced blanking */
HDMI_DMT_WUXGA_60 = 0x45, /**<1920x1200 60Hz */
HDMI_DMT_WUXGA_75 = 0x46, /**<1920x1200 75Hz */
HDMI_DMT_WUXGA_85 = 0x47, /**<1920x1200 85Hz */
HDMI_DMT_WUXGA_120 = 0x48, /** reduced blanking */
HDMI_DMT_1920x1440_60 = 0x49, /**<1920x1440 60Hz */
HDMI_DMT_1920x1440_75 = 0x4A, /**<1920x1440 75Hz */
HDMI_DMT_1920x1440_120 = 0x4B, /** reduced blanking */
HDMI_DMT_2560x1600_RB = 0x4C, /**<2560x1600 reduced blanking */
HDMI_DMT_2560x1600_60 = 0x4D, /**<2560x1600 60 Hz */
HDMI_DMT_2560x1600_75 = 0x4E, /**<2560x1600 75 Hz */
HDMI_DMT_2560x1600_85 = 0x4E, /**<2560x1600 85 Hz */
HDMI_DMT_2560x1600_120 = 0x50, /** reduced blanking */
HDMI_DMT_1366x768_60 = 0x51, /**<1366x768 60Hz */
HDMI_DMT_1080p_60 = 0x52, /**<Same as 1080p60 in CEA above */
HDMI_DMT_1600x900_RB = 0x53, /**<1600x900 reduced blanking */
HDMI_DMT_2048x1152_RB = 0x54, /**<2048x1152 reduced blanking */
HDMI_DMT_720p_60 = 0x55, /**<Same as 720p60 in CEA above */
HDMI_DMT_1366x768_RB = 0x56, /**<1366x768 reduced blanking */

Device Tree

Mit der neuen Firmware ab Version #744 vom 30. Januar 2015 und entsprechenden Kernel-Anpassungen ist seit Anfang März beim Raspberry (Kernel 3.18.3) Pi nichts mehr wie vorher. Wird beispielsweise die Firmware per rpi-update aktualisiert oder wird das Raspbian mittels apt-get update und apt-get upgrade auf den neuesten Stand gebracht, werden die Schnittstellen von I2C, SPI, One Wire etc. nicht mehr gefunden.

Schuld daran ist ein Wechsel auf die sogenannten Device Trees. Noch 2013 brachte jede ARM-Plattform eigene Treiber und Module ein und blähte den Kernel-Quellcode entsprechend auf. Während bei einem PC die Schnittstellen immer an festen Adressen liegen, unterscheiden sich bei den ARM-SoC-Rechnern Adressen, Interrupts, Ansteuerlogik etc. Inzwischen gibt es Kernel, die auf mehreren ARM-Plattformen lauffähig sind. Dabei griffen die Entwickler auf einen Kniff des Power-PC-Kernels: Die jeweilige Hardwarekonfiguration war dort nicht in den Kernel einkompiliert (oder als Bootparameter übergeben) worden, sondern stand als im Hauptspeicher abgelegte Datenstruktur bereit. Diese Technik ist unter dem Namen "Device Tree" bekannt.

Der Device Tree

Die Device-Tree-Beschreibungen der einzelnen ARM-SoCs und ARM-Boards befinden sich im Linux-Quellcodeverzeichnis unter arch/arm/boot/dts . Dateien mit der Datei-Erweiterung ".dtsi" enthalten die Definitionen für einen bestimmten SoC. Falls im Kernel konfiguriert, lässt sich der Device Tree nach dem Booten im Verzeichnis /proc/device-tree auslesen. Die einzelnen Äste sind dabei als Unterverzeichnisse realisiert. Die Device-Tree-Beschreibung eines Boards im Klartext (siehe unten) übersetzt ein Device Tree Compiler (DTC). Das Ergebnis ist ein kompakter Binary-Blob (Device Tree Blob, DTB). Im Kernel gibt es einen Interpreter, der den Blob beim Booten interpretiert, daraus einen Baum aufbaut, die zugehörigen Treiber aktiviert und mit Konfigurationsdaten versorgt.

/include/ "skeleton.dtsi"
/ {
   compatible = "brcm,bcm2835";
    model = "BCM2835";
    interrupt-parent = <&intc>;

    chosen {
        bootargs = "earlyprintk ... rootfstype=ext4";
    };

    soc {
        compatible = "simple-bus";
        #address-cells = <1>;
        #size-cells = <1>;
        ranges = <0x7e000000 0x20000000 0x02000000>;

        ...
        
        uart@20201000 {
            compatible = "brcm,bcm2835-pl011", "arm,pl011";
            reg = <0x7e201000 0x1000>;
            interrupts = <2 25>;
            clock-frequency = <3000000>;
        };

        gpio: gpio {
            compatible = "brcm,bcm2835-gpio";
            reg = <0x7e200000 0xb4>;
            ...
          
            gpio-controller;
            #gpio-cells = <2>;
            interrupt-controller;
            #interrupt-cells = <2>;
        };

        i2c0: i2c@20205000 {
        ...
        
        };
Ausschnitt aus dem Quellcode des Device Tree

Der Kernel kann nun durch einen Gerätebaum (device tree) effektiv ergänzt werden, ohne dabei den Kernel selbst verändern zu müssen. Der Device Tree wird beim Raspberry Pi in der Datei /boot/config.txt angesprochen. Er ist bei Raspbian standardmäßig aktiviert. In den Spezifikationen für Erweiterungen für die "+"-Modelle des Raspberry Pi, etwa für die Austeckplatinen "HAT" (Hardware on Top), ist dazu ein EEPROM vorgesehen, das die entsprechenden Informationen für den Device Tree enthält. Gint es kein EEPROM, kann man Devices auch manuell aktivieren. Detaillierte Informationen zum DT stehen in der README-Datei auf dem Raspberry Pi im Verzeichnis /boot/overlays/README oder in der Raspberry-Pi-Anleitung unter www.raspberrypi.org/documentation/configuration/device-tree.md .

Die Schnittstellen können zwar weiterhin über das klassische Modell (Entfernen des Moduls aus der Blacklist und Eintragen in der Datei /etc/modules) aktiviert werden, das ist aber nicht empfohlen da es durch den DT nun zu Konflikten kommen kann. Wenn Sie also - aus welchen Gründen auch immer - noch mit dem herkömmlichen System weitermachen wollen, genügt es, in der Datei /boot/config.txt eine Zeile "device_tree=" einzufügen und den RasPi zu booten. Damit ist der ganze neumodische Kram deaktiviert. Empfehlenswert ist das aber nicht.

Eleganter ist es, einen schnittstellenspezifischen Parameter in der Datei /boot/config.txt einzutragen. Normlalerweise sind die Schnittstellen durch ein Kommentarzeichen (#) deaktiviert:

#dtparam=i2c_arm=on
#dtparam=i2s=on
#dtparam=spi=on
Oder es gibt für eine bestimmte Schnittstelle gar keinen Eintrag. Um die Schnittstellen zu aktivieren, muss nur das Kommentarzeichen entfernt werden, z. B.:
dtparam=i2c_arm=on
dtparam=i2s=on
dtparam=spi=on
#Heartbeat LED (default: trigger=mmc)
dtparam=act_led_trigger=heartbeat
Für die Activity-LED gibt es noch act_led_activelow=<on|off> (default "off") und act_led_gpio=xx für den Port (default "16" bei non-Plus, "47" bei Plus).

Overlays

Neben dem Laden eines kompletten Device Trees mittels dtparam gibt es noch die "Device Overlays", um beispielsweise bestimmte Parameter einstellen zu können. Unter anderem verhindert das System so eine Doppelbelegung von abhängigen Ressourcen (zum Beispiel GPIO Pins), ermöglicht es aber auch spezifische Konfigurationen vorzunehmen. Nehmen wir das One-Wire-Interface als Beispiel:

dtoverlay=w1-gpio,gpiopin=4 
Damit wird der Pin 4 des GPIO für One Wire reserviert. Oder, falls noch der interne Pullup-Widerstand geschaltet werden soll:
dtoverlay=w1-gpio-pullup,gpiopin=4,extpullup=on
Die Overlays sind gewissermaßen kleine Device-Tree-Fragmente, die dem aktuellen DT für eine Schnittstelle hinzugefügt werden. Beim Aktivieren eines Overlays wird der zugehörige Device Tree geladen, falls dies nicht schon erfolgt ist. Für einige andere Schnittstellen gelten die folgenden Overlays:
I2C Real Time Clock           dtoverlay=i2c-rtc,ds1307
LIRC                          dtoverlay=lirc-rpi
LIRC mit Parametern z. B.:    dtoverlay=lirc-rpi,gpio_out_pin=17,gpio_in_pin=16,gpio_in_pull=high
pps-gpio (Pule per Second)    dtoverlay=pps-gpio,gpiopin=xx
Audio card (je nach Device)   dtoverlay=hifiberry-dac
                              dtoverlay=hifiberry-dacplus
                              dtoverlay=hifiberry-digi
                              dtoverlay=hifiberry-amp
                              dtoverlay=iqaudio-dac
                              dtoverlay=iqaudio-dacplus
Bei der Echtzeituhr (RTC) kann statt des Chips ds1307 auch einer der Chips ds3231, pcf2127, pcf8523 oder pcf8563 angegeben werden.

Fehlersuche

Es gibt für die Device Tree Blobs einen Logging- und Debugging-Mechanismus, der ebenfalls über die Datei /boot/config.txt aktiviert werden kann. Dazu tragen Sie folgende Zeile in /boot/config.txt ein:

dtdebug=on
Nach einem Neustart kann das Protokoll mittels
sudo vcdbg log msg
Und bitte daran denken:

Device Tree FAQ

Weitere Infos stehen in der Device Tree Readme-Datei.

Die Raspberry-LED-Signale beim Startvorgang

Mit dem aktuellen System und den Raspberry Pi-Modellen B+ und der Version 2 zeigen die beiden LEDS auf dem Board den Status bzw. Fehler des Boot-Vorgangs an (die Netzwerk-LED sind ja in den Netzwerk-Stecker gewandert). Auch das Display kann bei der Fehlersuche helfen:

rote LEDgrüne LEDDisplayBedeutungAbhilfe
dunkeldunkeldunkelGerät stromlos Verkabelung überprüfen. Anderes Netzteil einsetzen
ein/aus im Wechseldunkel/eindunkelStörung (rote LED flackert nicht) Netzteil liefert keine stabile Spannung: Netzteil wechseln
oder Peripherieverbraucher getrennt versorgen
einflackert nichtdunkelkein bootfähiges Image SD-Karte auf Bootimage überprüfen
einflackert nichtdunkelProblem mit einem Peripherie-Gerät Raspberry ohne Peripherie starten. Wenn die grüne LED etwa 20 s
lang flackert, Peripherie nach und nach anschließen und neu booten.
einblinkt 3xdunkelstart.elf nicht gefunden Inhalt der SD-Karte überprüfen.
einblinkt 4xdunkelstart.elf nicht geladen Start erneut versuchen. Inhalt der SD-Karte überprüfen.
Anderes Image ausprobieren.
einblinkt 7xdunkelkernel.img nicht gefunden Inhalt der SD-Karte überprüfen.
einblinkt 8xdunkelSDRAM nicht erkannt. Inhalt der SD-Karte überprüfen. Gegebenenfalls bootcode.bin/start.elf updaten.
einbeliebigkernel.img kann nicht geladen werden Ein buntes Display und Wechsel zur Konsole deutet auf ein
inkompatibles System. Verwenden Sie ein anderes Image.
Eventuell kann das Problem auch durch den Eintrag "boot_delay=1"
in der Datei config.txt behoben werden.

Homepartition anlegen

Wie weiter oben erwähnt, kann es sinnvoll sein, die Root-Partition bei 4 GByte zu belassen und auf einer SD-Karte mit größerer Kapazität eine eigene Partition für /home anzulegen. Die folgende Anleitung zeigt, we Sie das erreichen können. Die diversen Listings und Protokolle lassen die Angelegenheit komplizierter erscheinen, als sie ist. Alle Kommandos müssen als Root ausgeführt werden (alle Kommados sind fett geschrieben):

sudo su -

fdisk -lu
Disk /dev/mmcblk0: 7948 MB, 7948206080 bytes
4 heads, 16 sectors/track, 242560 cylinders, total 15523840 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0002c262
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880     5785599     2831360   83  Linux
Das Listing zeigt die beiden Basis-Partitionen, wie sie nach dem Schreiben des Images auf die Karte existieren. Nun wird eine dritte Partion für /home angelegt. Das kann eine "primary" oder "extended" Partition sein, wobei bei letzterer noch ein logisches Laufwerk nötig ist. Der erste Sektor der 3. Partition (5785600) ergibt sich aus den letzten Sektor der 2. Partition (5785599) + 1. Beim letzten Sektor ziehen wir vom Defaultwert großzügig etwas ab:
fdisk /dev/mmcblk0
Command (m for help): n
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): e
Partition number (1-4, default 3): 3 
Using default value 3
First sector (2048-15523839, default 2048): 5785600
Last sector, +sectors or +size{K,M,G} (5785600-15523839, default 15523839): 14000000

Command (m for help): n
Partition type:
   p   primary (2 primary, 1 extended, 1 free)
   l   logical (numbered from 5)
Select (default p): l
Adding logical partition 5
First sector (5787648-15523839, default 5787648): 
Using default value 5787648
Last sector, +sectors or +size{K,M,G} (5787648-15523839, default 15523839): 14000000 

Command (m for help): p
Disk /dev/mmcblk0: 7948 MB, 7948206080 bytes
4 heads, 16 sectors/track, 242560 cylinders, total 15523840 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0002c262
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880     5785599     2831360   83  Linux
/dev/mmcblk0p3         5785600    14000000     4107200    5  Extended
/dev/mmcblk0p5         5787648    14000000     4107176   83  Linux

Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: 
   Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
Nun ist ein Reboot nötig, damit das neue Dateisystem eingebunden werden kann. Danach muss die neue Partition noch formatiert werden (auch wieder als Root). Den Output habe ich etwas gekürzt.
mkfs -t ext3 /dev/mmcblk0p5
mke2fs 1.42.5 (29-Jul-2012)
....
Writing superblocks and filesystem accounting information: done
Nun muss die Partition moch auf das Verzeichnis /home gebunden werden. Das erreicht man durch Erweiterung der Datei /etc/fstab, indem dort eine Zeile hinzugefügt wird (fett gedruckt):
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
/dev/mmcblk0p5  /home           ext4    rw,user,auto,exec 0       0
# a swapfile is not a swap partition, so no using swapon|off from here on, 
# use  dphys-swapfile swap[on|off]  for that
Der letzte Schritt ist dann das Kopieren der Dateien und Verzeichnisse aus dem existierenden /home-Verzeichnis auf die neue Partition. Dazu hängen wir die neue Partition erst einmal unter /mnt ein und kopieren dann /home:
mount /dev/mmcblk0p5 /mnt
( cd /home; tar cvpf - * ) | (cd /mnt; tar xpf - )
umount /dev/mmcblk0p5
Optional kann dann das alte /home-Verzeichnis ausgeleert werden, wobei /home selbst bestehen bleiben muss.
rm -rf /home/*
Nach dem nächsten Reboot ist dann alles so, wie es sein soll.

Betriebssystem und Software beim Raspberry Pi aktualisieren

Für alle Update-Vorgänge muss eine Internet-Verbindung existieren. Man aktualisiert die Pakete und Paketquellen mit apt-get. Beachten Sie auch, dass der Raspberry Pi 2 auf einer ARMv7-CPU basiert. Dort können die alten Images mit Datum vor dem 31.01.2015 nur bedingt verwendet werden. Will man ein älteres Image in einem neueren Raspberry Pi verwenden, muss man es zuvor in einem älteren Raspberry Pi von einer MicroSD-Karte booten und eine Aktualisierung durchführen. Anschließend kann man das Image auch in einem neuen Raspberry Pi 2 verwenden.

Es gibt nicht immer einen Grund für eine Aktualisierung des Betriebssystems. Generell gilt: "Wenn alles läuft wie gewünscht, lass die Finger davon!" Nur wenn funktional etwas anderes nötig ist, sollte man an ein Update denken. Andererseits gilt, dass man sein System aktuell und sicher halten soll. Jede Änderung oder Aktualisierung kann einen negativen Einfluss auf die Verfügbarkeit und Funktion haben. Ein Raspberry Pi, der nur eine einzige Aufgabe erfüllen soll, und nicht direkt mit dem Internet verbunden ist, braucht im Prinzip kein Update. In so einem Fall wäre ein Update sogar kontraproduktiv, weil eine Fehlfunktion durch ein unüberlegtes Update wahrscheinlicher ist. Anders sieht es bei einem System aus, das von aussen erreichbar ist. Hier sind aus Sicherheitsgründen regelmäßige Updates notwendig. Am einfachste Schützen Sie sich vor Überraschungen, wenn Sie von der aktuell SD-Karte vor dem Update eine Kopie ziehen. Dann können Sie immer zum Status Quo zurückkehren.

Aktualisieren der installierten Pakete, Bibliotheken und Programme

Linux besteht im Prinzip aus einem Kernel und Paketen der jeweiligen Distribution. Diese Pakete bestehen aus Programmen, Bibliotheken und Treibern. Sie bauen manchmal aufeinander auf und sind oftmals von anderen Paketen abhängig. Alle Abhängigkeiten eines Pakets werden in seinen Paketquellen verwaltet, die ebenfalls aktuell gehalten werden müssen. Die Paketverwaltung erfolgt unter Raspbian als Debian-Abkömmling in der Regel mit dem Programm apt-get. Jeder Aktualisierung von Paketen geht daher die Aktualisierung der Paketlisten voraus (alle folgenden Kommandos werden als Superuser ausgeführt → erst einmal sudo su eingeben):

apt-get update
Hiermit werden die Paketlisten aktualisert. Sie bilden gewissermaßen die Datenbank, in der verzeichnet ist, welche Programme in welcher Version verfügbar sind und welches Paket von welchem abhängig ist.

Anschließend werden die Pakete aktualisert. apt-get ermittelt zuerst aus den Paketlisten, für welche Pakete neue Versionen bereitstehen und erneuert werden müssen. Das Verfahren wird mit dem folgenden Kommando angestoßen:

apt-get upgrade
Es werden zuerst alle neuen Pakete heruntergeladen. Ein erfolgreiches Upgrade ist daher von aktuellen Paketlisten abhängig (vorher immer apt-get update ausführen). Das dauert jetzt etwas - eine gute Gelegenheit, einen frischen Kaffee aufzubrühen. Neben apt-get upgrade gibt es noch die Variante apt-get dist-upgrade. Mit apt-get upgrade werden die vorhandenen Pakete nur aktualisiert, wenn keine Veränderungen in den Abhängigkeiten dieser Pakete vorliegen. Mit apt-get dist-upgrade werden auch die Pakete aktualisiert, wenn sich dabei Abhängigkeiten verändern. Eventuell werden dadurch zusätzliche Pakete installiert und nicht mehr benötigte Pakete deinstalliert. Die Änderungen in den Abhängigkeiten können problematisch sein, wenn Sie eigene Programme compiliert oder ohne Paketmanager installiert haben.

Nach dem Aktualisieren ist normalerweise ein Neustart nötig, insbesondere, wenn Bibliotheken, Dienste/Daemons oder der Kernel aktualisiert wurden. Deshalb folgt ein

shutdown -r now

Pakete entfernen bzw. Programme deinstallieren

Die beiden folgenden Kommandos der APT-Familie entfernen Pakete, die nicht mehr gebraucht werden:

apt-get remove <Paketname>
apt-get purge <Paketname>
Der Unterschied zwischen "remove" und "purge" besteht darin, dass "purge" auch die zu den Paketen zugehörigen Konfigurationsdateien löscht. "remove" lässt diese für eine eventuell erneute Installation intakt. Möchten Sie Pakete restlos entfernen, dann verwenden Sie "purge". Beide Kommandos gehen beim Entfernen von Paketen gründlich vor und entfernen ggf. auch Abhängigkeiten. Es kann also vorkommen, dass auch Pakete entfernt werden, die man eigentlich behalten wollte. Deshalb sollten Sie vor der endgültigen Bestätigung die angezeigte Liste der zu entfernenden Pakete genau ansehen. Nach dem Aktualisieren und Entfernen von Paketen kommt es manchmal vor, dass andere abhängige) Pakete überflüssig werden, weil sie einfach nicht mehr gebraucht werden. Solche "Leichen" entfernt das Kommando:
apt-get autoremove

apt-get speichert zudem alle heruntergeladenen Pakete in einem Cache, damit Pakete, die schon einmal geholt wurden, nicht noch einmal heruntergeladen werden müssen und direkt installiert werden können. Um den Cache zu leeren, verwenden Sie:

apt-get clean
apt-get autoclean
"autoclean" löscht nur Pakete, die veraltet sind. "clean" löscht alle Pakete im Cache.

Natürlich dient das Programm apt-get install ... auch zum Installieren von weiteren Programmpaketen und Bibliotheken. Mittels apt-cache search ... können Sie herausfinden, welche Pakete es gibt und wie sie heissen.

Distributions-Upgrade

Etwas mehr Arbeit ist es, wenn es nicht um die Aktualisierung der aktuellen Distribution geht, sondern wenn auf eine neue Distribution gewechselt werden soll. Weil im Spätherbst 2015 Debian "Jessie" freigegeben wurde, soll der Wechsel von "Wheezy" auf "Jessie" als Beispiel dienen. Bis auf die Namen, ist der Vorgang aber immer der gleiche. Ein Upgrade des kompletten Systems ist recht einfach und richtet sich im Grunde nach der Anleitung im Kapitel oben, benötigt jedoch etwas Zeit. Und denken Sie daran: Es ist immer gut, wenn man noch ein Backup des alten Systems hat - und sei es nur, um eventuell in alten Konfigurationsdateien nachsehen zu können.

Das Ganze läuft in fünf Schritten ab:

  1. Aktualisieren des Systems
    Bevor Sie ein Upgrade von Raspian "Wheezy" auf "Jessie" durchführen, sollte das System mit "Weezy" komplett aktualisiert sein:
    sudo su
    apt-get update
    apt-get upgrade
    apt-get dist-upgrade
    
  2. Anpassen der Release
    Als nächstes müssen die Paketlisten an die neue Release "Jessie" angepasst werden. Im Prinzip muss jeweils nur das Wort "wheezy" durch "jessie" in den Paktequellen ersetzt werden.
    sudo su
    sed -i /deb/s/wheezy/jessie/g /etc/apt/sources.list
    sed -i /deb/s/wheezy/jessie/g /etc/apt/sources.list.d/*.list
    
    Für Nicht-SED-Spezialisten hier eine kleine Erklärung des Kommandos. Es wird nach Zeilen gesucht, die "deb" enthalten (/deb/). In diesem Zeilen wird "wheezy" durch "jessie" ersetzt (s/wheezy/jessie/) und zwar in der ganzen Zeile (g). Kann mam mit einem Editor auch von Hand machen.

  3. Aktualisierung der Paketlisten
    Nun müssen die neuen Jessie-Paketlisten aktualisiert und eingelesen werden:
    sudo apt-get update
    
  4. Aktualisierung auf "Jessie"
    Mit den aktuellen Paketquellen kann das Upgrade gestartet werden. Der Upgrade-Prozess wird in zwei Schritten durchlaufen. Zuerst ein Standard-Upgrade, um Konflikte zu umgehen und anschliessend ein vollständiges Distributions-Upgrade. Während der Aktualisierung werden auch einige Konfigurationsdateien erneuert. Raspbian fragt deshalb einige Male nach, ob man bestimmte Konfigurationsdateien durch die neue Version ersetzen will. Hat man in der Vergangenheit einzelne Konfigurationsdateien selbst geändert, sollte man je nach Datei zunächst mit der Taste [D] die Unterschiede anzeigen und dann ggf. das Ersetzen mit [N] ablehnen.
    sudo su
    apt-get upgrade
    apt-get dist-upgrade
    
  5. Installation bereinigen
    Nach dem Upgrade wird noch aufgeräumt:
    sudo su
    apt-get autoremove
    apt-get autoclean
    

Schließlich folgt noch der obligatorische Reboot.

Uhrzeit aktualisieren

Da der Raspberry Pi keine Echtzeituhr (Real Time Clock, RTC, siehe auch Projekt Realtime-Clock) besitzt, vergisst er die Uhrzeit beim Herunterfahren. Daher sollte die Zeit über einen Zeitserver aktualisiert werden (auch die RTC geht nicht genau). Eigentlich muss man nichts tun, denn der NTP-Dienst (NTP = Network Time Protocol) ist bei Raspbian per default installiert und holt so bei funktionierender Internet-Verbindung die aktuelle Uhrzeit. Nachteilig ist, dass er ständig im Hintergrund läuft und damit Systemressourcen belegt.

Eine Alternative zum NTP-Daemon ist das Programm ntpdate, das nur einmal Uhrzeit und Datum abruft. Meist genügt es, täglich einmal und nach einen Reboot die Zeit zu aktualisieren, was per Cronjob erledigt werden kann. ntpdate wird zwar mittlerweile als "deprecated" geführt, was aber nur bedeutet, dass es nicht mehr weiterentwickelt wird. Wozu auch? Es tut genau, was wir von ihm wollen. Falls noch nicht geschehen, sollte die korrekte Zeitzone festgelegt werden (Berlin). Das kann mit raspi-config erledigt werden.

Nun deinstallieren Sie den NTP-Dienst und installieren ntpdate:

sudo su
apt-get purge ntp
apt-get install ntpdate
Anschließend muss noch ein crontab-Eintrag vorgenommen werden, damit ntpdate regelmäßig automatisch aufgerufen wird. Mit sudo crontab -e richten Sie den neuen Cronjob für den Zeitabgleich ein, wobei der deutsche Zeitserver-Pool verwendet wird. Die Beiden neuen Zeilen in der Cron-Tabelle lauten:
@reboot ntpdate -s 0.de.pool.ntp.org
1 1 * * * ntpdate -s 0.de.pool.ntp.org
So wird einerseits beim Reboot die Zeit aktualisiert und andererseits jeden Tag um 01:01:00 Uhr - für Systeme, die ständig laufen. Die Option "-s" sorgt dafür, dass ntpdate still sein Werk verrichtet. Zum Testen kann man auch mal direkt bei der Physikalisch-technischen BUndesanstalt in Braunschweig anfragen:
sudo ntpdate ptbtime1.ptb.de
Es versteht sich von selbst, dass der Zeitabgleich schief geht, wenn keine INternet-Verbindung vorhanden ist.

Informationskommandos

Der Raspberry Pi informiert mit deversen Kommandos über sämtlich Interna. Einfach mal die Kommandos ausprobieren (Beschreibung gibt es immer mit man <Kommando>:

freeArbeitsspeicherverwendung
dfSpeicherplatz auf gemounteten Geräten
uptimeAnzeige der Systemlast und der Uptime, s. o.
hostnameAnzeige des Hostname
unameOS-Namen anzeigen
ifconfigInformationen über Netzwerkgeräte (nur als root)
iwconfigdesgleichen für WLAN-Benutzer
topkurze Systeminformationen und Anzeige der Prozesse
psAnzeige der Prozesse
dmesgAlle Systemstart-Informationen des Kernels
lscpuInfos über CPU, Rechnerkerne etc. auflisten
lsdevDevices (Geräte) auflisten
lsblkBlock-Devices auflisten
lshwAlle Daten der Hardware auflisten
lsofOffene Dateien und Sockets auflisten
lsmodModule auflisten
lspciPCI-Bus auflisten
lsusbUSB-Devices auflisten
lsscsiDaten über SCSI-Geräte auflisten (Platte, DVD, usw.)
lsattrDateisystem-Attribute auflisten


Copyright © Hochschule München, FK 04, Prof. Jürgen Plate
Letzte Aktualisierung: