Die mit ** gekennzeichnete Links auf dieser Seite sind Affiliatelinks. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen.
Das Wichtigste an einer FHEM Installation ist das Backup bzw. Restore Konzept. Hierbei müssen unterschiedliche Bereich beachtet werden:
Für eine Offlinesicherung wird ggf. zusätzliche Hardware benötigt:
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.
In FHEM ist ein Backup-Mechanismus eingebaut. Diesen solltet Ihr vor dem eigentlichen Benutzen anpassen. Folgendes sollte hier angepasst werden:
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.
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.
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!
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 |
|
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 |
|
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. |
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