Inhaltsverzeichnis

Das Wichtigste an einer FHEM Installation ist das Backup bzw. Restore Konzept. Hierbei müssen unterschiedliche Bereich beachtet werden:

  1. Tägliches Backup der FHEM Konfiguration
  2. Komplettsicherung Offline

Für eine Offlinesicherung wird ggf. zusätzliche Hardware benötigt:

Backupverzeichnis

Standardmäßig werden die Backups auf der lokalen FHEM Installation abgelegt. Damit Ihr im Fehlerfall aber noch Zugriff auf die Backups habt sollten diese auf einem Netzwerkshare gelegt werden. Aus diesem Grund empfehle ich Euch das Einbinden eines Netzwerkshars. Hier habe ich Euch zwei Anleitungen dazu:

Im ersten Schritt legt Ihr Euch auf dem Raspberry ein neues Verzeichnis an. Hierfür folgenden Befehl in einer SSH Sitzung ausführen:

sudo mkdir /mnt/backup

Windows CIFS einbinden

Um einen Windows Netzwerkshare einzubinden, müsst Ihr folgenden Eintrag an das Ende der Datei "/etc/fstab" setzen.

//IP-AdresseWinndows/freigabe /mnt/backup cifs noauto,x-systemd.automount,username=admin,password=geheim,domain=home,iocharset=utf8,uid=fhem,gid=dialout 0 0

Hier müsst Ihr natürlich Eure Angaben entsprechend abändern. Die Angabe der "domain=" müsst Ihr nur dann angeben, wenn der Share auf einem Windows Domain Server liegt. Nach dem Ändern der Datei müsst Ihr Euren Raspberry neu starten. Erst danach werden die Änderungen aktiv.

Linux NFS einbinden

Um einen Linux Netzwerkshare einzubinden, müsst Ihr folgenden Eintrag an das Ende der Datei "/etc/fstab" setzen.

IP-AdresseNFSServer:/freigabe /mnt/backup nfs noauto,x-systemd.automount,rw,rsize=8192,wsize=8192,uid=fhem,gid=dialout 0 0

Hier müsst Ihr natürlich Eure Angaben entsprechend abändern. Nach dem Ändern der Datei müsst Ihr Euren Raspberry neu starten. Erst danach werden die Änderungen aktiv.

FHEM - Vorbereitungen

In FHEM ist ein Backup-Mechanismus eingebaut. Diesen solltet Ihr vor dem eigentlichen Benutzen anpassen. Folgendes sollte hier angepasst werden:

  • Zentrales Backupverzeichnis festlegen
  • Max. Restore Verzeichnisse
  • Sonstiges

Jedes FHEM Update erzeugt im Verzeichnis "../opt/fhem/restoreDir" ein Verzeichnis in welchem sich dann alle Dateien befinden, welche beim Update Prozess überschrieben wurden.

 

Hier wird ein Verzeichnis mit dem Datum des Updates angelegt. Standardmäßig werden hier max. 3 Verzeichnisse aufgehoben.

 

Über folgendes Attribut kann dieser Wert angehoben werden:

attr global restoreDirs 10

Um das zentrale Backupverzeichnis auf den Netzwerkshare zu legen, muss noch folgendes Attribut angepasst werden.

attr global backupdir /mnt/backup

Damit FHEM automatisch vor jedem Update ein Vollbackup erstellt, muss noch folgendes Attribut gesetzt werden:

attr global backup_before_update 1

 

Nach den Änderungen muss die Konfiguration noch gespeichert werden.

FHEM - Integriertes Backup

In FHEM ist ein einer Backup-Mechanismus eingebaut. Diesen kann man durch Eingabe des Befehls "backup" in die Command-Box starten.

 

Direkt nach dem Bestätigen des Befehls startet FHEM mit dem Backup. 

 

Im Log ist dann später folgender Eintrag zu sehen:

 

Hier erkennt Ihr auch gleich, dass das Backup in dem neuen Verzeichnis "/mnt/backup" landet.

FHEM - Automatisches Backup

Damit der FHEM Server das Backup automatisch erstellt, müsst Ihr hierfür ein FHEM Device anlegen. Mit folgendem Befehl könnt Ihr das automatische Backup anlegen:

define FHEM.Backup at *23:59:00 backup
attr FHEM.Backup room ZZ_FHEM
attr FHEM.Backup group Backup

 

Als Ergebnis bekommt Ihr ein Device, mit dem jede Nacht um 23:59 ein Backup der FHEM Installation erstellt wird.

 

Speichern nicht vergessen!

FHEM - Backupanzahl beschränken

Leider gibt es innerhalb von FHEM keine Möglichkeit die Anzahl der vorgehaltenen Backups zu beschränken. Damit die Backupanzahl trotzdem beschränkt werden kann, müsst Ihr ein Notify Device anlegen. Über diese kann dann die Backupanzahl beschränkt werden. Mit folgendem Befehl könnt Ihr das Notify dafür anlegen:

define FHEM.Backup.Count notify global:backup.done {}
attr FHEM.Backup.Count room ZZ_FHEM
attr FHEM.Backup.Count group Backup

Als Ergebnis bekommt Ihr ein Device, mit dem jede Nacht um 23:59 die Backupanzahl begrenzt.

 

Speichern nicht vergessen!

Damit das neu Notify Device auch etwas tun kann, müsst Ihr den Bereich DEF noch abändern. Hierfür könnt Ihr folgendes Skript verwenden:

global:backup.done {
        # Backup Variablen definieren
        my $BackupDir      = AttrVal("global", "backupdir", "/mnt/gibtesnicht");
        my $BackupReading  = "FHEM.Backup";
        my $BackupMax      = 10;
        my $BackupLog      = 1;
        my $BackupDel      = 1;
        
        Log3 "FHEM.Backup", 3, "FHEM.Backup Backup Verzeichnis = $BackupDir" if ($BackupLog == 1);
        
        opendir (DIR, $BackupDir) or die $!;
        
        # Daten sortieren
        my @files = sort { $b cmp $a } readdir(DIR);

        closedir(DIR);

        my $BackupCount = 0;    
        while (my $file = shift @files) {
                if ($file ne "." && $file ne "..") {
                        $BackupCount++;
                        Log3 "FHEM.Backup", 3, "FHEM.Backup [" . sprintf("%02d",$BackupCount). "] gefundenes Backup = $file" if ($BackupLog == 1);
                        fhem ("setreading $BackupReading found_backup_". sprintf("%02d",$BackupCount). " " . $file);
                        if ($BackupCount > $BackupMax) {
                                Log3 "FHEM.Backup", 3, "FHEM.Backup [" . sprintf("%02d",$BackupCount). "] Backup = $file LÖSCHEN" if ($BackupLog == 1);
                                unlink ($BackupDir . "/" . $file)  or die $! if ($BackupDel == 1);
                                fhem ("setreading $BackupReading delete_backup " . $file);
                        }                       
                }
    }
}

 

Das Ergebnis sollte dann ungefähr so aussehen.

Damit das Skript auch aktiv was ausführt, müsst Ihr im oberen Bereich die Variablen anpassen. Folgende Konfiguration ist hier möglich:

Name Mögliche Werte Beschreibung
$BackupDir [STRING]

Hier sollte nichts angepasst werden. Das Backupverzeichnis wird direkt auf dem FHEM Device "global" ausgelesen. Eine Anpassung ist nur dann nötig, wenn Ihr nicht die Anleitung von mir benutzt habt.

$BackupReadings [STRING]

Hier könnt Ihr das FHEM Device angeben, in welchem die gefundenen und das gelöschte Backup als Reading abgelegt wird. Eine Anpassung ist nur dann nötig, wenn Ihr nicht die Anleitung von mir benutzt habt.

$BackupMax [NUMERIC]

Hier könnt Ihr die maximale Anzahl der Backups definieren, welche vorgehalten werden sollen. 

$BackupLog
  • 0
  • 1

Hier kann das Erstellen von LOG Einträgen aktiviert werden. Gerade in der Einführungsphase ist es ggf. Interessant was das Skript alles gefunden bzw. gelöscht hat.

 

$BackupDel

  • 0
  • 1
Hier kann das Löschen der Backups aktiviert werden. Wenn dieser Wert auf "0" gesetzt wurde, werden keine Backupdateien gelöscht. Damit ist es möglich das Skript erst mal laufen zu lassen, ohne gleich Daten zu löschen. Im Log könnt Ihr dann schauen, welche Dateien das Skript gelöscht hätte.

Das Skript legt bei jeder Ausführung diverse Readings an. Folgende Readings gibt es hier aktuell:

Name Mögliche Werte Beschreibung
delete_backup [STRING]

Hier wird die zuletzt gelöschte Backupdatei angezeigt. 

found_backup_XX [STRING]

Hier wird jede gefundene Backupdatei angezeigt. Der Bereich "XX" wird immer durch eine zweistellige Nummer ersetzt.

Backup - Offline

Vor größeren Konfigurationsänderungen, welche z.B. Installation von Debian Paketen erfordern, würde ich Euch empfehlen eine Sicherung zu erstellen. Damit  Ihr eine Offlinesicherung durchführen könnt, benötigt Ihr einen zweiten Raspberry oder eine weitere SD Karte mit einem installierten Raspbian, mit welcher Ihr dann Euren Raspberry neu starten könnt. Die SD-Karte, welche Ihr sichern wollt, muss wird dann über einen SD Kartenleser am USB Port anschließen.

 

Damit Ihr ein Backup ausführen könnt, müsst Ihr zuerst herausfinden, auf welcher Partition die Daten liegen. Hierfür führt Ihr folgenden Befehl aus:

lsblk
sudo dd if=/dev/sda of=/mnt/backup/20171225.img

Leider sieht man beim Erstellen des Backups keinen Fortschrittsbalken oder ähnliches. Ihr könnt aber über eine zweite SSH Verbindung zum Raspberry folgenden Befehl ansenden:

sudo pkill -USR1 -x dd

In der ersten SSH Verbindung wird dann kurz angezeigt, wie weit der Prozess schon ist.


Die Dauer des kompletten Vorgangs hängt von der Größe der SD Karte ab. Bei einer 16GB großen SD Karte sollte es nicht länger als 15 Minuten dauern.

Kommentar schreiben

Kommentare: 0