Schlagwort-Archive: NFS

Nächtliche Sicherung von FHEM auf NAS

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.

Synology SHR

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

Synology neuer Ordner

und tragen in den Berechtigungen den admin und die entsprechenden Benutzer mit Lese/Schreiben-Recht ein.

Synology Rechte

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.

Synology NFS

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.

Synology NFS-Regel

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:

Synology NFS dir

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:

FHEM Autobackup Size Date

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.

Synology Energie-Zeitplan

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.