Inhaltsverzeichnis

Backup

Rsnapshot

ist ein einfach zu bedienendes Backupprogramm. Rsnapshot hasiert auf rsync, es ist einfach zu bedienen und eignet sich sehr gut für Backups auf USB Festplatten.
ein anderes einfaches Backup-Skript

#!/bin/sh
NOW=$(date +"%d-%m-%Y")
# set mysql login info
MUSER="MySQL-UserNAME"                # Username
MPASS="MySQL-SERVER-PASSWORD"   # Password
MHOST="MySQL-SERVER-IP-ADDRESS"  # Server Name
# guess binary names
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
GZIP="$(which gzip)"

# get all db names
DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')"
for db in $DBS
do
 FILE=mysql-$db.$NOW-$(date +"%T").gz
 $MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS $db | $GZIP -9> $FILE
done

Verzeichnisse sichern

#!/bin/bash
# Simple backup with rsync
# local-mode, tossh-mode, fromssh-mode

SOURCES=(/root /etc /home /boot /lampp)
TARGET="/media/backup"

# edit or comment with "#"
#LISTPACKAGES=listdebianpackages        # local-mode and tossh-mode
MONTHROTATE=monthrotate                 # use DD instead of YYMMDD

RSYNCCONF=(--delete)
#MOUNTPOINT="/media/daten"               # check local mountpoint
#MAILREC="user@ domain"

#SSHUSER="sshuser"
#FROMSSH="fromssh-server"
#TOSSH="tossh-server"
SSHPORT=22

### do not edit ###

MOUNT="/bin/mount"; FGREP="/bin/fgrep"; SSH="/usr/bin/ssh"
LN="/bin/ln"; ECHO="/bin/echo"; DATE="/bin/date"; RM="/bin/rm"
DPKG="/usr/bin/dpkg"; AWK="/usr/bin/awk"; MAIL="/usr/bin/mail"
CUT="/usr/bin/cut"; TR="/usr/bin/tr"; RSYNC="/usr/bin/rsync"
LAST="last"; INC="--link-dest=$TARGET/$LAST"

LOG=$0.log
$DATE> $LOG

if [ "${TARGET:${#TARGET}-1:1}" != "/" ]; then
  TARGET=$TARGET/
fi

if [ "$LISTPACKAGES" ] && [ -z "$FROMSSH" ]; then
  $ECHO "$DPKG --get-selections | $AWK '!/deinstall|purge|hold/'|$CUT -f1 | $TR '\n' ' '">> $LOG
  $DPKG --get-selections | $AWK '!/deinstall|purge|hold/'|$CUT -f1 |$TR '\n' ' '>> $LOG  2>&1
fi

if [ "$MOUNTPOINT" ]; then
  MOUNTED=$($MOUNT | $FGREP "$MOUNTPOINT");
fi

if [ -z "$MOUNTPOINT" ] || [ "$MOUNTED" ]; then
  if [ -z "$MONTHROTATE" ]; then
    TODAY=$($DATE +%y%m%d)
  else
    TODAY=$($DATE +%d)
  fi

  if [ "$SSHUSER" ] && [ "$SSHPORT" ]; then
    S="$SSH -p $SSHPORT -l $SSHUSER";
  fi

  for SOURCE in "${SOURCES[@]}"
    do
      if [ "$S" ] && [ "$FROMSSH" ] && [ -z "$TOSSH" ]; then
        $ECHO "$RSYNC -e \"$S\" -avR \"$FROMSSH:$SOURCE\" ${RSYNCCONF[@]} $TARGET$TODAY $INC">> $LOG
        $RSYNC -e "$S" -avR "$FROMSSH:\"$SOURCE\"" "${RSYNCCONF[@]}" "$TARGET"$TODAY $INC>> $LOG 2>&1
        if [ $? -ne 0 ]; then
          ERROR=1
        fi
      fi
      if [ "$S" ]  && [ "$TOSSH" ] && [ -z "$FROMSSH" ]; then
        $ECHO "$RSYNC -e \"$S\" -avR \"$SOURCE\" ${RSYNCCONF[@]} \"$TOSSH:$TARGET$TODAY\" $INC ">> $LOG
        $RSYNC -e "$S" -avR "$SOURCE" "${RSYNCCONF[@]}" "$TOSSH:\"$TARGET\"$TODAY" $INC>> $LOG 2>&1
        if [ $? -ne 0 ]; then
          ERROR=1
        fi
      fi
      if [ -z "$S" ]; then
        $ECHO "$RSYNC -avR \"$SOURCE\" ${RSYNCCONF[@]} $TARGET$TODAY $INC">> $LOG
        $RSYNC -avR "$SOURCE" "${RSYNCCONF[@]}" "$TARGET"$TODAY $INC>> $LOG 2>&1
        if [ $? -ne 0 ]; then
          ERROR=1
        fi
      fi
  done

  if [ "$S" ] && [ "$TOSSH" ] && [ -z "$FROMSSH" ]; then
    $ECHO "$SSH -p $SSHPORT -l $SSHUSER $TOSSH $LN -nsf $TARGET$TODAY $TARGET$LAST">> $LOG
    $SSH -p $SSHPORT -l $SSHUSER $TOSSH "$LN -nsf \"$TARGET\"$TODAY \"$TARGET\"$LAST">> $LOG 2>&1
    if [ $? -ne 0 ]; then
      ERROR=1
    fi
  fi
  if ( [ "$S" ] && [ "$FROMSSH" ] && [ -z "$TOSSH" ] ) || ( [ -z "$S" ] );  then
    $ECHO "$LN -nsf $TARGET$TODAY $TARGET$LAST">> $LOG
    $LN -nsf "$TARGET"$TODAY "$TARGET"$LAST>> $LOG 2>&1
    if [ $? -ne 0 ]; then
      ERROR=1
    fi
  fi
else
  $ECHO "$MOUNTPOINT not mounted">> $LOG
  ERROR=1
fi
$DATE>> $LOG
if [ -n "$MAILREC" ]; then
  if [ $ERROR ];then
    $MAIL -s "Error Backup $LOG" $MAILREC <$LOG
  else
    $MAIL -s "Backup $LOG" $MAILREC <$LOG
  fi
fi

rsnapshot-Tagessicherung mit Überwachung und Fehlermail

Ziel

Die tägliche rsnapshot-Sicherung soll automatisch gestartet und überwacht werden.
Wenn die Sicherung fehlschlägt oder bereits ein Sicherungslauf aktiv ist, soll automatisch eine E-Mail an webmaster@waldhofer.com gesendet werden.

Die Lösung verwendet ein Shell-Skript mit:

* Start der Tagessicherung
* Protokollierung in eine Logdatei
* Fehlererkennung über den Rückgabecode
* Mailversand im Fehlerfall
* Sperre gegen Doppelstarts mit flock


Wichtiger Hinweis

Die Tagessicherung ist bereits im Skript integriert.
Es ist kein zusätzlicher Cronjob für rsnapshot daily notwendig.

Das Skript enthält den eigentlichen Sicherungsaufruf:

usr/bin/rsnapshot daily>> "$LOGFILE" 2>&1

Es genügt daher ein einziger Cronjob, der nur das Überwachungsskript startet.


Warum ''flock'' verwenden?

Mit flock wird verhindert, dass ein zweiter Sicherungslauf startet, wenn der erste noch aktiv ist.

Vorteile:

* keine Doppelstarts
* saubere Sperrlogik
* robust unter Ubuntu
* besser als einfache selbst gebaute PID-/Lockfile-Prüfungen


Skript anlegen

Datei erstellen:

sudo nano /usr/local/bin/rsnapshot_daily_monitor.sh

Inhalt:

#!/bin/bash
 
set -u
 
LOGFILE="/var/log/rsnapshot_daily.log"\
MAILTO="webmaster@domain.at"\
HOSTNAME="$(hostname -f 2>/dev/null || hostname)"\
LOCKFILE="/var/run/rsnapshot_daily.lock"
 
send_error_mail() {\
  local subject="$1"\
  local body="$2"
 
  /usr/sbin/sendmail "$MAILTO" <<EOF\
Subject: $subject\
From: root@$HOSTNAME\
To: $MAILTO
 
$body\
EOF\
}
 
{\
  flock -n 9 || {\
      DATE_NOW="$(date '+%Y-%m-%d %H:%M:%S')"\
      echo "==== $DATE_NOW LOCK AKTIV: rsnapshot daily laeuft bereits ====">> "$LOGFILE"\
      send_error_mail \
          "[FEHLER] rsnapshot bereits aktiv auf $HOSTNAME" \
          "Der rsnapshot-Job wurde nicht gestartet, weil bereits ein Lauf aktiv ist.
 
Host: $HOSTNAME\
Zeit: $DATE_NOW\
Lockdatei: $LOCKFILE\
Logdatei: $LOGFILE"\
      exit 1\
  }
 
  DATE_NOW="$(date '+%Y-%m-%d %H:%M:%S')"\
  echo "==== Start rsnapshot daily: $DATE_NOW ====">> "$LOGFILE"
 
  /usr/bin/rsnapshot daily>> "$LOGFILE" 2>&1\
  RETVAL=$?
 
  DATE_END="$(date '+%Y-%m-%d %H:%M:%S')"
 
  if [ $RETVAL -eq 0 ]; then\
      echo "==== Ende rsnapshot daily erfolgreich: $DATE_END ====">> "$LOGFILE"\
  else\
      echo "==== Ende rsnapshot daily FEHLER ($RETVAL): $DATE_END ====">> "$LOGFILE"\
      send_error_mail \
          "[FEHLER] rsnapshot Backup auf $HOSTNAME" \
          "Die rsnapshot-Sicherung ist fehlgeschlagen.
 
Host: $HOSTNAME\
Zeit: $DATE_END\
Rueckgabecode: $RETVAL\
Logdatei: $LOGFILE
 
Die letzten 50 Zeilen aus dem Log:
 
$(tail -n 50 "$LOGFILE")"\
  fi
 
  exit $RETVAL\
} 9>"$LOCKFILE"\

Skript ausführbar machen

sudo chmod +x /usr/local/bin/rsnapshot_daily_monitor.sh

Cronjob einrichten

Root-Crontab bearbeiten:

sudo crontab -e

Eintrag hinzufügen:

0 1 * * * /usr/local/bin/rsnapshot_daily_monitor.sh

Damit wird jeden Tag um 01:00 Uhr:

* das Skript gestartet
* die Tagessicherung ausgeführt
* das Ergebnis protokolliert
* im Fehlerfall eine Mail versendet


Wichtige Regel

Ein alter direkter Cronjob mit rsnapshot daily darf nicht zusätzlich aktiv sein.

Also nicht beides gleichzeitig:

0 1 * * * /usr/bin/rsnapshot daily\
0 1 * * * /usr/local/bin/rsnapshot_daily_monitor.sh

Richtig ist nur:

0 1 * * * /usr/local/bin/rsnapshot_daily_monitor.sh

Funktion testen

Skript manuell starten:

sudo /usr/local/bin/rsnapshot_daily_monitor.sh
echo $?

Bedeutung:

* 0 = Sicherung erfolgreich
* 1 oder anderer Wert ungleich 0 = Fehler erkannt

Logdatei ansehen:

sudo tail -n 50 /var/log/rsnapshot_daily.log

rsnapshot separat prüfen

Falls das Skript Fehler liefert, zuerst rsnapshot selbst testen:

Konfiguration prüfen:

sudo /usr/bin/rsnapshot configtest
echo $?

Tagessicherung direkt starten: sudo/usr/bin/rsnapshot daily\ echo$?\


Mailversand testen

Testmail senden:

echo -e "Subject: Testmail\n\nDas ist ein Test." | sudo /usr/sbin/sendmail webmaster@domain.at

Wenn die Mail ankommt, funktioniert der Versand über ssmtp bzw. sendmail.


Logdatei

Die Logdatei ist:

/var/log/rsnapshot_daily.log

Dort stehen unter anderem:

* Startzeit des Sicherungslaufs
* Ende des Sicherungslaufs
* Erfolg oder Fehler
* eventuelle Fehlermeldungen von rsnapshot


Typische Fehlerquellen

* Fehler in /etc/rsnapshot.conf
* Zielverzeichnis nicht erreichbar
* fehlende Berechtigungen
* zu wenig Speicherplatz
* SSH-Probleme bei entfernten Sicherungszielen
* fehlerhafte Mail-Konfiguration
* bereits laufender zweiter Sicherungsjob


Zusammenfassung

Diese Lösung kombiniert:

* Tagessicherung
* Überwachung
* Logging
* Fehlermail
* Schutz vor Doppelstarts

in einem einzigen Skript.

Daher reicht ein einziger Cronjob völlig aus.