RAM Disk voll - No space left on device

Wenn die RAM-Disk voll ist, funktioniert das Webinterface von LoxBerry nicht mehr. Außerdem funktionieren wahrscheinlich auch Plugins nicht mehr korrekt. Dieser Artikel beschreibt die Vorgehensweise, um herauszufinden, was verursacht hat, dass die RAM-Disk voll ist.

Allgemeines

So sieht eine der Fehlermeldungen aus, wenn die RAM-Disk voll ist:

Software error:
HTML::Template::new() - Problem writing cache file /tmp/templatecache/37/ad42418549121b272142da1fb5b797 (file_cache => 1) : No space left on device at /opt/loxberry/webfrontend/htmlauth/system/plugininstall.cgi line 284.
Depending of what you have done, report this error to the plugin developer or the LoxBerry-Core team.
Further information you may find in the error logs.

Screenshot

Die Ordner und Dateien müssen nicht identisch sein - Indikator ist das No space left on device.

Kein Fehler eines Plugins

Eine derartige Fehlermeldung ist kein Fehler des verwendeten Plugins, bzw. kein Fehler der aufgerufenen Funktion von LoxBerry. Wenn die RAM-Disk voll ist, funktionieren Dinge einfach nicht mehr. Das ist unabhängig vom Plugin oder der aufgerufenen Funktion.

Ursachen für eine volle RAM-Disk

Um zu verstehen, wie die RAM-Disk voll werden kann, muss man wissen, wie LoxBerry die RAM-Disk verwendet:

  • Alle Log-Dateien von Plugins verwenden die RAM-Disk
  • Das Template-System von LoxBerry verwendet die RAM-Disk (vom Template-System kommt die Fehlermeldung oben)
  • Auch die normalen Linux-Logfiles werden am LoxBerry in der RAM-Disk abgelegt.
  • Die Betriebssystem-Ordner /tmp, /dev/shm und auch /var/log werden von LoxBerry in die RAM-Disk umgeleitet.

Die Log-Dateien der Plugins werden von LoxBerry anhand eines Algorithmus regelmäßig automatisch aufgeräumt. 

Der Template-Cache des Template-Systems ist so klein, dass er die RAM-Disk nicht belastet.

Hauptursache für volle RAM-Disk sind Logfiles in den System-Temp- und Log-Ordnern (/tmp und /var/log). Diese müssen nicht unmittelbar von LoxBerry oder den Plugins erzeugt sein!

Aus unserer Erfahrung sind die Haupturache für große Dateien in der RAM-Disk:

  • Ein Plugin installiert eine Drittapplikation (z.B. FHEM). Die Drittapplikation loggt sehr viel in die RAM-Disk und räumt das Log nie auf.
  • Ein Benutzer installiert selbst eine Applikation. Diese Applikation loggt in die RAM-Disk und räumt nie auf.
  • Dateien wurden zwar gelöscht, aber von der Applikation noch nicht freigegeben

Schnelle Abhilfe

Schnelle Abhilfe bei diesem Fehler schafft ein Reboot von LoxBerry. Die RAM-Disk wird durch den Reboot geleert, sodass danach wieder alles funktioniert.

Allerdings ist das nur Symptombekämpfung. Der Verursacher wird die RAM-Disk mit der Zeit wieder voll schreiben, bis LoxBerry nicht mehr funktioniert.

Deswegen ist ein Reboot nur sinnvoll, wenn es schnell gehen muss. 

Richtige Lösung - Verursacher suchen

Um den Verursacher zu finden, darf LoxBerry nicht unmittelbar vorher neu gestartet worden sein, sonst findet man die Dateien nicht.

Bitte melde dich zuerst mit Putty an der Shell an → Eine SSH-Verbindung mit putty aufbauen / Shell-Zugriff.

Mit su und der Passworteingabe machst du dich zum root-Benutzer (Administrator).

Prüfen des freien Speichers in der RAM-Disk

df -h /var/log

Das ist die Bestätigung, dass die RAM-Disk (ältere Pi's verwenden das Dateisystem tmpfs, neuere Pi's verwenden log2ram) voll ist.

Verschiedene Verzeichnisse auf deren Größe prüfen

Wir prüfen nun die Größe verschiedener Verzeichnisse, die die RAM-Disk benutzen:

  • du -h /tmp
  • du -h /opt/loxberry/log/plugins
  • du -h /opt/loxberry/log/system_tmpfs
  • du -h /var/log

Ausgegeben wird dabei jeweils die Größe (belegter Platz) jedes Unterverzeichnisses, und am Ende die Summe aller Verzeichnisse. 

In diesem Beispiel belegt das Unterverzeichnis mosquitto/ 103 MB. In Summe liegen im /var/log 194 MB. Die Größe der RAM-Disk ist jedoch nur 200 MB

→ In meinem Beispiel ist ein Verursacher der Mosquitto Broker

→ Nochmal etwa 91 MB liegen offenbar direkt im /var/log Verzeichnis (Differenz zwischen den 103 MB von Mosquitto und den 194 MB in Summe).

Um den Verzeichnisinhalt sortiert nach Größe auszugeben, funktioniert dieser Befehl:

  • ls -a -S -h -l /var/log

Hier sieht man, dass das daemon.log und daemon.log.1 sehr groß sind. Diese Logs würden normalerweise vom Dienst logrotate geleert, das hat aber (wahrscheinlich weil die RAM-Disk bereits zu voll war) nicht mehr funktioniert.

Gelöschte, offene Dateien aufspüren

Linux hat die Eigenheit, dass Dateien gelöscht werden können (und sie sind dann auch nicht mehr sichtbar), wenn aber die gelöschte Datei noch von einem Programm genutzt wird, bleibt die Datei noch vorhanden. Erst, wenn diese Applikation die Datei schließt, wird sie tatsächlich gelöscht.

Verwende diesen Befehl, um offene, gelöschte Dateien zu finden:

lsof -nP | grep '(deleted)'

Es erscheint eine Liste aller offenen, gelöschten Dateien:

Die vorletzte Zahl ist der belegte Speicher in Bytes (im Bild hat das gelöschte mosquitto.log 2146011 Bytes = ~2 MB). Die erste Spalte ist der Prozess, die letzte Spalte der Pfad der Datei. Damit kannst du meist auf die Applikation, den Dienst oder das Plugin schließen.

Um die Datei endgültig zu entfernen, musst du den entsprechenden Prozess stoppen.  

Fehler korrigieren

Mit den Tipps oben bist du jetzt soweit, dass du weißt, wer der Verursacher ist. Nun gilt es, ein erneutes Auftreten zu verhindern:

  • Wenn es sich um Logdateien von einer Applikation ist, die durch ein Plugin installiert wurde: 
    • Suche nach Einstellungen der Applikation bezüglich Logging, Verbose etc. in dessen Konfigurationsdatei. Schalte den Log-Output auf minimale Ausgabe oder komplett ab.
    • Gib dem Plugin-Autor Bescheid, dass er die Applikation evt. mit einer besseren Logging-Einstellung ausliefert.
  • Wenn es sich um Logdateien einer von dir installierten Applikation handelt:
    • Suche nach Einstellungen dieser Applikation, um das Logging zu reduzieren oder zu deaktivieren.
    • Wenn es eine Pfad-Einstellung in der Konfiguration gibt, kannst du evt. den Pfad an einen Ordner verschieben, der auf der SD-Karte liegt (nicht empfohlen).
  • Wenn es sich um andere Dateien (nicht Log-Dateien) handelt:
    • Im Falle eines Plugins: Frag beim Plugin-Autor nach, wie du die Größe oder den Pfad ändern kannst.
    • Im Falle einer selbst installierten Anwendung: Prüfe die Webseite der Applikation, ob es dafür Einstellungen gibt.
  • Wenn es sich um Dateien direkt von LoxBerry handelt: 
    • Bitte mach im Loxforum einem Thread auf und mach einen Screenshot, welche Dateien wo liegen mit deren Größe. Es könnte sich um einen Bug handeln.

Große Files löschen

Wenn es sich um Log-Dateien handelt, und du die Ursache gelöst hast, solltest du zum Löschen folgendermaßen vorgehen:

echo "File geleert" > /pfad/zur/datei/datei.log

Erst danach:

rm /pfad/zur/datei/datei.log

Hintergrund ist, dass die Applikationen oft die Logdateien offen halten. Wird das File direkt über rm gelöscht, bleibt die ursprüngliche Datei (unsichtbar) vorhanden, bis die Applikation beendet wurde. 

Mit dem echo hingegen schreiben wir in die bestehende Datei eine einzelne Zeile, was implizit die Datei leert. 

Abschließende Kontrolle:

df -h /var/log

Sollte der Platz dennoch nicht freigegeben werden, starte deinen LoxBerry neu.

Siehe auch