bei rsnapshot haben mich die nichtsagenden Ordner daily48 oder so gestört.
Da habe ich mich selbst um eine Lösung bemüht.
rsnapshot basiert auf dem erstellen von Hardlinks statt einer vollständigen Kopie. Das machen meine scripte auch.
Im Endeffekt habe ich am Ende mehr erreicht wie rsnapshot in der Lage ist.
Aber erst mal von vorne. Hier mein Script auf das Wesentliche reduziert zum besseren Verständnis.
Dass alleine ist in der Lage versionierte Backups zu erstellen. (Hardlink basiert)
Rich (BBCode):
Source="/volume1/"
Target="/volumeUSB1/usbshare/"
Current="current/"
#Backup
rsync -av --delete --delete-excluded --exclude=@eaDir/ --exclude=#recycle/ $Source $Target$Current 2>&1 | tee -a $OP
#Tagesabbild erstellen
rsync -a --link-dest=$Target$Current $Target$Current $Target$(date +%Y-%m-%d_%a)/ 2>&1 | tee -a $OP
# Alte Tagesabbild löschen
Datum=$(date --date '90 days ago' +%Y-%m-%d_%a) # Funktioniert nicht bei jedem Linux!!!
if [ ! -z $Datum ]; then # Abfrage ob Variable Datum leer ist. Würde dies der fall sein so würde das übergeordnete Verzeichnis gelöscht werden.
if [ -d $Target$Datum ]; then
echo "# altes Tagesabbild entfernen" 2>&1 | tee -a $OP
rm -r $Target$Datum 2>&1 | tee -a $OP
else
echo "# keine altes Tagesabbild zum entfernen vorhanden" 2>&1 | tee -a $OP
fi
else
echo "# Variable Datum ist leer. Nichts gelöscht." 2>&1 | tee -a $OP
fi
Nachteil an jedem rsync Script ist dass rsync nicht erkennt wenn eine Datei oder ein Ordner nur umbenannt wurde. Das macht sich bei großen Dateien über USB bemerkbar... oder auch bei langsamen Internetverbindungen. Zudem wird unnötig Speicherplatz auf dem Backupmedium eingenommen da dort die selbe Datei mit unterschiedlichen Dateinamen liegt.
Auf der Suche nach eine Lösung bin ich über folgende Beitrag gestoßen:
https://lincolnloop.com/blog/detecting-file-moves-renames-rsync/
Das auf meinen Anwendungsfall umgemünzt sieht dann wie folgt aus.
Rich (BBCode):
#!/opt/bin/bash
Source="/volume1/"
Target="/volumeUSB1/usbshare/USB_Backup/"
Current="current/"
Store="/volume1/scripts/backup/"
Double=".rsync_usbDrive.double"
includefile="/volume1/scripts/backup/settings/internal.include"
OP=$Store"logs/output_usbDrive-backup.txt"
LOCK=$Store"rsync_usbDrive.lockfile"
if [ -e $LOCK ]
then
echo "# Starten des Scripts wird duch Lockfile blockiert" 2>&1 | tee -a $OP
exit
else
date 2>&1 | tee $OP
echo "# Erstelle Lockfile" 2>&1 | tee -a $OP
touch $LOCK 2>&1 | tee -a $OP
echo "# sycnronisiere mit usbDrive" 2>&1 | tee -a $OP
rsync -axXhHv --stats --no-inc-recursive --numeric-ids --delete --delete-after --delete-excluded --include=$Double --include-from=$includefile --exclude=@eaDir/ --exclude=#recycle/ --exclude=/* $Source $Target$Current 2>&1 | tee -a $OP
status=$?
if [ $status -eq 0 ]; then
echo "# Schattenkopien lolal" 2>&1 | tee -a $OP
rsync -a --delete --link-dest=$Source --include-from=$includefile --exclude=$Double --exclude=@eaDir/ --exclude=/* $Source $Source$Double 2>&1 | tee -a $OP
echo "# Schattenkopien remote" 2>&1 | tee -a $OP
rsync -a --delete --link-dest=$Target$Current --exclude=$Double --exclude=@eaDir/ --exclude=/* $Target$Current $Target$Current$Double 2>&1 | tee -a $OP
echo "# Tagesabbild remote" 2>&1 | tee -a $OP
rsync -a --delete --delete-excluded --link-dest=$Target$Current --exclude=$Double --exclude=@eaDir/ --exclude=/* $Target$Current $Target$(date +%Y-%m-%d)/ 2>&1 | tee -a $OP
fi
Datum=$(date --date='90 days ago' +%Y-%m-%d) # Funktioniert nicht immer.
if [ ! -z $Datum ]; then # Abfrage ob Variable Datum leer ist. Würde dies der fall sein so würde das übergeordnete Verzeichnis gelöscht werden.
if [ -d $Target$Datum ]; then
echo "# altes Tagesabbild entfernen" 2>&1 | tee -a $OP
#rm -r $Target$Datum 2>&1 | tee -a $OP
else
echo "# keine altes Tagesabbild zum entfernen vorhanden" 2>&1 | tee -a $OP
fi
else
echo "# Variable Datum ist leer. Nichts gelöscht." 2>&1 | tee -a $OP
fi
rm $LOCK 2>&1 | tee -a $OP
echo "# Lockfile entfernt" 2>&1 | tee -a $OP
fi
date 2>&1 | tee -a $OP
Das Prinzip dabei ist Folgendes. Nachdem beide Seiten vollständiges synchronisiert sind wird eine "Schattenkopie" auf beiden Seiten erstellt.
Rsync wird beim starten mit --no-inc-recursive angewiesen zuerst die ganze Verzeichnisstruktur zu übertragen bevor die eigentliche Übertragung beginnt. Mit der Option -H werden alle Hardlinks beibehalten.
Jetzt passiert folgendes. Eine umbenannte Datei ist immer noch mit dem Hardlink in der Schattenkopie verknüpft. Da die Schattenkopie auf beiden Seiten gleich sind wird auf dem Zielmedium zwar die Datei mit dem alten Dateinamen gelöscht, die neue Datei aber aus dem bestehenden Hardlink der Schattenkopie erstellt, somit nicht erneut übertragen.
Hab noch das Problem wenn z.B. ein Backup abgebrochen wurde, dass Schattenkopien erstellt werden die dann unterschiedlich sind da das Backup ja noch nicht fertig war. Das führt dazu dass die Erkennung nicht mehr funktioniert. Backups laufen dann auf herkömmliche weiße ab bis die Schattenkopien auf beiden Seiten identisch sind.
Mein Fehler liegt wohl irgendwo beim exit code. Hab mich aber nicht weiter darum gekümmert da es mich nicht weiter gestört hat.
Funktioniert nicht mit BTRFS da hardlinks nicht über die Grenzen von subvolume gehen können. Oder... Funktioniert nur innerhalb eines subvloume in BTRFS
Benutzung auf eigene Gefahr.!!!
Viel Spaß beim implementieren wenn denn gewünscht....