Das Dateisystem des Raspberry Pi reagiert mitunter empfindlich auf plötzliches Ausschalten ohne vorheriges Runterfahren des Systems. So habe ich schon einige Zeit damit zugebracht das korrupte Dateisystem der SD-Karte an meinem Computer wieder zu bereinigen. Das gelingt zwar meistens, doch ich hatte auch schon Fehler, die nicht mehr korrigiert werden konnten und in einer Neuinstallation endeten.
Fehler am Dateisystem entstehen immer dann, wenn während eines Schreibvorgangs die Spannungsversorgung unterbrochen wird. Um die Gefahr eines korrupten Dateisystems zukünftig zu verringern, habe ich meinen portablen Raspberry Pi Zero mit einem Read-Only Filesystem ausgestattet. In dem später standardmäßig aktiven Lesemodus ist die Gefahr eines Filesystemcrashs wesentlich geringer.
Die Konfiguration des Read-Only-Filesystems ist mit wenigen Handgriffen erledigt und schließt sich quasi an die manuelle Installation meines Multimode-Hotspots an.
Ballast loswerden
Auch bei der hier verwendeten Lite-Variante von Raspbian wird einiges an unnötigen Programmen und Diensten mitinstalliert. Mit den folgenden Befehlen wird das System aktualisiert und entfernt was nicht benötigt wird.
apt-get update apt-get dist-upgrade apt-get remove --purge cron logrotate triggerhappy dphys-swapfile fake-hwclock samba-common apt-get autoremove --purge
RAM-Disk als temporäres Dateisystem
Unter Linux (bzw. UNIX) gilt der Grundsatz, dass alles eine Datei ist. Vor diesem Hintergrund ist es auch nicht verwunderlich, dass einige Systemprozesse in bestimmte bestimmte Pfade schreiben müssen. Dies gilt beispielsweise bei Logs, Lockfiles und dem Dienst DHCP. Diese Ausnahmen werden mithilfe eines temporären Dateisystems im Arbeitsspeicher abgebildet. Wichtiger Hinweis an dieser Stelle, da der RAM ein flüchtiger Speicher ist, stehen diese Dateien nach einem Neustart nicht mehr zur Verfügung. Das ist aber auch nicht sonderlich problematisch, denn die nötigen Systemdateien werden während des Startvorgangs neu erzeugt.
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 mv /etc/resolv.conf /tmp/ ln -s /tmp/resolv.conf /etc/resolv.conf
Filesystem-Tabelle anpassen
In der Datei /etc/fstab sind einige Änderungen nötig. Einerseits müssen die Mountpoints für /boot und / auf ro (readonly) gestellt werden. Darüber hinaus müssen die Mountpoints für /var/log, /var/tmp und /tmp an das temporäre Dateisystem gebunden werden.
proc /proc proc defaults 0 0
PARTUUID=d8cc668c-01 /boot vfat ro,defaults 0 2
PARTUUID=d8cc668c-02 / ext4 ro,defaults,noatime 0 1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
tmpfs /var/log tmpfs nodev,nosuid 0 0
tmpfs /var/tmp tmpfs nodev,nosuid 0 0
tmpfs /tmp tmpfs nodev,nosuid 0 0
Boot-Parameter anpassen
In der Datei /boot/bootline.txt müssen die beiden Optionen fastboot und noswap hinzugefügt werden. Die Option fastboot sorgt dafür, dass während des Systemstarts kein Überprüfung des Filesystems erfolgt. Da das Dateisystem zukünftig nur lesbar ist, die Dateisystemfehler aber bei Schreibzugriffen verursacht werden, ist die Überprüfung des Filesystems überflüssig. Die Option noswap sorgt dafür, das Inhalte des Arbeitsspeichers nicht in eine Auslagerungsdatei bzw. Partition geschrieben werden.
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait fastboot noswap
Sind alle Änderungen gemacht, kann das System neu gestartet werden. Schreibzugriffe werden dann wirkungsvoll unterbunden. Doch was ist, wenn man hier und da Änderungen an Dateien vornehmen möchte oder auch Updates einspielen möchte? Auch dafür gibt es eine Lösung.
Schreibmodus temporär aktivieren
Wenn Änderungen am System durchgeführt werden sollen, lässt sich das Dateisystem natürlich wieder beschreibbar machen. Das lässt sich mittels des Kommandos mount und folgenden Optionen erledigen.
mount -o remount,rw / mount -o remount,rw /boot
Bis zum nächsten Neustart ist das Dateisystem wieder schreibbar, um etwaige Änderungen zu verarbeiten. Hat man alle gewünschten Änderungen abgeschlossen, startet man das System neu oder nutzt diese beiden Befehle, um es wieder in den Read-Only-Modus zu versetzen.
mount -o remount,ro / mount -o remount,ro /boot
Etwas mehr Komfort lässt sich durch eine Anpassung der /etc/bash.bashrc implementieren. Werden die folgenden Zeilen in /etc/bash.bashrc eingefügt, dann zeigt die Bash den aktuellen Status des Dateisystems in der Kommandozeile an. Außerdem werden die Befehle für den remount über die Aliase ro und rw abgebildet, damit der Wechsel noch einfacher von statten geht.
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='sudo mount -o remount,ro / ; sudo mount -o remount,ro /boot' alias rw='sudo mount -o remount,rw / ; sudo mount -o remount,rw /boot' PROMPT_COMMAND=set_bash_prompt
Fazit
Für meinen portablen Raspberry Pi Zero habe ich mit dem Read-Only-Filesystem eine gute Lösung gefunden und wieder etwas über Linux gelernt. Das Dateisystem im Nurlesenmodus war eine Funktion, die ich von Pi-Star her kannte und schätzen gelernt habe. Wer noch mehr über das Read-Only Filesystem erfahren möchte, sollte sich die beiden Links ansehen, die mir bei der Umsetzung geholfen haben.
Dieser Artikel erschien zuerst im März 2019 in der gedruckten Ausgabe unseres Magazins.
Geht auch über raspi-config. Advanced -> Overlay FS
Sehr tolle Anleitung. Bei mir geht das mit der Datei /boot/bootline.txt nicht. Diese gibt es nicht.
Bei mir habe ich das in die Datei /boot/cmdline.txt eingefügt.
Der schreibzugriff wird auch geblockt aber ick komme leider nicht in den Schreibmodus zurück mit ihren angegebernen Einstellungen mount -o remount,rw /
mount -o remount,rw /boot
Vielen Dank für die Beschreibung,
ich werde das bei meinem pi projekt ausprobieren.
/boot/bootline.txt gibt es bei mir nicht, nur /boot/commandline.txt
Danke!
schöne einfache anleitung!
Du hast einen kleinen Fehler in der Beschreibung, die eine Datei heißt /boot/cmdline.txt und nicht /boot/bootline.txt.
vy73 de DL1NUX