fragen stichworte

Inkrementelle Sicherung im Git-Stil mit rsync

Ich versuche, ein Sicherungsskript auf Ubuntu einzurichten. Jeden Tag möchte ich mein lokales Quellverzeichnis in ein Sicherungsverzeichnis auf einem Remote-Server kopieren, der eindeutig mit dem Datum benannt ist. (z. B. backup-jan1/, backup-jan2/usw.) Es sollte eine Spiegelung des frühesten Zustands speichern und Differenzdateien verwenden, um die neuen Sicherungspunkte neu zu erstellen.

Mit rsync ist das ziemlich einfach. Ich habe bereits ein Skript eingerichtet, das die Sicherung erstellt, das Sicherungsverzeichnis mit dem aktuellen Tag benennt und einen Symlink zur letzten Sicherung herstellt (IP wurde bearbeitet):

date=`date "+%m%d"`
rsync -ave ssh/srv root@150.69.32.8:/backup/backup-$date/
ssh root@150.69.32.8 rm -rf/backup/current
ssh root@150.69.32.8 ln -s backup-$date//backup/current

Allerdings ist hier der schwierige Teil: Ich möchte nicht, dass Dateien kopiert werden, die sich nicht geändert haben. Wenn sich also Dateien seit der letzten täglichen Sicherung geändert haben, werden sie wie üblich kopiert . Andernfalls wird der unveränderte, zuvor gesicherte Dateien vom ersten Sicherungsverzeichnis zur neuen Sicherung symbolisch verknüpft. (Art of like git)

Nehmen wir zum Beispiel an, ich starte die Sicherungskopie 1. Das Verzeichnis backup-jan1/enthält alle ursprünglichen Sicherungsdateien. Am nächsten Tag sollte die Sicherung vom 2. Januar dann nur die Dateien kopieren, die in diesen 24 Stunden geändert wurden. Für alle anderen Dateien werden Symlinks aus den Sicherungsdateien vom 1. Januar erstellt. Am 3. Januar habe ich eine Datei hinzugefügt und eine andere gelöscht. Wenn eine Datei entfernt wird, sollte sie nicht weiter mit einem Symlink verbunden werden.

Beispielverzeichnis/Dateistruktur:

backup-jan1/(initial backup)
    file_a
    file_b

backup-jan2/(no changes)
    file_a (symlink to ../backup-jan1/file_a)
    file_b (symlink to ../backup-jan1/file_b)

backup-jan3/(removed file_a symlink and added file_c)
    file_b (symlink to ../backup-jan1/file_b)
    file_c

...

Ich habe versucht, diese Versionskontrolltypfunktionalität in rsync und rsnapshot zu suchen, aber ich habe sie noch nicht gefunden. Kann jemand eine solche Sicherungsstrategie vorschlagen?

antworten

Was Sie suchen, ist die --link-dest -Funktionalität, die Bestandteil von rsync ist. Sie scheinen genau zu beschreiben, wie dirvish funktioniert.

Die Option link-dest erstellt feste Verknüpfungen vom Zielpfad zu einer anderen Kopie der Struktur.

Mit dirvish führen Sie eine erste Sicherung durch, bei der nur rsync verwendet wird.

Danach wird jede weitere Rückseite mit der vorherigen erfolgreichen Sicherung fest verbunden. Das bedeutet, dass keine Dateien doppelt vorhanden sind. Sie können direkt aus dem Tresor auf jede einzelne Sicherung zugreifen, und jede Sicherung ist eine vollständige und vollständige Sicherung. Sie können frühere Sicherungen jederzeit entfernen.

Hier ist ein Skript, das Sie zur Demonstration verwenden können.

# create test area
mkdir -p/tmp/backuptest/{source,dest1,dest2,dest3}
for a in `seq 10` ; do dd if=/dev/urandom of=/tmp/backuptest/source/file$a bs=1M count=1; done

# look
find/tmp/backuptest/-ls ; du find/tmp/backuptest/

# initial backup
rsync -va/tmp/backuptest/source//tmp/backuptest/dest1/

# look
find/tmp/backuptest/-ls ; du find/tmp/backuptest/

# make chagnes
rm/tmp/backuptest/source/file[2-4]
cat/tmp/backuptest/source/file[6-7] >/tmp/backuptest/source/file11

# new backup linked to previous
rsync -va/tmp/backuptest/source//tmp/backuptest/dest2/--link-dest=/tmp/backuptest/dest1/

# look
find/tmp/backuptest/-ls ; du find/tmp/backuptest/

# make changes
rm/tmp/backuptest/source/file5
cat/tmp/backuptest/source/file[5-7] >/tmp/backuptest/source/file12

# new backup linked to previous
rsync -va/tmp/backuptest/source//tmp/backuptest/dest3/--link-dest=/tmp/backuptest/dest2/

# look
find/tmp/backuptest/-ls ; du find/tmp/backuptest/

# remove dest1
rm -r/tmp/backuptest/dest1/

# see your dest2, and dest3 are still complete backups for the state at those times.
find/tmp/backuptest/-ls ; du find/tmp/backuptest/

Sie können "cp" mit der Option "-l" verwenden, um als feste Links zu kopieren. Wenn sich alle Ihre Quelle und Ihr Ziel in demselben Dateisystem befinden, ist dies sehr schnell.

Ihr ursprüngliches Verzeichnis ist also "backup-jan1" und Ihr nächstes ist "backup-jan2". In diesem Fall machen Sie:

cp -al backup-jan1 backup-jan2

Dann führen Sie Ihren Rsync gegen Backup-Jan2. Wenn rsync auf eine geänderte Datei stößt, wird die Verknüpfung mit der ursprünglichen Datei in backup-jan1 aufgehoben und eine neue Datei (mit demselben Namen) in backup-jan2 erstellt.

Am nächsten Tag werden Sie Folgendes tun:

cp -al backup-jan2 backup-jan3

mit Ihrem rsync an backup-jan3. Wiederum führen neue Dateien in der Sicherung zum Aufheben der Verknüpfung in backup-jan3 usw.

Wenn in diesem Fall 3 Dateien in backup-jan1 vorhanden sind, wobei Datei1 über alle drei Tage hinweg gleich bleibt, Datei2 nur für jan2 und Datei3 an jedem Tag geändert wird, ist Datei1 gleich hart Über alle drei Verzeichnisse hinweg verbunden, file2 als zwei Dateien (eine in backup-jan1 und eine in backup-jan2 und backup-jan3, die fest verbunden sind) und file3 als drei Dateien in jedem Verzeichnis.