10.5Interna und Backups

Zum Abschluss des Raspberry-Pi-Kapitels fasst dieser Abschnitt einige technische Details zur Funktionsweise des Raspberry Pi zusammen und gibt Tipps zur Durchführung von Backups.

Der Inhalt der Boot-Partition

Damit der Boot-Prozess des Raspberry Pi funktioniert, muss die erste Partition der SD-Karte eine VFAT-Partition sein und mehrere Dateien enthalten, deren Inhalt in Tabelle 10.2 zusammengefasst ist. Im laufenden Betrieb finden Sie diese Dateien im Verzeichnis /boot. Normalerweise sollten Sie diese Dateien nicht anrühren. Die einzige Ausnahme ist die Datei config.txt, die im nächsten Abschnitt näher beschrieben wird.

Datei

Inhalt

bootcode.bin

der Bootloader

start.elf

die Firmware des Grafikprozessors

*.dtb

Device-Tree-Blobs für verschiedene Raspberry-Pi-Modelle

overlay/*.dtb

Device-Tree-Blobs für diverse Hardware-Komponenten

config.txt

Textdatei zur Hardware-Konfiguration

kernel.img

der Linux-Kernel für den Raspberry Pi 1

kernel7.img

der Linux-Kernel für den Raspberry Pi 2 (ARMv7-CPU)

cmdline.txt

Textdatei mit Parametern, die an den Kernel übergeben werden

Tabelle 10.2Die Boot-Dateien des Raspberry Pi in der Reihenfolge ihrer Verarbeitung

Der Boot-Vorgang verläuft auf dem Raspberry Pi vollkommen anders als auf einem gewöhnlichen PC. Es gibt kein BIOS, kein EFI und keinen GRUB. Wenn der Raspberry Pi eingeschaltet wird, ist vorerst nur der GPU-Core aktiv, also der Grafikteil der CPU. Die GPU lädt den ersten Teil des Bootloaders aus einem ROM (1st stage bootloader). Mit diesem Miniprogramm kann die CPU auf die SD-Karte zugreifen und dort bootcode.bin in den Cache der CPU lesen. Diese Datei enthält den restlichen Bootloader (2nd stage bootloader). Der Bootloader lädt nun start.elf. Das darin enthaltene Programm wertet die Device-Tree-Dateien sowie config.txt aus, liest cmdline.txt und kernel.img bzw. kernel7.img und startet schließlich den Kernel.

Die Konfigurationsdatei »config.txt«

Unabhängig davon, welches Betriebssystem Sie auf Ihrem Raspberry Pi installiert haben, bestimmt die Datei config.txt in der ersten Partition der SD-Karte viele Eckdaten der Konfiguration. Die Datei wird direkt beim Booten des Raspberry Pi ausgewertet. Dieser Abschnitt fasst die wichtigsten Einstellmöglichkeiten dieser Datei zusammen. Noch mehr config.txt-Details können Sie hier nachlesen:

http://elinux.org/RPi_config.txt

Veränderungen an config.txt werden erst mit dem nächsten Neustart wirksam. Viele config.txt-Parameter können Sie im laufenden Betrieb mit vcgencmd get_config auslesen (siehe den folgenden Abschnitt).

Der Raspberry Pi 2 verfügt insgesamt über 1 GByte RAM. Das RAM wird zwischen der CPU und dem Grafikprozessor geteilt. Die Aufteilung muss beim Start endgültig mit dem Parameter gpu_mem festgelegt werden, wobei Sie dem Grafiksystem 16, 64, 128 oder 256 MByte zuweisen können. 16 MByte sind für den normalen Betrieb ausreichend. Für grafikintensive Anwendungen (3D-Grafik, HD-Filme abspielen etc.) benötigt das Grafiksystem hingegen 128 MByte Speicher. Auch die Nutzung der Kamera erfordert ein Minimum von 128 MByte Grafikspeicher:

gpu_mem=128

Normalerweise funktioniert die Grafik via HDMI ohne weitere Konfiguration. Nur wenn es Probleme gibt, können Sie mit diversen hdmi_xxx-Parametern bestimmte Einstellungen erzwingen. Das folgende Listing gibt hierfür einige Beispiele:

# HDMI-Ausgang verwenden, auch wenn kein Monitor erkannt wird hdmi_force_hotplug=1 # HDMI-Auflösung 1400*1050 @ 60 Hz # alle zulässigen hdmi_mode-Werte: siehe http://elinux.org/RPi_config.txt hdmi_group=2 hdmi_mode=42 # Display-Drehung korrigieren # 1 = 90 Grad, 2 = 180 Grad, 3 = 270 Grad display_rotate=1 # HDMI-Signalstärke # 0 = normal, 7 = maximal (Vorsicht!) config_hdmi_boost=4

Wenn Sie nicht wissen, welche Video-Modi Ihr Monitor unterstützt, führen Sie das Kommando tvservice aus. Die aufgelisteten Modi mit der Option -m CEA gelten für hdmi_group=1, die Modi mit der Option -m DMT für hdmi_group=2. Die folgenden Ergebnisse sind auf einem Monitor mit einer Auflösung von 1920 × 1200 Pixel entstanden:

pi$ vservice -m CEA Group CEA has 7 modes: mode 1: 640x480 @ 60Hz 4:3, clock:25MHz progressive mode 2: 720x480 @ 60Hz 4:3, clock:27MHz progressive ... (native) mode 16: 1920x1080 @ 60Hz 16:9, clock:148MHz progressive pi$ tvservice -m DMT Group DMT has 13 modes: mode 4: 640x480 @ 60Hz 4:3, clock:25MHz progressive ... mode 68: 1920x1200 @ 60Hz 16:10, clock:154MHz progressive

Zum Raspberry Pi gibt es eine kleine Kamera, die über ein Flachbandkabel mit dem Minicomputer verbunden wird. Damit Sie diese Kamera nutzen können, sind zwei Ergänzungen in config.txt erforderlich. Diese Einstellungen können Sie auch mit dem Programm Raspberry Pi Configuration bzw. mittels raspi-config vornehmen.

# Datei /boot/config.txt # Kameramodul aktivieren start_x=1 # 128 MByte RAM für den Video-Speicher reservieren gpu_mem=128 # optional: LED der Kamera deaktivieren disable_camera_led=1

Zusammen mit Raspbian werden zwei Kommandos installiert, um die Kamera zu nutzen: raspistill -o name.jpg macht ein Foto und speichert das Bild in der angegebenen Datei. raspivid-o name.h264 -t 10000 erstellt ein 10 Sekunden langes Video und speichert es in einer H264-Datei. Beide Kommandos lassen sich durch diverse Optionen steuern, die in den man-Seiten dokumentiert sind.

Sogenannte Device Trees (siehe Abschnitt 26.2) beschreiben die Hardware des Raspberry Pi – inklusive der Erweiterungen, die Sie selbst für ein Bastelprojekt hinzugefügt haben. Damit der Kernel über Ihre Erweiterungen Bescheid weiß, müssen Sie in config.txt angeben, welche Komponenten oder Bussysteme Sie zusätzlich nutzen wollen. Die folgenden Zeilen geben Syntaxbeispiele für die am häufigsten vorkommenden Anwendungen:

# Datei /boot/config.txt # Beispiele zur Steuerung des Device-Tree-Systems # (weitere Details siehe /boot/overlays/README) # SPI-Bus aktivieren dtparam=spi=on # I2C-Bus aktivieren dtparam=i2c_arm=on # HiFi-Berry DAC+ verwenden dtoverlay=hifiberry-dacplus # 1-Wire-Temperatursensor mit Standardeinstellungen verwenden dtoverlay=w1-gpio-pullup # 1-Wire-Temperatorsensor verwenden, der mit # GPIO X verbunden ist (per Default GPIO 4), und # dabei den internen Pull-up-Widerstand aktivieren dtoverlay=w1-gpio-pullup,gpiopin=X,pullup=y # Echtzeituhr-Modell ds1307 verwenden dtoverlay=rtc-i2c, ds1307 # IR-Empfänger verwenden dtoverlay=lirc-rpi

Overclocking ermöglicht es, Ihren Raspberry Pi schneller zu takten als vorgesehen. Gerade für CPU- oder GPU-intensive Aufgaben, z.B. für die HD-Wiedergabe von Videos, ist Overclocking natürlich eine willkommene Hilfe, um den Raspberry Pi schneller zu machen.

Laut offiziellen Angaben auf der Raspberry-Pi-Website ist moderates Overclocking sicher. Das heißt, es sind weder Stabilitätsprobleme noch ein vorzeitiger Hitzetod zu erwarten, sofern die CPU-Temperatur 85 Grad Celsius nicht überschreitet. Dem widersprechen aber mitunter Foren-Berichte mit negativen Erfahrungen von Raspberry-Pi-Besitzern. Letztlich müssen Sie also selbst entscheiden, ob Ihnen mehr Performance das damit verbundene Risiko wert ist. Ich rate Ihnen vom Overclocking ab.

Aus technischer Sicht ist das Overclocking unkompliziert. Sie müssen lediglich einige Zeilen in config.txt ändern und Ihren Raspberry Pi neu starten. Am einfachsten führen Sie diese Änderungen mit dem Raspberry-Pi-Konfigurationsprogramm durch. Die folgenden Einstellungen sind für einen Raspberry Pi 2 gedacht und bewirken, dass er bei Bedarf mit einer Taktfrequenz von 1 GHz läuft statt normalerweise mit 900 MHz:

# Maximale Taktfrequenz der CPU in MHz. Default 900 MHz. arm_freq=1000 # Taktfrequenzen der Grafik- und Encoding-Cores. Default 250 MHz. # GPU = Graphics Processing Unit. core_freq=500 # RAM-Taktfrequenz. Default 400 MHz. sdram_freq=500 # Die Spannung um n*0.025 V anheben. Nur bei starkem Overclocking erforderlich. # Maximal 6 mit force_turbo=0 (entspricht 0.150 V), # maximal 8 mit force_turbe=1 (entspricht 0.2V). over_voltage=2 over_voltage_sdram=0

Das Overclocking erfolgt normalerweise dynamisch, d.h. nur dann, wenn die CPU- oder GPU-Leistung tatsächlich benötigt wird. In den Ruhezeiten laufen CPU und GPU in den Defaulttaktfrequenzen. force_turbo=1 verhindert die Taktabsenkung und bewirkt, dass die CPU/GPU immer mit der angegebenen Frequenz getaktet wird. Das ist stabiler, die CPU/GPU wird aber schneller heiß. Die gerade aktuelle CPU-Frequenz und -Temperatur können Sie wie folgt auslesen (in kHz bzw. in Milligrad):

pi$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq 600000 pi$ cat /sys/class/thermal/thermal_zone0/temp 39007

Die Encoding-Komponenten der GPU können die Video-Decodierung unterstützen. Für manche Codecs ist das standardmäßig der Fall, für andere muss diese Funktion mit einem kostenpflichtigen Lizenzschlüssel freigeschaltet werden. Momentan sind zwei derartige Schlüssel vorgesehen: je einer für den MPG-2- und für den VC-1-Decoder. Die folgenden Werte sind natürlich nur Muster. Die Schlüssel müssen zur ID Ihrer CPU passen.

decode_MPG2=0x12345678 decode_WVC1=0x9abcedf0

Die folgenden Parameter modifizieren den Boot-Vorgang:

# Parameter für den Kernel (anstelle der Datei cmdline.txt) cmdline=xxx # Name der Kernel-Datei (default: kernel.img) kernel=filename # Wartezeit, bevor der Kernel geladen wird (in Sekunden, default 1). boot_delay=2

Das Kommando »vcgencmd«

Mit dem Kommando vcgencmd können Sie diverse Statusinformationen der CPU auslesen. vcgencmd commands liefert eine Liste aller bekannten Kommandos. Die folgenden Beispiele zeigen einige Anwendungen:

pi$ vcgencmd measure_clock arm (CPU-Frequenz) frequency(45)=600000000 pi$ vcgencmd measure_clock core (Frequenz der Grafik-Cores) frequency(1)=250000000 pi$ vcgencmd measure_volts core (Spannung der Grafik-Cores) volt=1.20V pi$ vcgencmd measure_temp (CPU-Temperatur) temp=47.1'C pi$ vcgencmd codec_enabled H264 (Steht Codec xy zur Verfügung?) H264=enabled pi$ vcgencmd get_config int (Liste aller aktiven Integer-Optionen) disable_overscan=1 temp_limit=85 force_pwm_open=1 pi$ vcgencmd get_config str (Liste aller aktiven String-Optionen)

Noch mehr Anwendungsbeispiele finden Sie hier:

http://elinux.org/RPI_vcgencmd_usage

Backups

Grundsätzlich gelten für den laufenden Betrieb eines Minicomputers dieselben Backup-Strategien wie für einen gewöhnlichen Computer (siehe Kapitel 37): Wenn Sie auf Ihrem Minicomputer veränderliche Daten speichern, sollten Sie diese regelmäßig sichern. Im Idealfall hat der Minicomputer eine Verbindung zu einem NAS-Gerät; dann bietet sich die Programmierung eines kleinen Backup-Scripts an, das einmal täglich alle relevanten Daten in einem Netzwerkverzeichnis sichert.

Davon losgelöst ist es zweckmäßig, hin und wieder eine Sicherungskopie der ganzen SD-Karte zu erstellen. Dieses Backup kann dann jederzeit auf eine neue, zumindest gleich große SD-Karte übertragen werden. Die folgenden Beispiele gehen wieder davon aus, dass das Device der SD-Karte /dev/sdb lautet. Passen Sie die Device-Angaben entsprechend an!

root# umount /dev/sdb? root# dd if=/dev/sdb of=backup.img bs=4M

Das Auslesen großer SD-Karten dauert leider ziemlich lange. Wenn Sie in dieser Zeit ein Feedback wünschen, setzen Sie statt dd das Kommando dcfldd ein. Optional können Sie die zu sichernden Daten auch gleich komprimieren:

root# dcfldd if=/dev/sdb bs=4M | gzip > backup.img.gz

Riesen-Backup, obwohl die SD-Karte halb leer ist?

Die Backup-Datei wird möglicherweise trotz Komprimierung größer ausfallen als erwartet – auch dann, wenn nur ein kleiner Teil der SD-Karte tatsächlich mit Daten gefüllt ist. Das liegt daran, dass in jedem Fall der gesamte Datenträger blockweise ausgelesen wird, egal ob diese Blöcke vom Dateisystem genutzt werden oder nicht. Oft enthalten die Blöcke Zufallsdaten, z.B. Überreste einer früheren Nutzung der Karte in einer Digitalkamera, die schwer zu komprimieren sind.

In die umgekehrte Richtung sehen die Kommandos wie folgt aus. Beachten Sie, dass dabei der gesamte Inhalt des Datenträgers /dev/sdb überschrieben wird!

root# umount /dev/sdb? root# dd if=backup.img of=/dev/sdb bs=4M

Wenn Sie das Backup-Image komprimiert haben, gehen Sie so vor:

root# gunzip -c backup.img.gz | dd of=/dev/sdb bs=4M