Raspbian Lite für den Read-Only-Betrieb konfigurieren

Raspbian Lite ist eine Raspbian-Variante ohne Grafiksystem und GUI-Programme, ohne Java und Mathematica. Sie eignet sich daher besonders gut für Anwendungen, bei denen ein Raspberry Pi ohne Monitor Steuerungs- oder Server-Aufgaben übernehmen soll.

Wenn es für die Anwendung keine Notwendigkeit gibt, Daten auf der SD-Karte zu verändern, kann Raspbian Lite mit geringem Aufwand in ein Read-Only-System umgewandelt werden. Das hat den Vorteil, dass eine Beschädigung des Dateisystems nahezu ausgeschlossen ist, wenn der Raspberry Pi ohne einen richtigen Shutdown ausgeschaltet wird (sprich: wenn einfach der Stecker gezogen wird).

Ausgangspunkt für diese Anleitung ist ein fertig installiertes und konfiguriertes Raspbian Jessie Lite System. Bei meinem Testsystem ist der einzige USB-Port mit einem WLAN-Stecker verbunden. Der Minirechner bezieht über das WLAN seine Netzwerkdaten (mit DHCP). Das System kann also via SSH gesteuert werden.

Die minimale WLAN-Konfiguration in /etc/network/interfaces sieht so aus:

auto lo
iface lo inet loopback

auto wlan0
iface wlan0 inet dhcp
  wpa-ssid "meine-wlan-ssid"
  wpa-psk  "streng geheim"

Aufräumarbeiten

Nach einem Update entfernen Sie mit apt-get remove alle Pakete, die nicht mehr benötigt werden bzw. die ein Read-Write-Dateisystem unbedingt voraussetzen. Durch die folgenden Kommando wird auch raspi-config entfernt; wenn Sie das Tool für Konfigurationsarbeiten benötigen, sollten Sie diese vorher erledigen.

apt-get update && apt-get dist-upgrade
apt-get remove --purge cron logrotate triggerhappy dphys-swapfile fake-hwclock samba-common
apt-get autoremove --purge

Temporäre Dateisysteme im RAM

Ganz ohne Schreibzugriff geht es nicht. Deswegen werden die Verzeichnisse, die für Schreibzugriffe unbedingt erforderlich sind, in temporären Verzeichnisse verlagert, die im Arbeitsspeicher abgebildet werden. Beachten Sie, dass alle dort gespeicherte Daten bei jedem Reboot verloren gehen!

rm -rf /var/lib/dhcp/ /var/spool /var/lock
ln -s /tmp /var/lib/dhcp
ln -s /tmp /var/spool
ln -s /tmp /var/lock
ln -s /tmp/resolv.conf /etc/resolv.conf

/etc/fstab

In /etc/fstab sind zwei Änderungen erforderlich:

  • Zum einen für die Verzeichnisse / und /boot jeweils die Option ro, damit die Dateisysteme wirklich read-only in den Verzeichnisbaum eingebunden werden.
  • Und zum anderen drei neue Zeilen, um für /var/log, /var/tmp und /tmp jeweils ein temporäres Dateisystem einzurichten.

Die resultierende Datei sieht bei mir so aus:

# Datei /etc/fstab
proc            /proc           proc    defaults              0 0
/dev/mmcblk0p1  /boot           vfat    ro,defaults           0 2
/dev/mmcblk0p2  /               ext4    ro,defaults,noatime   0 1
tmpfs           /var/log        tmpfs   nodev,nosuid          0 0
tmpfs           /var/tmp        tmpfs   nodev,nosuid          0 0
tmpfs           /tmp            tmpfs   nodev,nosuid          0 0

Beachten Sie, dass die Device-Namen bei einer NOOBS-Installation anders aussehen.

/boot/cmdline

Auch /boot/cmdline muss verändert werden. Am Ende der langen Optionszeile fügen Sie die Optionen fastboot noswap hinzu. fastboot bedeutet, dass während des Bootvorgangs keine Überprüfung des Dateisystems erfolgen soll. noswap bedeutet, dass Linux ohne Swap-Datei arbeiten muss. Achten Sie darauf, dass Ihr Editor die Zeile nicht umbricht — alles muss in einer langen Zeile stehen.

Bei mir sieht diese Zeile so aus:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait fastboot noswap

Test

Damit sind alle Vorbereitungsarbeiten abgeschlossen. Mit reboot sollte Ihr System nun im Read-Only-Modus starten. Davon können Sie sich mit mount und touch überzeugen.

mount | grep mmcblk
  /dev/mmcblk0p2 on / type ext4 (ro,noatime,data=ordered)
  /dev/mmcblk0p1 on /boot type vfat (ro,relatime,
     fmask=0022,dmask=0022,codepage=437,iocharset=ascii,
     shortname=mixed,errors=remount-ro)
touch xy
  touch: cannot touch ‘xy’: Read-only file system

Bei meinen Tests funktionierte anfänglich die WLAN-Konfiguration nicht, weil ich den Link von /etc/resolv.conf in ein temporäres Dateisystem vergessen und für /tmp kein temporäres Dateisystem eingerichtet hatte.

Für allfällige Korrekturmaßnahmen ist es erforderlich, dass Sie Ihren Minicomputer an einen Monitor anschließen und über eine Tastatur bedienen können.

Boot-Geschwindigkeit und Platzbedarf

Mein Testkandidat war ein Raspberry Pi Zero. Vom Anstecken bis zum erfolgreichen Start des SSH-Servers vergehen rund 21 Sekunden. Das ist nicht traumhaft schnell, sollte aber für die meisten Anwendungsfälle ausreichen.

Der Platzbedarf für das gesamte System beträgt rund 1 GByte. Für die Installation von Raspbian Lite benötigen Sie eine SD-Karte mit zumindest 2 GByte.

df -h
  Filesystem      Size  Used Avail Use% Mounted on
  /dev/root       1.3G  945M  247M  80% /
  devtmpfs        214M     0  214M   0% /dev
  tmpfs           218M     0  218M   0% /dev/shm
  tmpfs           218M  8.4M  209M   4% /run
  tmpfs           5.0M     0  5.0M   0% /run/lock
  tmpfs           218M     0  218M   0% /sys/fs/cgroup
  tmpfs           218M  8.0K  218M   1% /tmp
  tmpfs           218M     0  218M   0% /var/tmp
  tmpfs           218M  132K  218M   1% /var/log
  /dev/mmcblk0p1   60M   20M   41M  34% /boot

free -h
             total       used       free     shared    buffers     cached
Mem:          434M        77M       357M       8.5M       6.3M        40M
-/+ buffers/cache:        30M       403M
Swap:           0B         0B         0B

Leisungsaufnahme

Die Leistungsaufnahme für den Pi Zero samt USB-WLAN-Stecker beträgt laut diesem simplen USB-Messgerät im Leerlauf rund 0,7 bis 0,8 Watt. Unter Last (CPU plus Netzwerk-Transfers) steigt der Verbrauch auf ca. 1,1 Watt.

Änderungen durchführen

Wenn Sie später doch einmal Änderungen durchführen möchten, loggen Sie sich ein und führen

mount -o remount,rw /

bzw. für das Boot-Verzeichnis

mount -o remount,rw /boot

aus. Damit kann das Dateisystem nun bis zum nächsten Reboot verändert werden.

Quellen