Backup mit Hardlinks
Dieses Script erstellt inkrementelle Backups über SSH mittels rsync --link-dest. Dabei wird jedes Backup als vollständiges Verzeichnis gespeichert, unveränderte Dateien werden jedoch als Hardlinks auf das vorherige Backup angelegt. Das spart erheblich Speicherplatz, da nur tatsächlich geänderte Dateien zusätzlichen Platz belegen.
Das Prinzip: Jedes Backup-Verzeichnis sieht aus wie ein vollständiges Backup, belegt aber nur den Platz der geänderten Dateien. Alte Backups werden automatisch rotiert.
rsync_Backup_Hardlinks.sh
#!/bin/bash
##################################################################################################################### Config
SSH_HOST="10.0.0.1"
SSH_PORT=22
SSH_PATH=/backup
BACKUP_PREFIX=My_Hostname
BACKUP_SOURCE=/
BACKUP_COUNTS=7
BACKUP_PARAMETER="-az --stats --delete-before --delete-excluded --partial --devices --specials --numeric-ids --hard-links --bwlimit=1024"
BACKUP_EXCLUDE="--exclude /backup/ \
--exclude /mnt/backup/ \
--exclude /proc/ \
--exclude /sys/ \
--exclude /var/lib/vz/root/ \
--exclude /var/lib/vz/template/"
##################################################################################################################### Self
PID=$$
SCRIPTNAME=$(basename $0)
##################################################################################################################### Search for last backup
logger -p info -t ${SCRIPTNAME}[${PID}] Getting Last Backup ...
DATE=$(date +%Y%m%d_%H%M%S)
LAST_BACKUP=$(ssh -p ${SSH_PORT} ${SSH_HOST} "/bin/ls -1 ${SSH_PATH} 2>/dev/null | tail -n1")
if [ "${LAST_BACKUP}" != "" ]; then
LAST_BACKUP="--link-dest=${SSH_PATH}/${LAST_BACKUP}"
fi
##################################################################################################################### Backup job
logger -p info -t ${SCRIPTNAME}[${PID}] Starting Backup ...
rsync ${BACKUP_PARAMETER} ${BACKUP_EXCLUDE} -e "ssh -p ${SSH_PORT}" $LAST_BACKUP ${BACKUP_SOURCE} ${SSH_HOST}:${SSH_PATH}/${BACKUP_PREFIX}_${DATE} 2>&1 | grep -v "file has vanished: " | while read LINE; do
if [ "x$LINE" != "x" ]; then
logger -p info -t ${SCRIPTNAME}[${PID}] ${LINE}
fi
done
##################################################################################################################### Delete old backups
logger -p info -t ${SCRIPTNAME}[${PID}] Removing old Backups ...
COUNTER=0
for DIR in $(ssh -p ${SSH_PORT} ${SSH_HOST} "/bin/ls -1 -r ${SSH_PATH}/ | grep ${BACKUP_PREFIX}")
do
let COUNTER=$COUNTER+1
if [ $COUNTER -gt "${BACKUP_COUNTS}" ]; then
ssh -p ${SSH_PORT} ${SSH_HOST} "rm -rf ${SSH_PATH}/${DIR}"
fi
done
##################################################################################################################### Finish
exit 0Zuletzt aktualisiert am