microSD-schonender Betrieb von Raspberry PIs (Teil 1 – Initiales Setup)

Wie ja diversen Foren zu entnehmen ist, und jeder ohne solche Einträge gekannt zu haben, es früher oder später einmal erfährt, sind die microSD Karten nicht sonderlich lange haltbar, wenn sie im PI wie ein gewöhnliches Medium im beschreibbaren Zustand betrieben werden. Mir ist es zum Glück bisher nur einmal passiert, dass eine Karte den Heldentod gestorben ist aber das war mir eine Warnung. Daher habe ich angefangen, meine PIs im read-only (RO) Mode zu betreiben. Das ganze ist eigentlich recht simpel, geht es doch im Wesentlichen „nur“ darum die beiden Mounts „/boot“ und Root („/“) mit der Option „RO“ in der /etc/fstab einzubinden:

/dev/mmcblk0p1  /boot           vfat    defaults,ro          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime,ro  0       1

Damit können dann aber gar keine Programme mehr irgendwas schreiben, was das ganze auf den ersten Blick nicht wirklich brauchbar erscheinen lässt. Daher habe ich mir aus einem anderen Blogbeiträg und ein paar Erweiterungen „meine Lösung“ zusammengebaut, mit der ich auch endlich openHAB im RO-Mode betreiben kann. Da das logging von openHAB auf einer entfernten mySQL Datenbank stattfindet, muss hier eh nicht lokal geschrieben werden. Doch der Reihe nach:

Da ich das ganze System schlank halten wollte, habe ich zunächst raspberian-jessie-lite auf einer Karte installiert. Hier sind die beiden o.g. Einträge noch ohne den „RO“ Zusatz in Standard vorgesehen. Das kann man einfach mit dem Editor der persönlichen Wahl ändern. :-)

Die beiden Verzeichnisse /var/log und /tmp müssen beschreibbar sein, können aber in meinem Setup getrost bei einem Reboot resettet werden, so dass ich noch folgende zwei Zeilen hinzugefügt habe:

tmpfs    	/var/log    	tmpfs   defaults,noatime,nosuid,mode=0755,size=50m    0 0
tmpfs   	/tmp    	tmpfs   defaults,noatime,mode=1777,size=30m

Unter /var gibt es ebenso einen tmp-Ordner, den ich wie folgt „optimiert“ habe:

$ cd /var
$ rmdir tmp
$ ln -s /tmp .

Um nun noch den standardmäßig vorgesehen FSCK beim Boot zu eliminieren (in der / Partition) führt man noch folgende Zeile aus:

tune2fs -c -1 -i 0 /dev/mmcblk0p2

Es gibt ein paar Cron-Jobs, die durch einfügen eine „exit 0“ in der ersten Zeile deaktiviert wurden:

  • /etc/cron.hourly/fake-hwclock
  • /etc/cron.weekly/man-db
  • /etc/cron.daily/man-db

Auch logrotate muss man noch in „/etc/cron.daily/logrotate“ ein wenig „tweaken“:

#!/bin/sh

test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate --state /var/log/logrotate.state /etc/logrotate.conf

Last, but not least deaktiviert man noch Swap:

$ update-rc.d -f dphys-swapfile remove
$ swapoff /var/swap
$ rm /var/swap

Jetzt steht einem reboot nichts mehr im Wege und wir sind mit dem ersten Teil fertig. Nach dem Reboot des PIs sollten dann /boot und / nur noch RO gemounted sein sowie unsere tmpfs Mountpoints entsprechend angezeigt werden, was sich durch ein „mount“ anzeigen lässt:

/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)

tmpfs on /tmp type tmpfs (rw,noatime,size=30720k)
tmpfs on /var/log type tmpfs (rw,nosuid,noatime,size=51200k,mode=755)

Wenn man nun Änderungen machen will, so muss man das jeweilige Device „RW“ remount-en. Da mir das auf Dauer zu unpraktisch ist und ich mir nicht die Syntax dauerhaft merken will, habe ich mir in der .bashrc von root ein paar Alias-Zeilen konfiguriert:

# set variable identifying the filesystem you work in (used in the prompt below)
fs_mode=$(mount | sed -n -e "s/^\/dev\/mmcblk0p2 on \/ .*(\(r[w|o]\).*/\1/p")

alias ro='mount -o remount,ro / ; mount -o remount,ro /boot ; fs_mode=$(mount | sed -n -e "s/^\/dev\/mmcblk0p2 on \/ .*(\(r[w|o]\).*/\1/p")'
alias rw='mount -o remount,rw / ; mount -o remount,rw /boot ; fs_mode=$(mount | sed -n -e "s/^\/dev\/mmcblk0p2 on \/ .*(\(r[w|o]\).*/\1/p")'

# setup fancy prompt
export PS1='\[\033[01;32m\]\u@\h${fs_mode:+($fs_mode)}\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

Somit sehe ich direkt am Prompt, wie das System die Mounts eingebunden hat, d.h. RO oder RW. Eine Eingabe von „RW“ bewirkt dann, dass beide Devices schreibbar remounted werden; eine Eingabe von „RO“ hängt die Mounts wieder nur lesbar ein. Last but not least habe ich mir noch eine .bash_logout spendiert, die automatisch auf RO umschaltet, wenn ich mich als root abmelde:

RO

Das soll es für heute sein. Wie man dann openHAB einrichtet, werde ich dann in einem nächsten Blogpost beschreiben.

Das könnte dich auch interessieren …

2 Antworten

  1. 26. November 2016

    […] vorhergehende Artikel habe ich mein Basis-Setup beschrieben. Eine Sache habe ich dabei jedoch unterschlagen: Wie geht man […]

  2. 1. Dezember 2016

    […] hatte ich, wie im ersten Teil beschrieben, die mySQL Datenbank für openHAB auf meinem NAS angebunden. Allerdings habe ich […]

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert