Nächtliche Sicherung der Haussteuerung auf ein Netzlaufwerk
Nachdem ich meine Hausautomatisierung FHEM seit ziemlich genau drei Jahren auf einem Raspberry Pi der ersten Generation laufen hatte, fing das System plötzlich an, komische Dinge zu machen. Manchmal funktionierte beim Restart ein Hilfsmodul nicht mehr, und irgendwann wurde die zentrale Konfigurationsdatei fhem.cfg
beim Speichern zerstört. Nächtliche Sicherungen hatte ich noch nicht eingerichtet.
Meine letzte manuelle Sicherung lag Monate zurück, und ausgerechnet in diesem Zeitraum hatte ich umfangreiche Umbauarbeiten an meiner Hausautomatisierung vorgenommen.
Was war passiert? Die am meisten beanspruchte Komponente eines Raspberry Pi ist die Speicherkarte. Nachdem der Raspberry die Speicherkarte wie eine Festplatte benutzt, passieren alle Lese- und Schreibvorgänge auf der Speicherkarte. Ausserdem schreibt die Haussteuerung auch ständig in Logfiles. Irgendwann ist der Lebenszyklus einer Speicherkarte erreicht und sie muss ausgetauscht werden.
Welche Hardware für die Sicherung?
In der Standardkonfiguration erstellt FHEM im Unterverzeichnis /backup eine Sicherung in Form eines Archivfiles. Dementsprechend wird das Archivfile ebenso unzugänglich, wenn die Speicherkarte seinen Dienst quittiert. Folglich sollte das Backup auf einer externen Hardware erfolgen.
Man könnte natürlich an den Raspberry eine kleine externe USB-Festplatte hängen, nur würde diese am Raspberry ständig laufen. Die besser Wahl ist hier ein NAS (network attached storage). Diese Geräte sind meistens ausfallsicher konfiguriert und haben ein Powermanagement, bei dem sich das Gerät bei Nichtbenutzung in standby abschaltet.
Hardwareempfehlung
Grundsätzlich funktioniert jedes NAS ähnlich. Aufgrund der weiten Verbreitung und der guten Verfügbarkeit von Softwarepaketen und deren einfachen Wartbarkeit habe ich mich für eine Synology entschieden. Ferner sollte es ein Modell sein, das mindestens zwei Festplatten beinhaltet und das System als RAID-1 oder SHR (Synology Hybrid RAID) konfiguriert sein.
Ich habe mich für folgendes NAS entschieden:
Ferner betreibe ich das NAS mit zwei NAS Festplatten:
Wichtig ist in diesem Zusammenhang, spezielle Festplatten zu wählen, die sowohl für den Dauereinsatz geeignet sind als auch eine geringe Geräuschentwicklung aufweisen.
Vorbereitung des NAS
Zuerst legen wir in der Systemsteuerung des Synology ein neues Verzeichnis fhembackup an. Dazu klicken wir in der Systemsteuerung auf „Gemeinsamer Ordner“ tragen Name und Beschreibung ein und klicken auf OK
und tragen in den Berechtigungen den admin und die entsprechenden Benutzer mit Lese/Schreiben-Recht ein.
Danach wechseln wir auf den Reiter „NFS-Berechtigungen„. Wenn dort die Meldung kommt, dass der NFS-Dienst nicht aktiviert sei, müssen wir uns zuerst darum kümmern.
Dazu gehen wir in der Systemsteuerung in den Reiter „Dateidienste“ und scrollen dort unter „Win/Mac/NFS“ ganz nach unten und setzen den Haken bei „NFS aktivieren“
Weiters kehren wir zurück zum neu angelegten Ordner fhembackup
und tragen unter NFS-Berechtigungen den IP-Namen und/oder IP-Adresse unseres Raspberry Pi ein.
Ich habe hier zwei bis auf den Namen identische Einträge für den Raspberry Pi erstellt, da es manchmal nach dem Booten einer der beiden Komponenten Timingprobleme gab und der Raspberry Pi nicht unter seinem IP-Namen, sondern nur unter seiner IP-Adresse bekannt war.
Mit diesen Einstellungen können wir nun das neu angelegte Verzeichnis per NFS-Zugriff direkt vom Raspberry Pi verbinden. Somit ist das NAS für die nächtliche Sicherung vorbereitet.
Vorbereitung des Raspberry Pi
Zuerst müssen am Raspberry Pi einige Pakete nachinstalliert werden, sofern noch nicht geschehen.
sudo apt-get install autofs sudo apt-get install autofs5
Weiters sollten wir uns überlegen, wo wir das Netzwerkverzeichnis des Synology NAS in das Filesystem einhängen. Ich habe mich entschieden, im Verzeichnis /mnt einen Unterordner syno
anzulegen und das Netzwerkverzeichnis fhembackup
dorthin zu mounten.
Dafür erstellen wir mit
sudo mkdir /mnt/syno sudo chmod 777 /mnt/syno
das Unterverzeichnis /mnt/syno
und sorgen dafür, dass es für jeden Benutzer erst einmal erreichbar wird. Zumal läuft unsere Hausautomatisierungssoftware FHEM unter dem User fhem
, und dieser muss natürlich das Recht erhalten, seine nächtliche Sicherung auf dem Netzlaufwerk vorzunehmen. Weiter müssen wir noch eine Konfigurationsdatei für den eben installierten Automounter erzeugen und zur Verfügung stellen. Dazu legen wir in /etc
ein Verzeichnis autofs
sudo mkdir /etc/autofs
an und erzeugen eine neue Konfigurationsdatei auto.synology in diesem Verzeichnis und editieren diese mit sudo nano /etc/autofs/auto.synology
wie folgt:
fhembackup -fstype=nfs,rw,nouser,atime,auto,dev,exec,suid spock:/volume1/fhembackup
Mein NAS heißt spock, dementsprechend bitte hier den richtigen Namen eintragen!
Weiterhin müssen wir jetzt noch in der Datei /etc/auto.master
den Pfad angeben, in dem wir ganz unten in der Datei mithilfe von sudo nano /etc/auto.master
folgende Zeile anfügen:
/mnt/syno /etc/autofs/auto.synology --ghost, --timeout=60
Nun wäre die Konfiguration bereits abgeschlossen und wir müssen eigentlich nur noch den Automounter neu starten. Dies machen wir mit beiden Kommandos
sudo service autofs restart sudo service rpcbind restart
Folglich sollten wir schon auf das Sicherungsverzeichnis auf dem NAS zugreifen können:
Bei dem einzigen Eintrag, dem Verzeichnis @eaDir
handelt es sich um ein internes Verzeichnis, welches das NAS für die Verwaltung benutzt. Dieses müssen wir später bei unserem Backupalgorithmus ausschließen. Falls es aber wie hier zu sehen ist, haben wir alles richtig gemacht, auf einige NAS wird dieses Verwaltungsverzeichnis allerdings nicht dargestellt.
Nächtliche Sicherung von FHEM
Nun müssen wir in FHEM nur noch ein paar Einträge vornehmen, um die nächtliche Sicherung auf das Netzlaufwerk auf dem NAS vorzunehmen. Dazu öffnen wir die zentralen Konfigurationsdatei fhem.cfg
und fügen am Ende folgende Zeilen ein.
define SYS_Backup dummy attr SYS_Backup alias FHEM Backup ausführen attr SYS_Backup room System attr SYS_Backup webCmd Ausführen define SYS_last_Backup_date dummy attr SYS_last_Backup_date alias letztes FHEM Backup Datum attr SYS_last_Backup_date room System define SYS_last_Backup_size dummy attr SYS_last_Backup_size alias letztes FHEM Backup Größe attr SYS_last_Backup_size room System define SYS_BackupRun notify SYS_Backup:* {\ fhem("backup");;\ sleep(5);;\ while(my $psoutput = `ps -ef | grep -v grep | grep FHEM | grep tar`) {\ sleep(10);;\ }\ opendir DIR, "./backup" or die $!;;\ my @mybackups = ();;\ my $lastbackupdatedatum = "";;\ my $lastbackupdatesize = "";;\ my %lastbackupsize;;\ my %lastbackuptime;;\ while(my $file = readdir DIR){ \ next if($file eq "." || $file eq "..");;\ push(@mybackups,$file);;\ }\ closedir DIR;;\ foreach my $file (sort @mybackups) {\ my $longfile = "./backup/".$file;;\ my $destination = "/mnt/syno/fhembackup/";;\ `sudo mv $longfile $destination`;;\ }\ opendir DIR, "/mnt/syno/fhembackup" or die $!;;\ @mybackups =();;\ while(my $file = readdir DIR){ \ next if($file eq "." || $file eq ".." || $file eq "\@eaDir");;\ my $mybackupfile = "/mnt/syno/fhembackup/".$file;;\ push(@mybackups,$file);;\ $lastbackuptime{$mybackupfile} = (stat($mybackupfile))[9];;\ $lastbackupsize{$mybackupfile} = (stat($mybackupfile))[7];;\ }\ closedir DIR;;\ @mybackups = sort { eval($lastbackuptime{$a}) <=> eval($lastbackuptime{$b}) } (@mybackups);;\ if($#mybackups > 0) {\ my $mybackupfile = "/mnt/syno/fhembackup/".$mybackups[$#mybackups];;\ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($lastbackuptime{$mybackupfile});;\ $year += 1900;;\ $mon += 1;;\ $lastbackupdatedatum = sprintf("%02d.%02d.%04d %02d:%02d:%02d",$mday,$mon,$year,$hour,$min,$sec);;\ $lastbackupdatesize = $lastbackupsize{$mybackupfile}." Bytes";;\ $mybackups[$#mybackups] = "<b>".$mybackups[$#mybackups]."</b>";;\ } else {\ $lastbackupdatedatum = "kein Backup gefunden";;\ $lastbackupdatesize = "kein Backup gefunden";;\ }\ @mybackups = join("</br>", @mybackups );;\ fhem("set SYS_Backup @mybackups");;\ fhem("set SYS_last_Backup_date $lastbackupdatedatum");;\ fhem("set SYS_last_Backup_size $lastbackupdatesize");;\ } attr SYS_BackupRun room System define job_BackupRun at *23:15:00 set SYS_Backup Ausführen attr job_BackupRun room System
In meinem Beispiel läuft die nächtliche Sicherung um 23:15 Uhr. Man sollte nur sicherstellen, dass das NAS so konfiguriert ist, dass es nicht zu dieser Zeit heruntergefahren ist.
Überprüfung der Sicherungen
Um zu sehen, ob die nächtliche Sicherung auch geklappt hat, ist es mit unserer Konfiguration in FHEM direkt möglich, nachzusehen, welche Sicherungen in unserem Netzlaufwerk auf dem NAS vorhanden sind. Diese werden als nach Datum der Erstellung sortierte Liste im Attribut SYS_Backup
direkt ausgegeben:
Des Weiteren wird das Datum und die Größe des letzten Backups, das darüber in der Liste fett markiert ist in zwei weiteren Attributen gespeichert. In diesem Zusammenhang auch ein Dankeschön für die Anregung von Jörg, die ich gleich mit aufgenommen habe!
Mit Klick auf „Ausführen
“ kann das Backup auch manuell durchgeführt werden, ansonsten erfolgt es täglich um 23:15 Uhr
Anzahl der Backups begrenzen
Damit die Anzahl der Sicherungen nicht übermässig ansteigt, sollten wir dafür sorgen, dass die ältesten Backups regelmässig gelöscht werden. Hierfür würde ich empfehlen, dies nicht auch noch in das oben vorgestellte Skript zu implementieren, sondern hierfür ein eigenes Programm regelmässig über die crontab aufzurufen. Dies klappt mit folgendem Skript, das wir delete_fhembackup.pl
nennen und einfach im Hauptverzeichnis des Users pi
erstellen.
#!/usr/bin/perl $keeplatest = 10; opendir DIR, "/mnt/syno/fhembackup" or die $!; @mybackups =(); while(my $file = readdir DIR){ next if($file eq "." || $file eq ".." || $file eq "\@eaDir" || $file eq ".DS_Store"); my $mybackupfile = "/mnt/syno/fhembackup/".$file; push(@mybackups,$file); } closedir DIR; @mybackups = sort @mybackups; if($#mybackups <= $keeplatest) { exit; } for($i = 0;$i <= $#mybackups - $keeplatest; $i++) { $mybackupfile = "/mnt/syno/fhembackup/".$mybackups[$i]; print "lösche ".$mybackupfile."\n"; unlink $mybackupfile; }
Danach machen wir mitchmod +x delete_fhembackup.pl
das Skript ausführbar und erstellen in der crontab mit dem Befehl crontab -e folgende Zeile:
15 0 * * * /home/pi/delete_fhembackup.pl
Nun wird täglich um 0:15 Uhr die Anzahl der Backups auf die letzten 10 (siehe Variable $keeplatest
) begrenzt und die älteren gelöscht.
Energiesparmaßnahmen an der NAS
Normalerweise benötige ich mein NAS nachts nicht. Deswegen gibt es die Möglichkeit, in der Systemsteuerung einzustellen, wann es sich abends/nachts herunterfährt und ab wann wir wieder darauf zugreifen müssen.
Dazu geht man in der Systemsteuerung der Synology auf das Icon für „Hardware & Energie“ und wählt den Reiter „Energie-Zeitplan„. Dieser ist bei mir so eingestellt, dass mein NAS täglich um 06:15 hochfährt und um 23:59 Uhr heruntergefahren wird.
Zuletzt aktualisiert am 24.02.2019.