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.