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 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.

Read-only mit X

Update 23.12.2018 nach einer Leserzuschrift: Im Read-only-Betrieb ist der manuelle Start eines X-Servers durch startx unmöglich. Abhilfe schafft eine kleine Änderung in /usr/bin/startx. Hier wird $HOME durch /tmp ersetzt:

if [ x"$enable_xauth" = x1 ] ; then
  if [ x"$XAUTHORITY" = x ]; then
      # XAUTHORITY=$HOME/.Xauthority 
      XAUTHORITY=/tmp/.Xauthority 
      export XAUTHORITY
  fi
...

Quellen

11 Gedanken zu „Raspbian Lite für den Read-Only-Betrieb konfigurieren“

  1. Kann es sein, dass am Ende des Artikels im mount-Befehl hinter „bzw. für das Boot-Verzeichnis“ ein „boot“ fehlt?
    „mount -o remount,rw /“ -> „mount -o remount,rw /boot“

  2. Feine Zusammenstellung. Noch einige Anmerkungen:
    Die Syntax des symbolischen Links fuer die resolv.conf ist vertauscht. Es sollte
    ln -s /etc/resolv.conf /tmp/resolv.conf
    heissen. Und – der vollstaendige Name der Steuerdatei ist
    /boot/cmdline.txt
    Da implizit vorausgesetzt wird, dass der gesamte Vorgang als root ausgefuehrt wird, ist vor dem reboot empfehlenswert, root ein Passwort zu goennen, weil spaeter der mount/remount-Befehl
    nicht mehr mit sudo erreichbar ist.

  3. Nach genauerem Nachsinnen: Meine Anmerkung zum Link auf resolv.conf ist falsch und in diesem Zusammenhang auch sinnfrei. Ab der Version jessie ist /etc/resolv.conf eine dynamisch erzeugte Datei ( durch /sbin/resolvconf). In /sbin/resolvconf, einem Script, ist festgelegt, dass resolv.conf im Verzeichnis /etc angelegt wird. Daher ist der im Artikel angelegte symbolische Link korrekt.

  4. danke für diesen artikel!

    funktioniert das auch für das normale raspbian? welche einstellungen würden zusätzlich notwendig sein?

    1. vermutlich nicht (ich habe es nicht versucht)

      beim normalen Raspbian laufen derart viele Dienste, da wird es sicher eine Menge geben, die rw-Rechte brauchen

  5. Ich habe das Problem dass /tmp nachher folgende Rechte hat:

    drwxr xr x 7 root root 180 Jan 1 1970 tmp

    Und somit normale User nicht in /tmp schreiben können

    1. On debian jessie /usr/lib/tmpfiles.d/var.conf chmods /var/spool to 0755. This means that /tmp is changed to 0755 as well because we changed /var/spool to point to /tmp. So the /var/spool line in /usr/lib/tmpfiles.d/var.conf has to be commented out.
      /run and /run/lock are tmpfs already, maybe they are better softlink targets than /tmp.
      (see: https://hallard.me/raspberry-pi-read-only/)

  6. Sollte in der /etc/fstab für die die ext4-Partition nicht noch zusätzlich „noload“ angegeben werden, damit auch das Journal nicht geschrieben wird?
    https://www.kernel.org/doc/Documentation/filesystems/ext4.txt:

    ro Mount filesystem read only. Note that ext4 will
    replay the journal (and thus write to the
    partition) even when mounted „read only“. The
    mount options „ro,noload“ can be used to prevent
    writes to the filesystem.

    /dev/mmcblk0p2 / ext4 ro,noload,noatime,defaults 0 1

    Da /etc/resolv.conf ja schon exisitiert, kann man den symbolischen Link auch forcen:

    ln -sf /tmp/resolv.conf /etc/resolv.conf

  7. Vielen Dank für die Anleitung, mit einigen Änderungen hat alles gut geklappt:

    Die letzte Zeile (ln -s /tmp/resolv.conf /etc/resolv.conf) habe ich durch folgende ersetzt:

    rm /etc/resolv.conf
    touch /tmp/resolv.conf
    ln -s /tmp/resolv.conf /etc/resolv.conf

    Gruß Frank

Kommentare sind geschlossen.