Raspberry Pi mit ReadOnly Filesystem

Da der Raspberry Pi keinen richtigen Ausschalter hat, ist es manchmal schwer das System korrekt herunterzufahren. Bei Linux sind die Schreibzugriffe auch nicht ganz so trivial, da gibt es schnell mal ein defektes Dateisystem. Da ich einige Anwendungen betreibe, bei denen ich nicht unbedingt Daten speichern muss, bin ich den Weg über das Readonly Dateisystem gegangen. Für Anwendungen mit Datenbank oder ständig schreibende Logfiles auf die man angewiesen ist, ist das natürlich nicht die richtige Lösung. Bei meinem Pi mit Datenbank habe ich eine UPS Pico USV installiert. Diese hat nicht nur den offentsichtlichen Vorteil der unterbrechungsfreien Stromversorgung mit vordefinierten Shutdown Zeiten, sondern hat noch 2 frei definierbare Buttons und 2 LED’s die man nach Bedarf steuern kann.

 

So, nun zurück zu unserem Raspberry Pi mit einem ReadOnly Filesystem

Wenn alles eingestellt und angepasst wurde, können wir den Pi einfach vom Strom nehmen, ohne Angst haben zu müssen, dass die SD-Karte kaputt geht. Ich habe mich eigentlich bei der ersten Einrichtung komplett an diese Anleitung gehalten.

Vorbereitung

Das System auf den aktuellen Stand bringen und einen Neustart durchführen.

apt-get update; apt-get upgrade
reboot

Nicht benötigte Pakete entfernen

apt-get remove --purge wolfram-engine triggerhappy anacron logrotate dbus dphys-swapfile xserver-common lightdm

Jetzt noch die grafische Oberfäche aus dem Autostart entfernen

insserv -r x11-common; apt-get autoremove --purge

Logdeamon austauschen

 apt-get install busybox-syslogd; dpkg --purge rsyslog

Damit werden die Logs in einen Puffer geschrieben. Kein Zugriff auf das Dateisystem. Mit dem Befehl logread kann man sich das Logfile anzeigen lassen. Mit logread |less  kann man mit den Pfeiltasten durch Logfile gehen.

Swap und Filesystemchecks deaktivieren

Die Datei /boot/cmdline.txt bearbeiten und die 3 Wörter anhängen. fastboot noswap ro

joe /boot/cmdline.txt

Meinde Datei sieht man unten. Die Optionen können bei verschiedenen Betriebssystemversionen abweichen.

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

Dateien in den Ram verlagern

Für die fehlerfreie Ausführung versschiedener Dienste ist doch ein schreibender Zugriff nötig. Zum Beispiel speichern fast alle Programm eine so genannte PID (ProzessID) im Dateisystem ab. Diese Verzeichnisse verlagern wir einfach in den tmp Ordner. Da der im Ram liegt, ist zwar alles weg, wenn der Pi Stromlos gemacht wird, das ist aber nicht schlimm.

rm -rf /var/lib/dhcp/ /var/run /var/spool /var/lock
ln -s /tmp /var/lib/dhcp; ln -s /tmp /var/run; ln -s /tmp /var/spool; ln -s /tmp /var/lock

Einige weiter Startscripte entfernen

Ich bin mir nicht sicher, ob das nötig ist, allerdings habe ich zur Umsetzung dieses RO Filesystems auch kein richtiges Raspbian genommen, sondern das aktuelle miniban. Das ist eine sehr abgespeckte Raspbian Variante ohne zusätzlichen Schnickschnack. (auch kein User pi eingerichtet) Ausgeführt habe ich den Befehl trotzdem.

insserv -r bootlogs; insserv -r console-setup

Dateisystem ReadOnly schalten

Jetzt ist es an der Zeit dem Dateisystem bzw. dem Betriebssystem zu sagen, dass es Readonly arbeiten soll.

Vorher:
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 errors=remount-ro,noatime,nodiratime,commit=120 0 1
Nachher:
/dev/mmcblk0p1  /boot   vfat    defaults,ro 0 2
/dev/mmcblk0p2  /       ext4    errors=remount-ro,noatime,nodiratime,commit=120,ro 0 1

# ReadOnly Filesystem
tmpfs           /tmp            tmpfs   nosuid,nodev         0       0
tmpfs           /var/log        tmpfs   nosuid,nodev         0       0
tmpfs           /var/tmp        tmpfs   nosuid,nodev         0       0

Umschalten zwischen Read/Write und Readonly Mode

Zum einen werden wir einen Alias anlegern, mit dem es einfach möglich ist zwischen den beiden Modi hin und her zu schalten. Das ist für ein Update des Systems ganz nützlich. Zum anderen ist bei dem unteren Codeschnipsel noch eine schöne Anzeige für das Prompt dabei.

Das bitte in die /etc/bash.bashrc am Ende einfügen.

# set variable identifying the filesystem you work in (used in the prompt below)
set_bash_prompt(){
    fs_mode=$(mount | sed -n -e "s/^\/dev\/.* on \/ .*(\(r[w|o]\).*/\1/p")
    PS1='\[\033[01;32m\]\u@\h${fs_mode:+($fs_mode)}\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
}
 
alias ro='mount -o remount,ro / ; mount -o remount,ro /boot'
alias rw='mount -o remount,rw / ; mount -o remount,rw /boot'
 
# setup fancy prompt"
PROMPT_COMMAND=set_bash_prompt

Nach einem reboot sollten das Prompt so aussehen.

root@pi(ro):~#

Jetzt kann man auf der Commandozeile mit rw in den Read/Write Modus wechseln (z.B. bei Updates) und mit ro  stellt man das System wieder auf ReadOnly um.

 

So das war’s, vielen Dank an den oben genannten englischen Blog. Durch Diesen bin ich erst auf die Idee gekommen.