Mit Raspberry mögl. einfach ein zuverlässiges System

Begonnen von ujaudio, 13 Juni 2015, 16:11:21

Vorheriges Thema - Nächstes Thema

ujaudio

Ich habe mich entschlossen, mein Haus mit dem Raspberry zu automatisieren. Nun bin ich ab und zu auf Dienstreise und nach Murphy fällt genau dann etwas aus. Gut wenn man Vorsorge getroffen hat und die liebe Ehefrau das ganz allein wieder inbringt, nur aufgrund eines Telefongesprächs.
Mein Ansatz:
Irgendwann hat man ja mal alle Linux-Programme installiert und alle weiteren Änderungen liegen dann in /opt/fhem. Zu diesem Zeitpunkt kann man ein Image der SD erstellen und auf eine 2.SD bringen, die griffbereit neben dem Raspberry liegt.
Fällt nun die SD aus, kann man einfach den kleinen USB-Stromversorgungsstecker ziehen, die SD tauschen und wieder einstecken.
Vermutlich hat man aber in FHEM inzwischen etwas geändert. Also sollte per at regelmäßig gesichert werden - bei mir auf einen USB-Stick am Raspberry - und bei Power-on sollte dann /opt/fhem aktualisiert werden.
Im schlimmsten Fall tauscht man halt den ganzen Raspberry mit schon richtiger SD und steckt alles vom alten auf den neuen um, einschließlich des USB-Sticks.

Die Theorie hat meine liebe Ehefrau sofort begriffen, nun muss ich es umsetzen.
Image von SD habe ich erfolgreich gemacht:
SD vom Raspberry in einen USB-Adapter und an den Linux-PC angeschlossen

mit
blkid die SD identifiziert, bei mir sdb/dev/sdb1: LABEL="RECOVERY" UUID="D2D0-A9DC" TYPE="vfat"
/dev/sdb3: LABEL="SETTINGS" UUID="b2953f0a-dee7-452e-9443-85c034c463dc" TYPE="ext4"
/dev/sdb5: LABEL="BOOT" UUID="012D-34EC" TYPE="vfat"
/dev/sdb6: LABEL="root" UUID="80ac98e0-4a37-4154-8ccb-c6961c314f5e" TYPE="ext4"


mit
sudo dd if=/dev/sdb of=/home/user/MyImage
    ein Image erzeugt

    mit
sudo dd if=/home/user/MyImage of=/dev/sdb
    eine leere SD beschrieben

    Der Raspberry läuft mit beiden einwandfrei.

    Wenn ich mit über ssh auf dem Raspberry einlogge, dann kann ich ohne sudo(!) das Kommando
rsync -av /opt/fhem /media/usb/sync
absetzen und bekomme dort den aktuellen Inhalt. Wenn ich etwas ändere und das Kommando nochmals absetze, dann klappt das auch. Wenn ich aber aus FHEM heraus
{system("rsync -av /opt/fhem /media/usb/sync")} absetze, dann funktioniert das leider NICHT.

Hat jemand eine Idee, woran das liegt?

Weiterhin möchte ich beim shutdown von fhem ebenfalls sichern und beim start von fhem die Sicherung zurückspielen. Kann mir jemand einen Tipp geben wie ich das in das in die Befehle
sudo /etc/init.d/fhem start
sudo /etc/init.d/fhem stop

einbauen muss?
Einen lieben Gruß
Jürgen

jensb

#1
Hallo ujaudio,

das der rsync Befehl unter FHEM nicht klappt, kann daran liegen, dass FHEM als User fhem läuft und dann möglicherweise keine Zugriffsrechte auf das sync Verzeichnis hat. Beim "normalen" Anmelden an den PI bist du als User pi unterwegs und hast wahrscheinlich auch FHEM als solcher installiert. In diesem Fall könnte es helfen, fhem in die Gruppe pi aufzunehmen. Allerdings entsteht dadurch auch ein Sicherheitsproblem, da so die gesamte FHEM-Installation bei einem Angriff von außen manipuliert werden kann. Generell ist es problematisch Backup/Restore-Abläufe einer Anwendung über die Anwendung selbst abzuwickeln.

Ein besserer Ansatz ist das Runlevel-Script. Wenn du ein bisschen Shell-Programmierung nicht scheust, kann Du den rsync vor dem Start und nach dem Stop in das Skript /etc/init.d/fhem einbauen. Das ist auch nur eine Textdatei, die du mit einem Texteditor deiner Wahl bearbeiten kannst. Solange du den Befehl nicht von Bedingungen abhängig machen willst, musst du ihn nur an der richtigen Stelle einfügen. Orientiere dich an den Strings im Skript ('start', 'stop' und echo ...), dann findest du schnell die geeigneten Stellen. Ein Abschnitt in einer case-Anweisung beginnt mit dem Schlüsselwort (z.B. 'start') und geht bis zum nächsten Doppel-Semikolon. Zeilen die mit # anfangen sind nur Kommentare.

jensb
FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb

ujaudio

Danke Jensb,

das rsync Kommando werde ich mal in das start/stop einbauen. Dann müsste ich regelmäßig FHEM einen Restart machen lassen. Für das reine Backup wollte ich das gerne vermeiden. Vielleicht muss ich mich doch nochmals mit dem "sudoer" befassen und FHEM gezielt das rsync zulassen.
Einen lieben Gruß
Jürgen

jensb

Hallo ujaudio,

wenn du sudo verwenden willst, probier mal folgendes:


  • als User pi "sudo visudo"
  • in der letzen Zeile "fhem ALL= NOPASSWD:/usr/bin/rsync" einfügen
  • mit "Strg+X Y" speichern

Damit sind die Ausnahmen für fhem auf rsync beschränkt und du kannst das Backup regelmäßog aus FHEM heraus aufrufen, ohne neu starten zu müssen.

jensb
FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb

ujaudio

Danke für den Hinweis, habe ich gemacht und rsync funktioniert.
Die oben erwähnten
sudo /etc/init.d/fhem start
sudo /etc/init.d/fhem stop

werden aber beim FHEM-Befehl "shutdown restart" nicht ausgeführt, sondern nur bei Poweroff/on.

Wie kann ich das lösen?
Einen lieben Gruß
Jürgen

jensb

Hallo ujaudio,

beim Shutdown gibt es ein global notify, an das man sich dran hängen kann:

DoTrigger("global", "SHUTDOWN", 1);

Ähnliches gilt für den Startup:

DoTrigger("global", "INITIALIZED", 1);

Versuchs etwa so:

define ShutdownHook notify global:SHUTDOWN ....

Habe das selbst so noch nicht gebraucht. Hoffentlich klappt es bei dir.

jensb

 
FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb

ujaudio

Hallo,

prima das funktioniert, aber wie kann ich so etwas selbst herausfinden? Google findet nicht sehr viel zum Thema Dotrigger. Und das was ich nun gefunden habe, bringt mich nicht auf die richtige Spur.
Einen lieben Gruß
Jürgen

jensb

Hallo ujaudio,

es gibt u.a. die FHEM Wiki, die Commandref Dokumentation und - das ist das schöne an Open Source - den Quellcode. Ein HowTo für jedes Thema kann es leider nicht geben, aber dafür gibt es auch das Forum.

Wenn dich die Details hinter DoTrigger interessieren, schau in die Datei fhem.pl, dort wirst du die von mir erwähnten Trigger finden.

jensb
FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb

ujaudio

Ich geb's zu: den Quellcode habe ich mir noch nie angesehen.

Auf alle Fälle aber vielen Dank für deine Hinweise, die mir sehr geholfen haben.
Einen lieben Gruß
Jürgen

jensb

Hallo ujaudio,

war mir eine Freude zu helfen. Viel Spaß bei deinen Experimenten,

jensb
FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb

ujaudio

So, ich habe nun alles soweit am Laufen, aber eine Unsicherheit bleibt noch: ich kann das rsync-Kommando auch ausführen während FHEM läuft - es scheint alles bestens. Beim Ausschalten habe ich die /etc/init.d/fhem wie folgt geändert:
'stop')
       echo "Stopping fhem..."
       rsync -av /opt/fhem /media/usb0/sync
       perl fhem.pl $port "shutdown"
       RETVAL=$?

Damit wird zuerst das Backup gemacht und anschließend FHEM gestoppt, somit können ein paar letzte Änderungen durch FHEM verloren gehen. Dies sind:
log/eventTypes.txt
log/fhem-2015-06.log
log/fhem.save

Das erscheint mir unkritisch, sauber wäre aber die Reihenfolge umzudrehen.
'stop')
       echo "Stopping fhem..."
       rsync -av /opt/fhem /media/usb0/sync
       perl fhem.pl $port "shutdown"
       RETVAL=$?
       rsync -av /opt/fhem /media/usb0/sync

Wäre das so ok?
Einen lieben Gruß
Jürgen

jensb

#11
Hallo ujaudio,

ich verstehe nicht ganz, warum du das rsync beim Stop zweimal kurz hintereinander ausführen willst - wahrscheinlich hast du nur vergessen, den Aufruf vor dem Stop zu löschen.

Das rsync nach dem Shutdown von FHEM auszuführen, dürfte am besten sein, da dann im Normalfall alles konsistent ist.

Wichtig beim Backup ist meines Wissens nach vor allem die fhem.cfg und die fhem.save. Beide können mit save jederzeit von innerhalb FHEM gesichert werden. Letztere enthält den aktuellen Zustand der Readings und wird auch so gelegentlich aktualisert, zuletzt beim Shutdown. Wenn FHEM crasht, geht dann ein Teil des aktuellen Zustands verlohren. Ansonsten sollte man seine Messwertaufzeichnungen im log-Verzeichnis sichern. Die restliche Installation lässt sich aus dem Internet neu aufsetzten.

Mir ist es bei der Modul-Entwicklung schon einige Male passiert, dass FHEM die Konfiguration für ein fehlerhaftes Modul beim Starten aus der fhem.cfg gelöscht hat. Dann ist es gut, wenn man kurz vorher ein Backup gemacht hat. Ein Problem, das rsync allein nicht löst, ist eine Versionierung des Backups, gerade für die Konfigurationsdatei. Deshalb verwende ich bei bestimmten Dateien rsnapshot und bekomme so eine Änderungshistorie, die nach konfigurierbaren Regeln die alten Versionen irgendwann verwirft, damit nicht beliebig viel Platz benötigt wird.

jensb
FHEM 6.1 - RPi 4 Raspbian 12 + PiTFT - OPi Zero Armbian 5.35
EnOcean - (W)LAN/Firmata: BMP180, TSL2561, SHT21, Heatronic 3, OBIS - WLAN/ESP8266: Gardena 1251, Zirkulationspumpe - RTL433: Oregon - Bluetooth - MQTT
Contributions: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/jensb

ujaudio

Auf meinem Linux-Laptop verwende ich auch rsnapshot. Vielleicht werde ich es am Raspberry auch noch machen.
Einen lieben Gruß
Jürgen

Jorge3711

FHEM in allen Ehren, aber weshalb  du FHEM über die INIT-Scripte wie ein Karusell hoch und runterfährst nur um eine Sicherung zu bekommen erschließt sich mir nicht. Warum nicht ein hundsordinärer Cronjob und alles ist gut?

ujaudio

Um ehrlich zu sein: weil ich einfach nicht weiß, wie es geht. Ich versuche Linux so peu à peu zu begreifen. Auf meinem Laptop habe ich kaum etwas damit zu tun: Ubuntu installiert, Anwendungen wie Email und Bürosoftware - fertig. Die Datensicherung habe ich mit Mühe über rsnapshot hinbekommen.
Aber ich fahre FHEM gar nicht dauernd rauf und runter: normal läuft es non-stop. Ich will 1x täglich ein Backup von /opt/fhem machen und gut ist es. Beim Start von FHEM soll dieses das neueste Backup nutzen: Annahme SD-Karte geht kaputt, ich nehem eine neue, auf der vor x Monaten ein FHEM installiert wurde, stecke diese und schalte den Rspberry ein - dann soll das Backup verwndet werden. So meine Überlegung.
Dass ich beim Ausschalten ein Backup anlege hat damit zu tun, dass ich momentan teste, ob alles so tut wie es soll - und da bin ich noch nicht am Ziel. Einiges funktioniert noch nicht, aber ich will nicht alle meine Linux-Probleme hier im FHEM-Forum vorbringen.
Ich kann nur lernen...
Einen lieben Gruß
Jürgen