Am Samstag, 12. Juli 2008 18:41:32 schrieb Werner Holtfreter: > das Exkludieren funktioniert auch nicht Nach einigen schlaflose Nächten nun Ergebnisse: Der rsync-Paramter hinter --exclude= kann auch ein Pfad sein. Der Pfad darf aber nur so lang sein, wie er in Quelle und Ziel identisch ist! --exclude=/home/*/.local/share/Trash schreibt man besser als --exclude=.local/share/Trash/ Abschließendes / bezeichnet ein Directory, ohne / eine Datei oder ein Directory. Ähnlich wie Markus habe ich folgende Scripte geschrieben und untersucht: rsyback.cp [1] rsyback.linkdest [2] rsyback.zykl [3] rsyback.splitt [4] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ rsyback.cp [1] ist die klassische Variante. Funktioniert einwandfrei aber langsam. rsyback.linkdest [2] verzichtet auf cp -al backup.0 backup.1 Aber: Bereits die Rechteänderung vereitelt Hardlinks! Die betreffende Datei wird zusätzlich gespeichert. Werden die Rechte aller Dateien geändert, wird eine zusätzliche Vollsicherung gespeichert. Zeitersparnis mit meinen realen Daten schwankend um die 15 %. rsyback.zykl [3] verzichtet /nicht/ auf cp -al dafür aber auf den separaten Löschvorgang der ältesten Backupebene, in dem sie rsync als Basis vorgelegt wird. Letztlich löscht also rsync die überflüssigen Dateien. In der Originalpublikation steht, dass die Methoden [2] und [3] nicht kombiniert werden sollen, weil so zahlreiche unveränderte Dateien nicht hardverlinkt sondern separat gespeichert werden. Neu ist nun meine Erkenntnis, dass dieses Problem auch ohne diese Methodenkombination in rsyback.zykl auftritt! Was passiert da? Nehmen wir eine Datei, die sich zwischen früheren Backups verändert hat, nicht aber vor dem aktuell anstehenden Backup. In der ältesten Backupebene, die als Basis für das neue Backup genommen wird befindet sich demnach eine abweichende Datei. Folglich gibt es keinen Hardlink! Bei einer einzelnen Dateiänderung wird mit jedem Backupvorgang eine zusätzliche Datei (identisch) gespeichert, bis alle Backupebenen je eine besitzen. Mit jedem weiteren Vorgang wird dann die Redundanz wieder schrittweise abgebaut. Die Zeitersparnis liegt um die 35 %. rsyback.splitt [4] basiert auf [1], nur wurde die Befehls- Reihenfolge geändert. Das Script wird bei mir während des bootens gestartet, weil zu diesem Zeitpunkt alle Dateien konsistent sind. (Start in boot.local unter Suse.) Zu diesem Zeitpunkt muss aber nur rsync fertig werden, die zeitraubenden cp -al und rm -rf gehen in den Hintergrund. cp sollte fertig sein, bevor der Rechner wieder heruntergefahren wird (auf Konsole 1 ggf. nachschauen) aber beim rm ist sogar das unkritisch, sodass es ein nice mit auf den Weg bekommt. Die Zeitersparnis liegt um die 35 %, allerdings läuft da der Hintergrundprozess noch. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Meine Wahl fällt klar auf [4]. Vielleicht kann sich mal jemand äußern, ob der Hintergrundprozess in [4] besser in {} oder () eingeschlossen werden sollte. Funktioniert hat beides. Es folgen alle diskutierten Scripte. (Die Anzahl der Backupsaetze i=4 ist ein Testwert. Ich werde ihn wahrscheinlich auf 730 setzen (2 Jahre Tages-History.) ##################################### rsyback.cp [1]: #! /bin/bash # rsync-backup # ausfuehrbar abgelegt unter /home # Anzahl der Backupsaetze 0...i: i=4 echo -e "\a" mount /dev/md0 /mnt cd /mnt/backup #ts_now=$(date +%s) #ts_dir=$(date --reference=backup.0 +%s) #age=$[ts_now-ts_dir] # in Sekunden #if [ $age -lt 43200 ]; then # echo "Backup uebersprungen. ##########################################" # exit #fi echo $(date -I;date +%T) hoechste Backupdatei $i loeschen... rm -rf backup.$i echo $(date -I;date +%T) Backupdateien 1 bis $[i-1] um eins hochschieben... while [ $i -ge 2 ] ; do mv backup.$[i-1] backup.$i i=$[i-1] done echo $(date -I;date +%T) Backupdatei 0 mit Befehl cp -al auf Backuptdatei 1 kopieren... cp -al backup.0 backup.1 echo $(date -I;date +%T) /home mit rsync auf Backupdatei 0 kopieren... rsync -a --delete-excluded \ --exclude=NOT_rsyback/ \ --exclude=.local/share/Trash/ \ --exclude=.kde/share/apps/ktorrent/ \ --exclude=.beagle/ \ /home backup.0 touch backup.0 # exclude-Pfad darf nur soweit angegeben werden, wie er im ZIELvereichnis erscheint. # Abschließendes / bezeichnet ein Directory, ohne / Datei oder Directory. mount -o remount,ro /mnt echo $(date -I;date +%T) Backupmedium wurde ro gemountet. Ende ##################################### rsyback.linkdest [2] #! /bin/bash # rsync-backup # ausfuehrbar abgelegt unter /home # Anzahl der Backupsaetze 0...i: i=4 echo -e "\a" mount /dev/md0 /mnt cd /mnt/backup #ts_now=$(date +%s) #ts_dir=$(date --reference=backup.0 +%s) #age=$[ts_now-ts_dir] # in Sekunden #if [ $age -lt 43200 ]; then # echo "Backup uebersprungen. ##########################################" # exit #fi echo $(date -I;date +%T) Start backup rm -rf backup.$i echo $(date -I;date +%T) hoechste Backupdatei $i geloescht j=$i while [ $i -ge 1 ] ; do mv backup.$[i-1] backup.$i i=$[i-1] done echo $(date -I;date +%T) Backupdateien 0 bis $[j-1] um eins hochgeschoben # If --link-dest=DIR is a relative path, it is relative to the destination directory: rsync -a --delete-excluded --link-dest=../backup.1 \ --exclude=NOT_rsyback/ \ --exclude=.local/share/Trash/ \ --exclude=.kde/share/apps/ktorrent/ \ --exclude=.beagle/ \ /home backup.0 touch backup.0 echo $(date -I;date +%T) /home auf Backupdatei 0 kopiert mit rsync, Ende. ##################################### rsyback.zykl [3] #! /bin/bash # rsync-backup (rsyback = rsyback.zykl) # ausfuehrbar abgelegt unter /home # Anzahl der Backupsaetze 0...i: i=4 echo -e "\a" mount /dev/md0 /mnt cd /mnt/backup #ts_now=$(date +%s) #ts_dir=$(date --reference=backup.0 +%s) #age=$[ts_now-ts_dir] # in Sekunden #if [ $age -lt 43200 ]; then # echo "Backup uebersprungen. ##########################################" # exit #fi j=$i echo $(date -I;date +%T) Backupdateien 0 bis $j um eins hochschieben... while [ $i -ge 0 ] ; do mv backup.$i backup.$[i+1] i=$[i-1] done echo $(date -I;date +%T) Backupdatei $[j+1] auf Backupdate 0 schieben... mv backup.$[j+1] backup.0 echo $(date -I;date +%T) Backupdatei 1 auf Backuptdatei 0 kopieren mit Befehl cp -al ... cp -al backup.1/. backup.0 echo $(date -I;date +%T) /home auf Backupdatei 0 mit rsync kopieren... rsync -a --delete-excluded \ --exclude=NOT_rsyback/ \ --exclude=.local/share/Trash/ \ --exclude=.kde/share/apps/ktorrent/ \ --exclude=.beagle/ \ /home backup.0 touch backup.0 # exclude-Pfad darf nur soweit angegeben werden, wie er in ZIEL- und QUELL-Vereichnis # übereinstimmt. Abschließendes / bezeichnet ein Directory, ohne / Datei oder Directory. mount -o remount,ro /mnt echo $(date -I;date +%T) Backupmedium wurde ro gemountet. Ende ##################################### rsyback.splitt [4] #! /bin/bash # rsync-backup # ausfuehrbar abgelegt unter /home # Anzahl der Backupsaetze i: i=4 echo -e "\a" mount -o ro /dev/md0 /mnt cd /mnt/backup ts_now=$(date +%s) ts_dir=$(date --reference=backup.0 +%s) age=$[ts_now-ts_dir] # in Sekunden if [ $age -lt 43200 ]; then echo "Backup uebersprungen. ##########################################" exit fi mount -o remount,rw /mnt echo $(date -I;date +%T) /home mit rsync auf Backupdatei 0 kopieren... rsync -a --delete-excluded \ --exclude=NOT_rsyback/ \ --exclude=.local/share/Trash/ \ --exclude=.kde/share/apps/ktorrent/ \ --exclude=.beagle/ \ /home backup.0 touch backup.0 # exclude-Pfad darf nur soweit angegeben werden, wie er in ZIEL- und QUELL-Vereichnis # übereinstimmt. Abschließendes / bezeichnet ein Directory, ohne / Datei oder Directory. echo $(date -I;date +%T) hoechste Backupdatei $i in backup.delete schieben... mv backup.$i backup.delete echo $(date -I;date +%T) Backupdateien 1 bis $[i-1] um eins hochschieben... while [ $i -ge 2 ] ; do mv backup.$[i-1] backup.$i i=$[i-1] done { echo $(date -I;date +%T) Im Hintergrund: Backupdatei 0 mit Befehl cp -al auf Backupdatei 1 kopieren... cp -al backup.0 backup.1 echo $(date -I;date +%T) Im Hintergrund: backup.delete loeschen... nice rm -rf backup.delete mount -o remount,ro /mnt echo $(date -I;date +%T) Im Hintergrund: Backupmedium wurde ro gemountet. Ende } & -- Viele Grüße Werner Holtfreter -- http://mailman.uugrn.org/mailman/listinfo/uugrn Wiki: http://wiki.uugrn.org/wiki/UUGRN:Mailingliste Archiv: http://lists.uugrn.org/Empfangen am 16.07.2008
Dieses Archiv wurde generiert von hypermail 2.2.0 : 16.07.2008 CEST