Ежедневные инкрементальные бэкапы

Инструкция как сделать ежедневные инкрементальные бэкапы. Скрипт создает бэкапы по датам с симлинками на уже существующие файлы, чтобы они место не занимали.

1) Создайте файл:

#!/bin/bash

SOURCE_DIRECTORY="/srv"
DEST_DIRECTORY="/backup"
LINK_DIRECTORY="$DEST_DIRECTORY/last"
RSYNC_OPTS="-aSsuhz --numeric-ids --info=progress2"
CURRENT_DATE=`date '+%Y-%m-%d'`

# Remove old backups
for i in $(seq 0 6); do
	DAY=$((i+30))
	LAST_DATE=`date '+%Y-%m-%d' -d "$DAY days ago"`
	rm -rf "$DEST_DIRECTORY/$LAST_DATE"
done

# Check link directory
if [ -d "$LINK_DIRECTORY" ]; then
	REAL_LINK_PATH=$(readlink -f "$LINK_DIRECTORY")
	if [ "$REAL_LINK_PATH" == "$DEST_DIRECTORY/$CURRENT_DATE" ]; then
		exit 1
	fi
fi

# Use lasts backup as the incremental base if it exists
if [ -d "$LINK_DIRECTORY" ]; then
	RSYNC_OPTS="$RSYNC_OPTS --link-dest $LINK_DIRECTORY"
fi

# Rsync
rsync $RSYNC_OPTS  $SOURCE_DIRECTORY/  $DEST_DIRECTORY/$CURRENT_DATE/

# Recreate symlink
if [ $? -eq 0 ] && [ ! -z $LINK_DIRECTORY ]; then
	yes | rm -f $LINK_DIRECTORY
	ln -s $DEST_DIRECTORY/$CURRENT_DATE $LINK_DIRECTORY
fi

Поменяйте параметры SOURCE_DIRECTORY и DEST_DIRECTORY на свои значения.

2) Пропиши в крон строчку

0 0 * * * /path/to/backup/script.sh > /dev/null

Дополнительные ссылки:

  1. Easy Automated Snapshot-Style Backups with Linux and Rsync
  2. Incremental backups with rsync and hard links