Im Internet gibt es reichlich Anleitung, wie das Dateisystem des Raspberry Pi read-only eingebunden werden kann, doch nur wenige sind auch für den Endanwender praktisch und einfach umsetzbar. Doch ich bin auf eine sehr vielversprechende Lösung gestoßen.
Eigentlich lässt sich ein Standard Linux System nicht einfach so mit einem read-only root-Dateisystem betreiben. Spätestens wenn nach der Basis-Installation weitere Anwendungen wie zum Beispiel ein Webserver installiert wird, werden weitere Verzeichnisse für zum Beispiel Log-Dateien benötigt. Die oft beschriebene Herangehensweise, einfach anstelle des /var/log
Verzeichnisses ein tmpfs einzuhängen führt spätestens dann zu Problemen, wenn die Software in dem Pfad weitere Unterordner benötigt, die nicht existieren. Hier muss dann entweder die Config angepasst oder Skripte für die automatische Erstellung dieser Verzeichnisse angelegt werden. In einem früheren Artikel hatte ich bereits beschrieben, wie aufs, ein Layer-Dateisystem, dafür verwendet werden kann ein Beschreibbares Dateisystem über ein read-only Dateisystem zu legen. Prinzipiell funktioniert diese Technik zwar so gut, dass ich sie bei verschiedenen Projekten schon mindestens zwei Jahre ohne größere Probleme im Einsatz habe, jedoch gibt es dabei noch Potenzial zur Verbesserung.
Pavel Pisa hat beim InstallFest eine bessere Möglichkeit vorgestellt. Bei seinem Ansatz kommt OverlayFS zum Einsatz, welches ähnlich wie aufs funktioniert, jedoch seit Version 3.x Bestandteil des Linux Kernels ist.
Zunächst müssen die benötigten Skripte und Config-Dateien aus seinem rpi-utils Repository heruntergeladen werden. Danach müssen ein paar der Ordner aus dem Ordner init-overlay
auf die SD-Karte des Raspberry Pi kopiert werden. Der wichtigste ist hier der Ordner sbin
. Er muss in das root-Verzeichnis auf der SD-Karte kopiert werden. Dabei sollte darauf geachtet werden, dass die kopierten Dateien in diesem Ordner ausführbar sind und bleiben. Wer noch eine Dokumentation auf dem Raspberry Pi benötigt, kann den usr
Ordner auch noch kopieren. Damit mit das Dateisystem beim nächsten Boot richtig eingehangen werden kann, muss im root-Verzeichnis der SD-Karte noch der Ordner overlay
angelegt werden. Zum Abschluss muss die Datei cmdline.txt
im boot
Verzeichnis um folgenden Ausdruck erweitert werden.
ro init=/sbin/init-overlay
Bei dem vorliegenden Raspbian in Version 2016-05-27 sah die Zeile anschließend wie folgt aus.
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait ro init=/sbin/init-overlay
Anschließend kann der Raspberry Pi mit der angepassten SD-Karte neu gestartet werden. Nach dem Bootvorgang kann mit dem Befehl mount
geprüft werden, ob alle Dateisysteme auch richtig eingehängt sind. Das folgende Beispiel Zeigt, dass der Inhalt der SD-Karte in dem overlay
-Verzeichnis eingehängt und read-only ist. Weiterhin ist zu erkennen, dass für das neue root-Verzeichnis ein OverlayFS ist und sich aus dem read-only Daten und einem tempfs zusammensetzt.
/dev/mmcblk0p2 on /overlay/pivot type ext4 (ro,relatime,data=ordered)
[...]
/dev/mmcblk0p2 on /overlay/robase type ext4 (ro,relatime,data=ordered)
none on /overlay/rwdata type tmpfs (rw,relatime)
/overlay on / type overlay (rw,noatime,lowerdir=/overlay/robase,upperdir=/overlay/rwdata/data,workdir=/overlay/rwdata/work)
[...]
/dev/mmcblk0p1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)
Beachtet werden sollte, dass nur ein Teil des RAMs für das OverlayFS verwendet wird und somit auch nur so viele Daten geschrieben werden können.
Die Verwendung von OverlayFS lässt sich mit dem Tool overlayctl
relativ einfach steuern. Den aktuellen Status kann man zum Beispiel wie folgt abfragen.
$ sudo overlayctl status
overlay is active
overlay enabled for next boot
Soll die Verwendung von OverlayFS beim nächsten Reboot deaktiviert sein, muss folgender Befehl ausgeführt werden.
$ sudo overlayctl disable
Soll anschließend die Verwendung von OverlayFS beim nächsten Reboot wieder aktiviert sein, muss folgender Befehl ausgeführt werden.
$ sudo overlayctl enable
Links
- Webseite: rpi-utils Repository (englisch)
- Webseite: Raspberry Pi (englisch)