Hilfe! Mein FHEM funktioniert nicht!

Aus FHEMWiki

Diese Seite gibt beschreibt die Vorgehensweise bei der Fehlersuche mit fhem auf der Basis von Linux.

Anmelden am fhem-Server

In dieser Hilfeseite läuft fhem auf einem Linux-System, z.B. ein Raspberry Pi, ein ODROID oder ein Beaglebone. Auf diesem Computer läuft eine Variante von Linux für Einplatinencomputer.

Das Linux als Betriebssystem stellt meist einen ssh-Server (ein verschlüsselter Zugang zum System auf der Kommandozeilenebene von einem zweiten Rechner aus) und/oder eine Console (die Anmeldung erfolgt lokal am angeschlossenen Bildschirm und Tastatur) zur Verfügung.

Anmeldung via ssh (OS X/Linux)

Auf einem Mac- oder Linux-Computer wird ein Terminal gestartet (xterm, Terminal) und dort mittels ssh eine Verbindung zum fhem-Server aufgenommen:

 ssh <IP-Adresse fhem-Server> -l <useraccount>

hat der fhem-Server z.B. die IP-Adresse 192.168.1.22 und der Useraccount lautet pi lautet der Befehl

 ssh 192.168.1.22 -l pi

oder einfacher

 ssh pi@192.168.1.22

Sollte die Verbindung erfolgreich hergestellt werden, wird ein Paßwort erbeten. Danach steht die Kommandozeile auf dem fhem-Server zur Verfügung. Nur beim ersten Mal fragt ssh nach, ob der öffentliche Schlüssel des fhem-Servers gespeichert werden soll.

Anmeldung via ssh (Windows)

Windows kommt derzeit ohne ssh-Clienten, dieser muß daher zunächst installiert werden. Ein kostenloses, gutes Programm ist putty. Nach Download, Installation und Aufruf bietet putty eine graphische Oberfläche zur Verwaltung verschiedener ssh-Verbindungen.

Die IP-Adresse des fhem-Servers wird in das Feld Host Name (or IP address) eingegeben. Danach fragt ssh nach einem Benutzernamen (login as: ) und Paßwort.Für Raspberry PI Linux-Distributionen ist der Benutzername im Normallfall pi.

Nach erfolgreicher Eingabe der Informationen steht dann die Kommandozeile des fhem-Servers zur Verfügung und kann zur weiteren Fehlersuche genutzt werden:

Putty-ssh-login.png

Anmeldung an der Console

Sollte das Netzwerk des fhem-Servers nicht funktionieren oder dieser nicht erreichbar sein, bleibt nur die Anmeldung an der Console. Dazu wird ein Monitor und eine Tastatur am fhem-Server direkt angeschlossen (z.B. am HDMI-Port und am USB-Port).

Im Normalfall ist das Bild zunächst schwarz, da der Bildschirmschoner von Linux die Ausgabe deaktiviert. Mehrfaches drücken der Leertaste sollte eine Ausgabe im klassischen 80x25-Zeichenmodus oder in einer graphischen Oberfläche anzeigen.

Linux bietet mehrere virtuelle Consolen. Diese lassen sich mit

 CTRL-ALT-F1
 CTRL-ALT-F2

usw. bis zu

 CTRL-ALT-F6

wechseln. Auf der ersten Console (CTRL-ALT-F1) stehen meist interessante Ausgaben wie Logfiles oder Fehlermeldungen. Auf der 7. Console (CTRL-ALT-F7) läuft meist die graphische Oberfläche.

Für eine Fehlersuche wird eine Textconsole (CTRL-ALT-F2 bis CTRL-ALT-F6) empfohlen. An dieser kann sich mit Username und Paßwort angemeldet werden und danach steht eine Kommandozeile zur Verfügung.

root-Berechtigung erlangen

Nicht alle Befehle unter Linux sind für normale Benutzer (wie Anwender oder der pi-Benutzer) zugänglich oder können aufgerufen werden. Systemnahe Befehle, d.h. Befehle, die in die Grundfunktionen des Betriebssystemes konfigurieren oder umstellen, sind nur für den Nutzer root zugänglich.

root-Rechte erlangt man mit den Befehlen

 sudo -i

oder

 su -

je nach verwendeter Linux-Distribution.

Doch Vorsicht: Linux geht davon aus, daß der Anwender root sehr genau weiß, was er tut. Befehle werden ohne weitere Sicherheitsabfragen ausgeführt - auch die Formatierung der Speicherkarte, externer Laufwerke oder die Löschung aller Dateien. Es ist sehr einfach, durch ein Leerzeichen zuviel oder eines zu wenig einen großen Datenverlust zu erzeugen.

Aus diesem Grund wird dringend empfohlen, die ersten Analyseschritte nur als normaler Anwender (z.B. pi) zu erledigen und wenn der Fehler gefunden wurde, die Behebung mit sudo vorzunehmen. sudo verleiht nur temporär root-Rechte und erfordert für jedes Kommando die explizite Angabe von sudo.

Ein Beispiel: ein normaler User kann

 rm -rf /usr/*

nicht aufrufen. Dieser Befehl löscht alle Dateien im /usr-Verzeichnis, dort liegen die existenziell notwendigen Befehle für Linux. Nach Aufruf dieses Befehls ist die Linuxinstallation unwiderruflich defekt.

Der Nutzer root kann denselben Befehl ohne Sicherheitsabfrage aufrufen.

Der Nutzer pi kann den Befehl mit temporären root-Rechten

 sudo rm -rf /usr/*

aufrufen und benötigt für den Aufruf sein Paßwort.

Der erste Überblick

Nach erfolgreichem Anmelden an den fhem-Server wird sich zunächst ein Überblick verschafft. Dazu werden die Befehle pstree, ps und pgrep verwendet.

Läuft fhem bereits/noch

Dies läßt sich mit der Befehlskombination

  ps auxwww | grep fhem

ermitteln. Dies gibt alle laufenden Prozesse mitsamt ihren Aufrufparametern aus, die fhem im Namen haben. Das Ergebnis sollte in etwa so aussehen:

  os@fhem:~$ ps auxwww | grep fhem
  root       950  0.0  0.0  11364   804 ?        Sl   Apr13   8:36 /opt/fhem/hmland -d -l 127.0.0.1 -p 54321
  root     10972  1.9  2.5  57188 53476 ?        S    Apr20 237:10 perl fhem.pl fhem.cfg
  os       18793  0.0  0.0   1700   564 pts/0    S+   11:52   0:00 grep fhem

Hier sind drei Prozesse zu finden:

  1. fhem selbst (der Befehl perl fhem.pl fhem.cfg) mit seinen Parametern
  2. hmland - ein Prozeß, der den Homematic USB-Konfigurationsstick ansteuert
  3. grep fhem dies ist der Prozeß, der gerade auf der Kommandozeile zur Suche eingegeben wurde

Weiterhin ist ersichtlich: fhem läuft seit dem 20. April (9. Spalte) mit der Prozeß-ID 10972 (2. Spalte) mit root-Rechten (1. Spalte) und hat 237 Minuten und 10 Sekunden CPU-Zeit (10. Spalte) verbraucht, hmland läuft seit dem 13. April und hat 8 Minuten 36 Sekunden CPU-Zeit verbraucht.

Liefert das Kommando nur den grep Befehl zurück, wurden keine weiteren Treffer gefunden - d.h. fhem oder hmland laufen derzeit nicht.

Ist der Prozeßname bekannt, kann mittels pgrep auch gezielt nach der Prozeß-ID (des laufenden Prozesses) gesucht werden:

  pgrep apache2

zeigt die laufenden Prozeß-IDs, z.B.:

  os@fhem:~$ pgrep apache2
  1118
  12459
  12460
  13551
  13552
  13553
  13554
  13555

Die Prozeß-IDs können genutzt werden, um diese gezielt zu beenden. Dazu wird das blutrünstige Kommando kill mit der Prozeß-ID als Argument verwendet. So würde

  kill 12459

einen (!) der laufenden Apache2-Prozesse friedlich beenden. Friedlich bedeutet, daß dem Prozess die Möglichkeit gegeben wird, seine offenen Dateien zu schreiben und File-Descriptoren zu schliessen. Nicht immer reagiert jedoch ein Prozeß auf einen kill-Befehl - dann hilft das zusätzliche Argument -9, welches den Prozeß ohne weiteren Möglichkeiten sofort beendet. Dabei kann es zu Datei- und Datenverlust kommen:

 kill -9 12459

Sollen alle Prozesse beendet werden, ist es hilfreich, mit der kleinesten Prozeß-ID anzufangen - mit etwas Glück beendet der Hauptprozeß alle von ihm gestarteten Kind-Prozesse gleich mit.

Wie ist die Auslastung des fhem-Servers

Zur Ermittlung der Auslastung können die Befehle top und uptime verwendet werden. top wird dabei alle zwei Sekunden die Ausgabe aktualisieren und die Prozesse anzeigen, die gerade viel CPU-Zeit verbrennen, während uptime einmalig die Werte ausgibt:

  os@fhem:~$ uptime
   11:58:10 up 15 days, 16:33,  2 users,  load average: 0.09, 0.08, 0.12

Die Load Average wird in drei Werten angezeigt: 1-Minuten-Mittel, 5-Minuten-Mittel und 15-Minuten-Mittel. Eine Load von 1.0 indiziert das ein CPU-Kern zu 100% ausgelastet ist - kein sehr erstrebenswerter Zustand. In Abhängigkeit von der Hardware-Ausstattung des fhem-Servers sollte die 15-Minuten-Load immer unter 1.0 (z.B. Raspberry Pi A), immer unter 2.0 (Raspberry Pi B), immer unter 4.0 (ODROID U3 oder besser) liegen. Im Normalfall ist eine hohe Load etwas schlechtes, da das System langsam wird und schlecht reagiert.

Der Befehl top zeigt regelmäßig aktualisiert die Prozesse, die viel CPU-Zeit verbrauchen:

  top - 16:31:01 up 15 days, 21:06,  2 users,  load average: 0.19, 0.16, 0.14
  Tasks: 100 total,   1 running,  99 sleeping,   0 stopped,   0 zombie
  %Cpu(s):  0.2 us,  0.2 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
  KiB Mem:   2071648 total,   491784 used,  1579864 free,    16432 buffers
  KiB Swap:        0 total,        0 used,        0 free.   353932 cached Mem
  
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  10972 root      20   0   57188  53476   3256 S   1.3  2.6 242:13.52 perl
  22025 root      20   0       0      0      0 S   0.7  0.0   0:08.90 kworker/u:0
    950 root      20   0   11364    804    564 S   0.3  0.0   8:42.15 hmland
  22709 os        20   0    2552   1092    764 R   0.3  0.1   0:00.04 top
      1 root      20   0    3420   2028   1100 S   0.0  0.1   0:04.13 init
      2 root      20   0       0      0      0 S   0.0  0.0   0:00.15 kthreadd
      3 root      20   0       0      0      0 S   0.0  0.0   0:00.08 ksoftirqd/0
      5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:+
      7 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/u:+
      8 root      rt   0       0      0      0 S   0.0  0.0   0:00.50 migration/0
      9 root      20   0       0      0      0 S   0.0  0.0   0:07.98 rcu_preempt
     10 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh
     11 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_sched
     12 root      20   0       0      0      0 S   0.0  0.0   0:00.05 ksoftirqd/1
     13 root      rt   0       0      0      0 S   0.0  0.0   0:00.42 migration/1
     14 root      20   0       0      0      0 S   0.0  0.0   0:14.34 kworker/1:0
     15 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/1:+

In diesem Beispiel ist gut zu sehen, daß fhem (perl) die meiste Rechenzeit, aber nur 1.3% CPU und 2.6% Speicher benötigt.

Partitionen

Ein Linux-System verwendet in seinem Dateibaum (dieser startet mit /, der Wurzel) viele Unterverzeichnisse mit speziellen Aufgaben. Manche Unterverzeichnisse werden in Festplattenbereiche ausgelagert (eine Partition) oder im RAM abgebildet. Ein Überblick ist mit dem Befehl mount zu erhalten:

  os@fhem:~$ mount
  /dev/mmcblk0p2 on / type ext4 (rw)
  proc on /proc type proc (rw,noexec,nosuid,nodev)
  none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev)
  sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
  none on /sys/fs/cgroup type tmpfs (rw)
  none on /sys/kernel/debug type debugfs (rw)
  udev on /dev type devtmpfs (rw,mode=0755)
  devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
  tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
  none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
  none on /run/shm type tmpfs (rw,nosuid,nodev)
  none on /run/user type tmpfs (rw,noexec,nosuid,nodev,size=104857600,mode=0755)
  /dev/mmcblk0p1 on /media/boot type vfat (rw)
  systemd on /sys/fs/cgroup/systemd type cgroup (rw,noexec,nosuid,nodev,none,name=systemd)

Hier sind die Unterverzeichnisse wie /, /proc, /run, /dev usw. zu sehen, die verwendeten Dateisysteme (ext4, sysfs, tmpfs, devpts, vfat) und spezielle Berechtigungen (der Teil in den Klammern).

Nur Daten, die in Partitionen mit Dateisystemen ext2, ext3, ext4, vfat, fat oder exfat gespeichert werden, stehen nach einem Neustart wieder zur Verfügung. Partitionen mit den Dateisystemen tmpfs, devpts, sysfs werden beim Neustart neu angelegt und verlieren ihren Inhalt.

Kontrolle des Netzwerkes

Kontrolle der CUL-Definitionen

Kontrolle der Zugriffsberechtigungen

Kontrolle der Logfiles

Kontrolle der Festplatte

Backup einspielen