Inkrementelles Backup

Mit diesem Skript wird ein inkrementelles Backup mit Hardlinks von einem entfernten Rechner erstellt.

Funktionsweise

Für jedes Backup wird ein eigenes Unterverzeichnis erstellt. Wenn noch nie ein Backup durchgeführt wurde, werden alle Daten aus den angegeben Verzeichnissen kopiert.

Falls bereits Backups erstellt wurde, werden nur jene Daten kopiert, die sich seit dem letzten Backup verändert haben. Für alle unveränderten Dateien werden nur Hardlinks auf die jeweilige Datei aus dem letzten Backup erzeugt.

Alle Verzeichnisse die älter als X Tage sind werden gelöscht

Falls die Zielpartition nicht gemountet werden kann, oder während des Backups ein Fehler auftritt, wird eine Email mit einer Fehlermeldung verschickt.

Vorteile

  • Alle Daten die unverändert sind werden nicht kopiert
  • Alle Daten die unverändert sind brauchen keinen Speicherplatz
  • Trotz inkrementellen Verfahrens sind alle Backupverzeichnisse Vollständig

Einschränkungen

Das Zieldateisystem muss Hardlinks unterstützen (z. B: ext2/3, xfs, reiser, …).

Vorbereitungen

Damit der Zugriff auf den entfernten Rechner ohne Passwortabfrage funktioniert, muss eine Private/Public-Key Authentifizierung ohne Passwort eingerichtet sein. Für die Authentifizierung muss auf dem Rechner, der das Backup durchführt, ein Schlüsselpaar erzeugt werden. Der öffentliche Schlüssel muss dann auf alle Rechner, von denen die Daten kopiert werden, übertragen und entsprechend eingerichtet werden.

Die Anleitung wie diese Authentifizierung eingerichtet werden kann, ist im Artikel über die Secure Shell (ssh) beschrieben.

Skript

  #!/bin/bash
  # Copyright by Michael Mayer
 
  # This program is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation, either version 3 of the License, or
  # (at your option) any later version.
 
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
 
  # You should have received a copy of the GNU General Public License
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
  ######################################################################
  ## Beginn Konfigurationsbereich
  ## 
  # Device das gemountet werden soll um die Backups zu speichern
  BACKUP_DEV=/dev/sdX
  #  
  # Verzeichnis in das die Backups kopiert werden sollen (mount-point)
  BACKUP_TO="</backup/directory>"
  #
  # Hostname/IP und Verzeichnis von dem die Daten für das Backup geholt werden sollen 
  BACKUP_SRC="<user1>@<hostname1>:/dir1 <user2>@<hostname2>:/dir2 ..."
  #
  # Anfang des Verzeichnisnamens aller Backups
  PREFIX="backup_"
  #
  # Anzahl der alten Backups, die behalten werden sollen
  KEEP_BACKUPS=14
  #
  # Emailadresse die als Sender einer Fehlermeldung eingetragen wird
  FROM_ADDRESS=<from-emailaddress>
  #
  # Emailadresse an die die Fehlermeldung geschickt werden soll
  TO_ADDRESS=<to-emailaddress>
  ##
  ## Ende Konfigurationsbereich
  ######################################################################
 
  TIMESTAMP=`date +%Y%m%d_%H%M%S`;
 
  mount $BACKUP_DEV $BACKUP_TO
  if [ $? -ne 0 ]; then
     # bei mount-Fehler Fehlermeldung schicken
     echo "$TIMESTAMP - Mounting of USB-Disk FAILED" >> /var/log/backup
     echo "Fehler beim Backup. Die Partition $BACKUP_DEV konnte nicht gemountet werden." | \
         mail -s "Backup - Automatische Fehlermeldung" -r $FROM_ADDRESS  $TO_ADDRESS
     return
  else
    cd $BACKUP_TO
    DAY=`date "+%Y%m%d"`
    OLDEST=`ls -1t | grep backup | tail -1`
    NEWEST=`ls -1tr |grep backup |tail -1`
    NUM=`ls -1 | grep backup | wc -l`
 
    # überprüfen ob mehr als $KEEP_BACKUPS backups existieren
    if [ $NUM -ge $KEEP_BACKUPS ]; then
      # das älteste Backup löschen
      rm -r $OLDEST
    fi
 
    for BACKUP_FILES in $BACKUP_SRC
    do
       if [ $NUM -gt 0 ]; then
         rsync -avcz --rsh=ssh --delete --link-dest=$BACKUP_TO$NEWEST $BACKUP_FILES $BACKUP_TO$PREFIX$DAY
       else
         rsync -avcz --rsh=ssh $BACKUP_FILES $BACKUP_TO$PREFIX$DAY
       fi
       if [ $? -eq 0 ]; then
         echo "$TIMESTAMP - Backup of $BACKUP_FILES OK" >> /var/log/backup.log
       else
         echo "$TIMESTAMP - Backup of $BACKUP_FILES to $BACKUP_TO FAILED" >> /var/log/backup
         echo "Das inkrementelle Backup hat nicht funktioniert." \
             mail -s "Backup - Automatische Fehlermeldung" -r $FROM_ADDRESS  $TO_ADDRESS
      fi
    done
 
    # erzeuge einen Link auf das neu erzeugte Verzeichnis
    rm last_backup
    ln -s $BACKUP_TO$PREFIX$DAY last_backup
 
  fi
 
  cd /
  umount $BACKUP_TO

Siehe auch


Diskussion

Geben Sie Ihren Kommentar ein
 
scripts/inkrementelles_backup.txt · Zuletzt geändert: 2010/03/01 22:03 (Externe Bearbeitung)
Nach oben
openSUSE.org

Beachten sie unbedingt den Haftungsausschluss!

Recent changes RSS feed openSUSE.org Powered by PHP do yourself a favour and use a real browser - get firefox!! Driven by DokuWiki

Sofern nicht anders gekennzeichnet, steht der Inhalt dieser Seite unter dem Schutz der Creative Commons Licence:
Creative Commons License Namensnennung, Keine kommerzielle Nutzung, Weitergabe unter gleichen Bedingungen, v 3.0