RAM Datenbank erstellen – Raspberry Pi
Wie sich eine RAM Datenbank einrichten und automatisch sichern lässt.
Gerade bei Einplatinencomputern wie dem Raspberry Pi muss man mit Schreibvorgängen auf dem Flash-Speicher sparsam umgehen. Da die Schreibzyklen begrenzt sind, sollte man sehr schreibintensive Aktivitäten in den RAM auslagern. Natürlich macht das nur für spezielle Anwendungsfälle Sinn, denn bei einem Absturz gehen die Daten verloren. Ich verwende das Ganze um I/O Zustände der Hausautomation und minütliche Temperaturwerte der letzten 24h zu speichern. Hier werden besonders oft die Daten überschrieben und keine relevanten Daten können verloren gehen. Wenn es nicht gerade zu einem Stromausfall kommt, sind die Daten allerdings kaum in Gefahr. Ich hatte zumindest bisher keinen Ausfall. Mit einer USV könnte man sogar diesen Fall absichern.
Ich beschreibe das Ganze anhand einer SQLite3 Datenbank, da diese aus einer einzelnen Datei besteht und deshalb sehr leicht gesichert werden kann.
RAM Datenbank einrichten
Als Erstes müssen wir ein Verzeichnis für das RAM-Laufwerk anlegen.
1 |
sudo mkdir /ramdisk |
Dann öffnen wir die fstab (file system table).
1 |
sudo nano /etc/fstab |
und fügen folgende Zeile ein, um den Speicher zuzuweisen.
1 |
tmpfs /ramdisk tmpfs nodev,nosuid,relatime,size=100M 0 0 |
Mit einem Neustart ist der RAM-Speicher schon eingerichtet. Die Größe von 100MB kann natürlich beliebig angepasst werden.
Nun brauchen wir noch einen Service, der beim Herunterfahren die Datenbank sichert und nach dem Hochfahren wieder in das RAM-Laufwerk kopiert. Hier müssen wir besonders mit den Dateirechten aufpassen. Unter Umständen können diese je nach Verwendung von meiner Beschreibung abweichen.
Das Thema Services (Daemons) ist relativ komplex. Wer sich dafür genauer interessiert, sollte sich allgemein in das Thema einlesen.
Für den Service erstellen wir eine Datei im Verzeichnis /etc/init.d
1 |
sudo nano /etc/init.d/ramdisk |
Wie die Datei/der Service heißt ist prinzipiell frei wählbar. Die Verzeichnisse, der Name der DB usw. müssen natürlich in der Service Datei angepasst werden. Wichtig ist es den Header nicht zu entfernen. Dieser beschreibt unseren Service und legt unter anderem fest, wann der Service ausgeführt wird.
Bei den Befehlen zum Kopieren sind wie schon erwähnt die Dateirechte zu beachten.
Ich lasse hier den User Pi die Datei kopieren, das heißt, der Besitzer ist danach auch der User Pi.
Die Dateirechte werden allerdings nicht mitkopiert, deshalb müssen diese nach dem kopieren neu gesetzt werden.
Da der Zugriff auf die Datenbank normalerweise vom User www-data kommt, müssen die Dateirechte auf mindestens 644 gesetzt, also schreiben für Gruppe erlaubt sein. Dazu muss der User Pi natürlich der Gruppe www-data zugehören. Das ist bei einem Webserver aber ohnehin sinnvoll.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#!/bin/sh ### BEGIN INIT INFO # Provides: run on shutdown # Required-Start: $all # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: saves RAM on USB STICK # Description: ### END INIT INFO do_start() { su - pi -c "cp /media/usbstick/mysqlitedb.db /ramdisk" sync chmod 664 /ramdisk/mysqlitedb.db } do_stop () { su - pi -c "cp /ramdisk/mysqlitedb.db /media/usbstick" sync } case "$1" in start) do_start ;; restart|reload|force-reload) echo "Error: argument '$1' not supported" >&2 exit 3 ;; stop) do_stop ;; status) exit 0 ;; *) echo "Usage: $0 start|stop" >&2 exit 3 ;; esac exit 0 |
Die Datei müssen wir nun noch ausführbar machen und den Service initialisieren.
1 2 3 |
sudo chmod +x /etc/init.d/ramdisk sudo update-rc.d ramdisk defaults |
Wenn hier kein Fehler auftritt sollte der Service ab sofort die RAM Datenbank wie gewünscht sichern und beim Hochfahren zurück in den RAM-Speicher kopieren.