Franks Raspberry Pi
Ein twitternder Raspberry Pi
aus Altlußheim am Rhein

Eine Ramdisk für den Raspberry Pi

Seit heute hat mein Raspberry Pi eine Ramdisk, um die SD-Karte zu schonen. Das aktuelle Bild der Webcam beispielsweise muss nicht jedesmal auf die SD-Karte oder den USB-Stick geschrieben werden, nur um dann spätestens fünf Minuten später durch eine neue Version ersetzt zu werden. Jeder weiß, das Flash-Speichermedien nur eine begrenzte Anzahl von Schreibzugriffen verkraften und man muss den Ausfall ja nicht unnötig herbeiführen.

Ramdisk manuell

Eine Ramdisk für den Raspberry Pi zu erstellen ist sehr einfach:

Erst einmal wird man root mit

sudo su

Man erzeugt ein Verzeichnis, z.B.

mkdir /share/ramdisk

Nun muss dort die Ramdisk eingebunden werden, dafür reicht das Kommando

/bin/mount -t ramfs ramfs /share/ramdisk

Achtung: Diese Art von Ramdisk (als Dateisystemtyp ramfs) hat keine Größenbegrenzung, man kann damit problemlos den Raspberry Pi an die Wand fahren, wenn man zu viele Daten in die Ramdisk legt, also Vorsicht! Eine Ramdisk mit Dateisystemtyp tmpfs bietet eine solche Größenbegrenzung, der Inhalt wird aber ggfs. in die Swapdatei geschrieben. 

Als Abschluss noch die Berechtigungen setzen, damit alle schreiben und lesen können
/bin/chmod 777 /share/ramdisk
Fertig. Oder? Nun, diese Ramdisk ist nach dem nächsten Booten wieder weg und muss manuell wieder erstellt werden, nicht sehr komfortabel.

Ramdisk per Script

Man kann die Kommandos in ein Script schreiben, damit es nur noch ein Aufruf wird

#!/bin/sh

[ -d /share ] || mkdir /share
[ -d /share/ramdisk ] || mkdir /share/ramdisk
/bin/mount -t ramfs ramfs /share/ramdisk
/bin/chmod 777 /share/ramdisk

Dieses Script speichern wir im Home-Verzeichnis des Benutzers root (bei meinem Pi ist das /root) als ramdisk.

Berechtigungen setzen

chmod 755 ramdisk

Jetzt reicht ein Start des Scripts als Benutzer root und die Ramdisk ist da

sudo /root/ramdisk

Ramdisk-Script als cronjob

Um das Script beim Start des Raspberry Pi automatisch ausführen zu lassen, fügen wir zur crontab des Benutzers root die folgende Zeile hinzu:

@reboot /root/ramdisk

Nun wird bei jedem Start des Raspberry Pi die Ramdisk angelegt. Nach dem Herunterfahren sind alle Daten darin aber - wie bei einer Ramdisk so üblich - weg.

Ramdisk mit Datensicherung

Dass die Daten in der Ramdisk nach jedem Boot weg sind, ist nicht jedermanns Geschmack. Um sie zu erhalten, müssen die Daten beim Herunterfahren des Raspberry Pi auf die SD-Karte gespeichert werden und nach dem Start von der SD-Karte wieder in die Ramdisk geladen werden. Mit anderen Worten, wir müssen in die Boot- und Shutdown-Sequenz des Raspberry Pi eingreifen.

Dies ist mit einem init.d-Script realisierbar. Der Raspberry Pi hat, wie jedes Debian, die folgenden sogenannten Runlevel:

0       Halt, Shutdown
1       Wartungsbetrieb
2,3,4,5 Läuft!
6       Reboot

Beim Wechsel von z.B. 2 nach 0 (also ein Shutdown) müssen die Daten gesichert werden, beim Wechsel von 0 nach 2 müssen die Daten wieder in die Ramdisk eingelesen werden.

init.d-Scripte liegen im Verzeichnis /etc/init.d und gehören alle dem Benutzer root, also wechseln wir in dieses Verzeichnis und legen dort das folgende Script unter dem Namen ramdisk an:

#!/bin/sh -e
### BEGIN INIT INFO
# Provides:          ramdisk
# Required-Start:    $local_fs $named $syslog
# Required-Stop:     $local_fs $named $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Create ramdisk
# Description:       Create ramdisk
### END INIT INFO
 
RAMPFAD="/share"
RAMNAME="ramdisk"
RAMDISK=$RAMPFAD'/'$RAMNAME
SAVETAR=$RAMPFAD'/'$RAMNAME'_save.tar'
 
case "$1" in
start)
        [ -d $RAMPFAD ] || mkdir $RAMPFAD
        [ -d $RAMDISK ] || mkdir $RAMDISK
        /bin/mount -t ramfs ramfs $RAMDISK
        /bin/chmod 777 $RAMDISK
        /usr/bin/logger 'Ramdisk '$RAMDISK' created.'
        if [ -f $SAVETAR ]
        then
                logger 'Restoring ramdisk from '$SAVETAR
                cd $RAMPFAD
                /bin/tar xf $SAVETAR
                rm $SAVETAR
        fi
        ;;
 
stop)
        cd $RAMPFAD
        /bin/tar cf $SAVETAR $RAMNAME
        logger 'Saved ramdisk in '$SAVETAR
        ;;
 
*)
        echo "Usage: /etc/init.d/ramdisk {start|stop}"
        exit 1
        ;;
esac
 
exit 0

Nicht vergessen, die Attribute zu setzen

chmod 755 ramdisk

Dann müssen wir dem Raspberry Pi noch die Verwendung erklären

update-rc.d ramdisk defaults

Dadurch werden in den Verzeichnissen /etc/rc?.d Links auf das Script angelegt, damit das Script beim Starten und Herunterfahren des Raspberry Pi passend aufgerufen wird.

Das Script sichert beim Herunterfahren des Raspberry Pi den Inhalt der Ramdisk /share/ramdisk im tar-Archiv /share/ramdisk_save.tar. Das Verzeichnis /share sollte also noch auf der SD-Karte liegen und die SD-Karte sollte natürlich auch genügend Platz bieten. Beim Starten des Raspberry Pi wird - sofern vorhanden - dieses tar-Archiv wieder ausgepackt und danach gelöscht.

Der Kopf des Scripts ist für update-rc.d notwendig, dort werden die Abhängigkeiten zu anderen Diensten erklärt ("Dependency based boot sequencing") und aufgezählt, in welchen Runlevels das Script mit dem Parameter start (2,3,4,5) und in welchen Runlevels das Script mit dem Parameter stop (0,1,6) gerufen werden soll.

So, fertig, jetzt ist eine Ramdisk aktiv, die ihren Inhalt auch bei einem Reboot oder Shutdown nicht vergisst. Bei einem harten Absturz jedoch sind die Daten immer noch weg...

Kommentare und Meinungen sind herzlich willkommen, bitte via Twitter.

Impressum & Datenschutzerklärung