Mit diesem Skript wird ein inkrementelles Backup mit Hardlinks von einem entfernten Rechner erstellt.
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.
Das Zieldateisystem muss Hardlinks unterstützen (z. B: ext2/3, xfs, reiser, …).
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.
#!/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
Diskussion