Beispiel eines vollautomatisierten Backups

Aus wiki.archlinux.de
Version vom 4. Januar 2022, 10:53 Uhr von Dirk (Diskussion | Beiträge) (stil, synt)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Einleitung

Das hier soll eher ein Denkanstoß sein wie man Backups automatisieren kann. Es ist und soll keine "copy & paste" Anleitung sein und auch ein paar Gedanken über Backups selber vermitteln.

Backups zu automatisieren hat fast nur Vorteile:

  • man vergisst sie nicht.
  • man muss sie nicht von Hand anstoßen.
  • man kann sie, einmal eingerichtet, solange vergessen bis man sie braucht ;)

Nachteile gibt es aber auch:

  • der Speicher auf den das Backup soll muss (zur passenden Zeit) erreichbar sein.
  • evtl. bekommt man nicht mit das gar kein Backup gelaufen ist!

Vorüberlegung

  • Vorraussetzung um ein Backup zu automatisieren ist natürlich das es keinerlei manueller Intervention bedarf. Das bedeutet schonmal das sämtliche Geräte bei denen man ein Kabel einstecken müsste oder die man manuell einschalten muss außen vor bleiben.
  • Allerdings will man evtl. auch nicht das ein Gerät (Server) 24/7 läuft und zu 95% Strom sinnlos in Wärme umwandelt.
  • der Speicherort sollte "extern" liegen, d.h. nicht auf dem Gerät von dem man ein Backup macht! Wie weit man "extern" ausdehnt sei jedem selbst überlassen (Physikalisch auf jeden Fall. Aber ob Räumlich im sinne von Raum oder sogar Gebäude... feel free ;) )
  • man benötigt eine Form von Monitoring.

Aus diesen Punkten kann man z.B. folgendes entwickeln:

  • ein Backupserver (optional mit RAIDx) der nur bei Bedarf läuft und Speicherplatz bereitstellt.
  • Clients die nicht immer am Netz sind aber automatisch ihr Backup darauf ablegen.

Erste Schritte

Server

  • Auf dem Server richtet man zuerst Shares ein, z.B. NFS oder Samba den die Clients für ihr Backup nutzen sollen.

Client

  • Die Clients bekommen ein Share vom Server das sie automounten. Das kann man per autofs erledigen oder auch durch systemd machen lassen.
  • Auf den Clients wird rsnapshot eingerichtet welches in dem automount das Backup anlegt.

Jetzt hat man schonmal ein rudimentäres Setup für sein Backup geschaffen. Es fehlt nur noch der Schritt zur Automation.

Automatisierung & Stromsparen

Server

Hier kann man sich an en:Wake-on-LAN orientieren.

Client

Auf den Clients installiert man wol um den Server aufzuwecken wenn er schläft. Dann benötigt man noch folgendes Script welches man z.B. unter /root/scripts/auto-backup.sh ablegt und ausführbar macht:

 #!/bin/bash
 # Author: chepaz <mx-bounce@gmx.net>
 #
 #
 # config server details here
 wakethismac="aa:bb:cc:dd:ee:ff"
 bkuphost="hostname"
 # config other details
 wlandevice="wlp3s0" # if this device is up backup will be skipped
 bkuphosttimeout="12" # is a multiple of 10s e.g. 3*10 fail after 30s
 
 
 # parametercheck
 if [ $# -ne 1 ]; then
     echo "Too much or too few parameters."
     echo "Use one of: <hourly | daily | weekly | monthly>"
     exit 1
 fi
 
 if [ $1 == "hourly" ]; then
     bkuptype=$1
 elif [ $1 == "daily" ]; then
     bkuptype=$1
 elif [ $1 == "weekly" ]; then
     bkuptype=$1
 elif [ $1 == "monthly" ]; then
     bkuptype=$1
 elif [ $1 == "yearly" ]; then
     bkuptype=$1
 elif [ $1 == "backup" ]; then
     bkuptype=$1
 else
     echo "Use one of: <hourly | daily | weekly | monthly | yearly | backup>"
     exit 1
 fi
 
 
 # quit and do nothing if wlan is connected
 wlanactive=$(iw $wlandevice link | wc -l)
 
 if [ $wlanactive -gt "1" ]; then
   echo "Wlan active, BACKUP SKIPPED!"
   exit 222
 fi
 
 
 # wake up your backupserver
 wol $wakethismac &>/dev/null 
 
 
 # check if destination is reachable
 statusfile="/tmp/$!.status"
 echo "false" > $statusfile
 
 while [ $(grep false $statusfile) ]; do
     ping -c1 $bkuphost &>/dev/null
     pingstatus=$?
 
     if [ $pingstatus -eq "0" ]; then
         echo "true" > $statusfile
     fi
     
     # avoid pingspam and quit if backuphost isn't reachable
     if [ $pingstatus -eq "1" ]; then
         if [ $bkuphosttimeout -eq "0" ]; then
             echo "Destination unreachable, NO BACKUP MADE!"
             exit 404
         fi
         sleep 10
         ((bkuphosttimeout--))
     fi
 done
 
 
 # run the backup 
 rsnapshot -q $bkuptype
 
 
 # check if rsnypshot was successful
 if [ $? -eq "0" ]; then
     rm $statusfile
 else
     echo "Backup failed, take a look at the rsnapshot logs!"
 fi
 chmod +x /root/scripts/auto-backup.sh

Dem Script kann man die Optionen hourly, daily, weekly, yearly und backup mitgeben. yearly und backup sind Sonderkonstrukte die man sich bei Bedarf in seine rsnapshot.conf einpflegen oder auch einfach ignorieren kann ;)

Der Sinn des Scriptes ist es rsnapshot den passenden Parameter mitzugeben mit dem gebackupt werden soll (hourly,daily,weekly z.B.), den Server zu wecken und vor dem Backup zu testen ob er erreichbar ist. Falls das nicht der Fall sein sollte bricht das Script ab ohne rsnapshot aufzurufen. Vor dem Aufruf muss man folgende Variablen konfigurieren:

  • wakethismac="aa:bb:cc:dd:ee:ff" <-- mit der MAC-Adresse des Servers
  • bkuphost="hostname" <-- mit dem Hostnamen des Servers mit dem er im DNS erreichbar ist
  • bkuphosttimeout="12" <-- wann das Script bei Nichterreichbarkeit abbricht (z.B. $bkuphosttimeout*10s 12*10s=120s)

Jetzt kann man z.B. in /etc/cron.daily ein File anlegen

 echo "/root/scripts/auto-backup.sh daily" > /etc/cron.daily/backup

und anacron sorgt dafür das es jeden Tag einmal ausgeführt wird.

Das gleiche kann man nun auch in /etc/cron.[hourly|weekly|monthly] anstellen. Ab sofort wird

  • der Server aufgeweckt.
  • automatisch ein Backup gemacht.
  • wenn kein Client mehr da ist der Server schlafen gelegt.

Ein bisschen Monitoring

Ein ganz einfaches Monitoring bekommt man wenn man z.B. Postfix auf dem Client installiert und wie beschrieben nur lokale Mails aktiviert. Wenn rsnapshot oder das Script durch Fehler abbrechen bekommt root automatisch eine Mail. Das ist zugegebenermaßen nicht die Welt aber immerhin besser als Logfiles durchzusehen ;)

Siehe auch