Zum Inhalt springen
Backup mit Hardlinks

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 0
Zuletzt aktualisiert am