Daten sichern mit rsync
Dienstag, 24. Februar 2009Täglich sichert das Programm rsync automatisch neue und veränderte Dateien verschiedener Verzeichnisse auf eine externe Festplatte.
Wichtige Dateien, wie jene von Programmier-Projekten, überführe ich in eine Versions-Verwaltung, so benötige ich keine Backup-Versionen. Habe ich eine Datei gelöscht von den zu sichernden Verzeichnissen, wird diese von der externen Backup-Festplatte ebenfalls gelöscht: Auf der Backup-Festplatte sind Spiegel der gesicherten Verzeichnisse.
Zum Sichern schrieb ich ein Bash-Skript. Es liest aus einer Konfigurationsdatei die Namen der Quell- und Zielverzeichnisse und die Namen von Dateien mit Mustern von Dateien, die nicht gesichert werden sollen, beispielsweise Temporärverzeichnisse oder Cache-Verzeichnisse. Das Skript:
#!/bin/sh
#
# Author : Elmar Baumann
# Date : 2006/05/05
# Requires: rsync, Konfigurationsdatei $CONF
# Doc : Synchronisiert Dateien auf ein externes Backupmedium
#
# Aufruf ohne Parameter
#
###############################################################################
SCRIPT=$(basename $0)
# Mountpoint für externes Backupmedium
BACKUP_MOUNTPOINT=/mnt/backup
# Konfigurationsdatei
CONF=${HOME}/conf/backup-directories.conf
# Spalte in der Konfigurationsdatei mit Quellverzeichnissen
COLUMN_SOURCE=1
# Spalte in der Konfigurationsdatei mit Zielverzeichnissen
COLUMN_TARGET=2
# Spalte in der Konfigurationsdatei mit Exclude-Pattern-Dateien
COLUMN_EXCLUDE=3
# Logdatei
LOGFILE=${HOME}/log/${SCRIPT}.txt
# Zeilenumbruch als Fieldseparator
IFS="
"
# Optionen für rsync
RSYNC_OPTIONS="
--archive
--delete
--delete-excluded
"
###############################################################################
function print_date() {
date +"%d.%m.%Y, %H:%M:%S Uhr"
}
function print_started() {
echo "${SCRIPT}: $(print_date) Sichere Dateien auf '${BACKUP_MOUNTPOINT}'..." \
| tee $LOGFILE
}
function print_finished() {
echo "${SCRIPT}: $(print_date) Fertig. Logdatei: '${LOGFILE}'" \
| tee -a $LOGFILE
}
function mount_backup_medium() {
umount $BACKUP_MOUNTPOINT 2> /dev/null
mount $BACKUP_MOUNTPOINT
if [ $? != 0 ]
then
echo "${SCRIPT}: '${BACKUP_MOUNTPOINT}' laesst sich nicht einhaengen!" >&2
exit 1
fi
}
function umount_backup_medium() {
sync
umount $BACKUP_MOUNTPOINT
}
function trim() {
echo $1 | sed -e 's/^ *//;s/ *$//'
}
function shrink_blanks {
echo $1 | sed 's/ */ /g'
}
function get_column_of_line() {
local line=$(shrink_blanks $1)
local column=$2
trim $(echo $line | cut -d " " -f $column)
}
function backup() {
for line in $(cat $CONF | grep -v '^#.*')
do
source=$(get_column_of_line $line $COLUMN_SOURCE)
target=$(get_column_of_line $line $COLUMN_TARGET)
exclude=$(get_column_of_line $line $COLUMN_EXCLUDE)
rsync $RSYNC_OPTIONS \
--exclude-from=$exclude \
$source \
$target \
2>&1 \
| tee -a $LOGFILE
done
}
###############################################################################
print_started
mount_backup_medium
backup
umount_backup_medium
print_finished
Die Konfigurationsdatei sieht so aus — zwischen den Verzeichnis- und Dateinamen stehen Leerzeichen:
# Quelle Ziel Patterndatei für Ausschluss # /home/elmar /mnt/backup/linuxhome /home/elmar/conf/backup-exclude-patterns-home.conf /mnt/bilder /mnt/backup /home/elmar/conf/backup-exclude-patterns-bilder.conf /mnt/daten /mnt/backup /home/elmar/conf/backup-exclude-patterns-daten.conf /mnt/doku /mnt/backup /home/elmar/conf/backup-exclude-patterns-doku.conf /mnt/multimedia /mnt/backup /home/elmar/conf/backup-exclude-patterns-multimedia.conf
Ich lasse rsync nicht alle gesicherten Dateien ausgeben, in der langen Ausgabe übersähe ich Fehlermeldungen, beispielsweise Dateien, die nicht gelesen, geschrieben oder gelöscht werden können.
Die externe Backup-Festplatte ist nur während des Sicherns eingeschaltet, ich sollte nach dem Ausschalten die Kabel herausziehen, so beschädigt eine hohe Überspannung nicht die Festplatte.
Das Skript starte ich durch Aufruf, nicht automatisch beim Einschalten der Backup-Festplatte, diese könnte ich einschalten, veränderte oder gelöschte Dateien wieder herzustellen. Ich gebe den Alias ‘s’ ein und drücke die Enter-Taste.
Jedes Jahr brenne ich die Daten auf zwei Sätze DVDs gleichen Inhalts und guter Qualität von verschiedenen Herstellern, aktuell einen Satz auf Verbatim Archival Grade, den anderen auf Plextor DVD+R, hergestellt von Taiyo Yuden. Der Brenner ist auf 4-fache Geschwindigkeit eingestellt anstelle 16-facher. Die DVDs beider Sätze stecken in Hängeregister-DVD-Hüllen lichtdichter Koffer, ein Satz lagert außer Haus. Die Dateinamen jeder DVD stehen auf der Festplatte in einer komprimierten Textdatei des gleichen Namens wie das DVD-Label
.
Zum vollständigen Rücksichern sind im Skript die Variablen target und source zu vertauschen – vielleicht erweitere ich es um diese Option: Das Skript wird bei gesetzter Option Spalte 2 der Konfigurationsdatei für source auswählen und die Spalte 1 für target: COLUMN_SOURCE=2 und COLUMN_TARGET=1.