[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Backupstrategie
[Thread Prev] | [Thread Next]
[Date Prev] | [Date Next]
- Subject: Re: Backupstrategie
- From: Werner Holtfreter <Holtfreter@xxxxxx>
- Date: Wed, 16 Jul 2008 15:02:27 +0200
- To: uugrn@xxxxxxxxxxxxxxx
Am Samstag, 12. Juli 2008 18:41:32 schrieb Werner Holtfreter: > das Exkludieren funktioniert auch nicht Nach einigen schlaflose Naechten 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/ Abschliessendes / bezeichnet ein Directory, ohne / eine Datei oder ein Directory. Aehnlich 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 Rechteaenderung vereitelt Hardlinks! Die betreffende Datei wird zusaetzlich gespeichert. Werden die Rechte aller Dateien geaendert, wird eine zusaetzliche Vollsicherung gespeichert. Zeitersparnis mit meinen realen Daten schwankend um die 15 %. rsyback.zykl [3] verzichtet /nicht/ auf cp -al dafuer aber auf den separaten Loeschvorgang der aeltesten Backupebene, in dem sie rsync als Basis vorgelegt wird. Letztlich loescht also rsync die ueberfluessigen Dateien. In der Originalpublikation steht, dass die Methoden [2] und [3] nicht kombiniert werden sollen, weil so zahlreiche unveraenderte 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 frueheren Backups veraendert hat, nicht aber vor dem aktuell anstehenden Backup. In der aeltesten Backupebene, die als Basis fuer das neue Backup genommen wird befindet sich demnach eine abweichende Datei. Folglich gibt es keinen Hardlink! Bei einer einzelnen Dateiaenderung wird mit jedem Backupvorgang eine zusaetzliche 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 geaendert. Das Script wird bei mir waehrend 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 laeuft da der Hintergrundprozess noch. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Meine Wahl faellt klar auf [4]. Vielleicht kann sich mal jemand aeussern, 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. # Abschliessendes / 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 # uebereinstimmt. Abschliessendes / 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 # uebereinstimmt. Abschliessendes / 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 Gruesse Werner Holtfreter -- http://mailman.uugrn.org/mailman/listinfo/uugrn Wiki: http://wiki.uugrn.org/wiki/UUGRN:Mailingliste Archiv: http://lists.uugrn.org/