RAM Disk für Log Dateien

Begonnen von JOE80, 03 September 2013, 11:57:52

Vorheriges Thema - Nächstes Thema

JOE80

Hallo, und dies ist mein erster Beitrag :)

Bin seit einer Woche dabei den RPi + FHEM zu konfigurieren. Aktuell fehlen noch ein paar Teile und so beschäftige ich mich mit der Software.
Die im Wiki verlinkte Anleitung zur RAM Disk habe ich nach einer Stunde nicht zum laufen gebracht und dann werde ich meist ungeduldig :)
Also hier meine eigene (einfache) Lösung.

Zweck: FHEM Log Dateien in eine RAM Disk auslagern um die SD Karte zu schonen.

SDLog_to_RAMLog.sh
Sorgt im wesentlichen dafür eine RAM Disk zu erstellen und die bisherigen Log Dateien verfügbar
zu machen. Muss vor dem Start von FHEM aufgerufen werden. Dazu ist es nötig das Skript in die
/etc/init.d/fhem einzubinden.

RAMLog_to_SDLog.sh
Sorgt dafür das die Log Dateien in der RAM Disk wieder zurück auf die SD Karte geschrieben
werden. Sonst sind die Log Dateien nach einem reboot weg! Muss nach dem Beenden von FHEM
aufgerufen werden. Dazu ist es nötig das Skript in die /etc/init.d/fhem einzubinden.

Jede Zeile im Skript ist kommentiert bzw. wird ausgegeben.

--- Installation ---
Bitte zuerst ein Backup der SD Karte erstellen (z.B. win32diskimager)

Konsole öffnen/ mit RPi verbinden (z.B. PUTTY)
Die Skripte nach /opt/fhem/ kopieren und danach mit 'chmod' ausführbar machen:
sudo chmod +x /opt/fhem/SDLog_to_RAMLog.sh
sudo chmod +x /opt/fhem/RAMLog_to_SDLog.sh

Einmalig folgendes Verzeichnis anlegen. Es dient zukünftig als Zwischenspeicher.
sudo mkdir /opt/fhem/log_tmp
Zur Sicherheit wird jetzt FHEM beendet
sudo perl /opt/fhem/fhem.pl 7072 "shutdown"
...und einen Probelauf durchgeführt
sudo sh /opt/fhem/SDLog_to_RAMLog.sh
...sollte ohne Fehlermeldung laufen!
Der Befehl 'mount' listet alle verbundenen Dateisystem auf.
Ein Eintrag wie folgt sollte dabei sein. Unsere RAM-Disk :)
none on /opt/fhem/log type tmpfs (rw,relatime,size=102400k)
Mit dem zweiten Skript wird die RAM-Disk wieder entfernt und alle Log Dateien auf der SD Karte aktualisiert.
sudo sh /opt/fhem/RAMLog_to_SDLog.sh
'mount' sollte jetzt die RAM-Disk nicht mehr anzeigen!

Einbinden in /etc/init.d/fhem (Die Angehängte 'fhem' Datei dient als Beispiel, nicht blind kopieren!)
sudo nano /etc/init.d/fhem
1. Im Block 'start' vor der Zeile mit 'perl fhem.pl fhem.cfg' den Skript Aufruf einfügen
/opt/fhem/SDLog_to_RAMLog.sh

2. Im Block 'stop' nach der Zeile 'perl fhem.pl $port "shutdown"' den Skript Aufruf einfügen
/opt/fhem/RAMLog_to_SDLog.sh

Speichern und neu starten.
sudo reboot
Keine Ahnung wie groß das Log Verzeichnis werden kann. Die RAM Disk darf bis zu 100 MB groß werden. Sinnvoll wäre noch ein Archiv-Skript das Log Dateien älter als 2 Monate archiviert. Das mache ich dann in 2 Monaten :)

betateilchen

und was machst Du bei Stromausfall oder bei einem Absturz des Raspberry?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

JOE80

Das ist ein guter Hinweis.

Stromausfall
Da ist der RPi etwas empfindlich. Ich kenne das von meinem Mediacenter raspbmc. Einmal aus versehen die Steckdosenleiste ausgeschaltet und schon ist das Dateisystem zerstört. Hier hilft vielleicht eine solche Powerbank als USV.

Log erhalten
a) RPi einmal pro Tag neu starten (z.B. Cron)
sudo crontab -e
und am Ende die Zeile eintragen damit der RPi um 4 Uhr morgens einen Neustart durchführt:
0 4 * * * root /sbin/reboot

b) in bestimmten Intervallen Log Dateien in Backup Verzeichnis sichern

c) Stündlich das Verzeichnis '/opt/fhem/log' auf der SD Karte mit den aktuellen Log Dateien aus dem RAM Laufwerk beschreiben. Das wäre mir am liebsten. Weiß einer wie ich an das Verzeichnis auf der SD Karte ran komme? Das Verzeichnis '/opt/fhem/log' zeigt auf die RAM Disk wenn diese aktiv ist. Ich denke das Stichwort heißt hier Hardlink. Werde das in den nächsten Tagen ausprobieren und berichten.


justme1968

hardlinks sind nicht filesystem übergreifend möglich und helfen dir hier nicht weiter.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

fh168

Hallo,

schön beschrieben alles, danke!
Wäre es nicht möglich, alles sofort in die Cloud zu schubsen (hidrive, dropbox, NAS-Cloud etc.?). Ansonsten habe ich das mit einer anderen Powerbank genauso gemacht. Ist zwar nicht so gesund den Akku als USV zu benutzen, klappt aber.

Robin
Hue, Lacrosse, PCA301, MySensors, V 1.67 CUL 868 V3.4, Lacrosse-WLAN-Gateway, Tasmota RF-

Lupla

Das ist echt witzig. Genau zu diesem Thema habe ich mir aktuell Gedanken gemacht, da mir vermutlich durch die vielen Schreibvorgänge eine SD-Karte im RPi gestorben ist. (Und das Backup war leider schon zweieinhalb Wochen alt)

Meine Suche nach diesem Thema stieß auf zwei relevante Ergebnisse. Dieses Thema im Forum und der folgender Wiki-Eintrag: RAMDisk.
Eventuell funktioniert das entsprechend angepasste Skript von Dr. Boris Neubert auch auf dem RPi.

fh168

Hallo,

vielleicht ne blöde Frage am Freitag morgen, aber woran sehe ich denn das Fhem die Logs auf die RAM-Disk schreibt? Wenn ich mit Midnight Commander auf /opt/fhem/log gehe, sehe ich immer noch die voranschreitenden Logs in dem Verzeichnis. Das log_tmp ist zwar angelegt, aber leer. Ich hätte so gedacht, das ich irgendwie eine "virtuelle Festplatte" sehe und dort die Log-Dateien.

Robin
Hue, Lacrosse, PCA301, MySensors, V 1.67 CUL 868 V3.4, Lacrosse-WLAN-Gateway, Tasmota RF-

JOE80

Mit dem Befehl mount kannst du sehen ob eine tmpfs angelegt wurde.
Da müsste so etwas stehen:
none on /opt/fhem/log type tmpfs (rw,relatime,size=102400k)

Das log_tmp dient nur als Zwischenspeicher beim anlegen der RAM Disk und ist in der Regel leer.

Aber irgendwie bezweifle ich das mit der RAM Disk die SD Karte wirklich geschont wird. Die Daten werden so oder so auf die SD Karte gespeichert. Log-Daten sind ja Daten die ständig _wachsen_ und sich nicht in sich selbst verändern (im Gegensatz zu Caches).

Ob nun die ganzen Bytes Stück für Stück auf die SD Karte geschrieben werden (ohne tmpfs) oder alle Stunde lang in einem Rutsch...

Wie seht ihr das?

fh168

Hallo,
yep, mount steht hier. Wenn ich das Wort Ramdisk richtig verstehe, dann werden im RAM (also nicht auf der SD) die Daten gepuffert. Der Großteil der Schreibzugriffe findet also auf dem RAM-Chip statt. Nur warum wachsen die "normalen" logs denn noch wenn ich sie mit dem midnight commander aufrufe. Die müssten doch bis ich die Daten aus dem RAM zurückschreibe eine altes Datum haben.

robin
Hue, Lacrosse, PCA301, MySensors, V 1.67 CUL 868 V3.4, Lacrosse-WLAN-Gateway, Tasmota RF-

rudolfkoenig

FileLog in FHEM 5.3 hat nach jede Zeile ein sync der Datei ausgeloest, 5.4 erst nach eine Event-Gruppe (was haeufig das Gleiche ist), und aktuell (seit 06-06) ist sync in FileLog komplett abgeschaltet, um Flash zu schonen.

Damit gehen evtl. Logdaten verloren, falls man den Stecker vom RPi zieht, nicht aber, wenn "nur" FHEM abstuerzt. Das Schreiben der Daten auf die Platte wird damit komplett Linux ueberlassen, und das kann man relativ detailliert (Stichwort z.Bsp. laptop-mode) steuern.
Ich wuerde diese Einstellungen einem RAM-Disk vorziehen.

betateilchen

Zitat von: rudolfkoenig schrieb am Fr, 06 September 2013 14:26Das Schreiben der Daten auf die Platte wird damit komplett Linux ueberlassen, und das kann man relativ detailliert (Stichwort z.Bsp. laptop-mode) steuern.
Ich wuerde diese Einstellungen einem RAM-Disk vorziehen.

Genau darauf wollte ich hinaus. Eine Notwendigkeit für eine Ramdisk kann ich nicht erkennen. Wers nicht glaubt, sollte einfach mal einen USB-Stick mit Kontroll-LED anstecken und die Logs dorthin schreiben lassen. Da passiert nämlich erstaunlich wenig.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!