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 Optionro
, 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
...
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“
danke, ist korrigiert
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.
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.
danke für diesen artikel!
funktioniert das auch für das normale raspbian? welche einstellungen würden zusätzlich notwendig sein?
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
ich habe jetzt eine andere interessante möglichkeit gefunden:
https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=161416
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
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/)
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
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