Rsnapshot: Komplettes Systembackup

Rsnapshot. Weil alt, stabil, transparent.
Inkrementell für immer.

Rsnapshot nutzt unter der Haube rsync, es dedupliziert mehrfach vorkommende Dateien auf Dateisystemebene mittels Hard-Links, einem Feature, dass seit einiger Zeit auch in rsync direkt eingebaut ist. Im Grunde genommen ist es ein Wrapper um rsync.
Das schöne ist, man bekommt wirklich eine ganz normale Ordnerstruktur, in denen die Dateien von den jeweils letzten stündlichen, täglichen, wöchentlichen, usw. Backups liegen.
Ich brauche rsnapshot nicht, um wieder an die Backups heranzukommen.

Jedoch gibt es schon genug Informationen dort draußen, was rsnapshot angeht, darum beschränke ich mich hier auf das Wesentliche.

In meiner rsnapshot.conf habe ich folgende Änderungen vorgenommen:
snapshot_root    /external_drive/
no_create_root    1
cmd_du        /usr/bin/du

exclude        /home/*/.cache/**
exclude        /dev/**
exclude        /proc/**
exclude        /sys/**
exclude        /tmp/**
exclude        /run/**
exclude        /mnt/**
exclude        /media/**
exclude        /lost+found

link_dest    1
sync_first    1
###############################
### BACKUP POINTS / SCRIPTS ###
###############################

# LOCALHOST
backup    /    some_prefix/

rsnapshot configtest

hilft, denn rsnapshot aktzeptiert ausschließlich TABs als Trennzeichen. Verzeichnisse müssen mit / enden.

Bei Verwendung von sync_first, was Konsistenz der Backups im Falle einer Unterbrechung garantiert, muss der kleinste rsync Intervall, z.B. "hourly", mit "sync" ausgeführt werden:
/usr/bin/rsnapshot sync && /usr/bin/rsnapshot hourly

Schließlich wäre es unschön, wenn im Fehlerfall Backups wegrotiert werden.

Normalerweise steht rsnapshot im Crontab, nur ist das bei einem Desktop-Rechner etwas unpraktisch, da er schlicht nicht 24/7 durchläuft.
Eine Lösung ist es, die Zeitangaben relativ zu machen, so dass das Skript periodisch aufgerufen werden kann, statt zu fixen Zeiten:

Download

#!/bin/bash 
cd "$(dirname "$0")"
# parameters:
# target seconds

# target: daily, hourly etc
# minutes: trigger rsnapshot with target if last run was >seconds ago
function rsnapshot-desktop () {
    if [ ! -e $1.lastrun ]; then
        echo "initialise $1"
        touch -t 200001010101.00 $1.lastrun
    fi
    if (( $(date +%s) - $(stat -c%Y $1.lastrun) >= $2 )); then
        echo "running rsnapshot $1"
        echo > $1.lastrun
        return $(rsnapshot $1)
    fi
    return 0
}

while pgrep rsync; do
    exit 1
done

rsnapshot-desktop sync 0 && \
rsnapshot-desktop hourly 3600 && \
rsnapshot-desktop daily 86400 && \
rsnapshot-desktop weekly 604800 && \
rsnapshot-desktop monthly 2592000 && \
echo done


Um die Größe des aktuellen Snapshots anzuzeigen, kann du benutzt werden:
Im rsnapshot Verzeichnis:
du -sh .
30G .
du -shl
98G .

du -sh .sync $(ls)
22G .sync
1.7G daily.3
2.9G daily.4
1.6G daily.5
122M hourly.0
129M hourly.1
1.6G weekly.0

du zählt Hardlinks nur einmal, oder mit dem l Parameter jedes mal.
Daraus folgt, dass ich aus jedem Verzeichnis die Größe der darin geänderten, nicht schon anderswo redundant durch Hardlinks abgelegten Dateien erhalte.

Zu guter Letzt muss aber auch gesagt werden, rsnapshot eignet sich nicht für alles. Man bedenke nur VM-Images, mehrere Gigabyte große Dateien, die bei der kleinsten Änderung noch einmal komplett synchronisiert werden müssen.
Nichtsdestotroz lässt rsnapshot auch Skripte ausführen, in denen z.B. ein MySQL-Dump erzeugt werden kann.
Ich würde wichtige Backups (Schreibzugriffe, Datenbank, etc) immer mit LVM-Snapshots realisieren, das Backup vom konsistenten Snapshot aus durchführen.

Weiter:
Rsnapshot verschlüsselt über's Netzwerk nutzen

Linux

475 Words

2016-09-24