mondragor
Goto Top

Rsync - Dateien auf Ziel behalten, die älter sind als auf Quelle

Hallo allerseits,

ich habe eine Frage bezüglich RSYNC unter MacOS X (z.B. SnowLeopard oder Mountain Lion...).
Gibt es eine Möglichkeit, mit rsync auf dem Ziel auch Dateien zu behalten, die älter und / oder größendifferent sind, als die gleichnamige Datei in der Quelle?
Ich dachte, mich entsinnen zu können, dass ich da mal was gelesen habe, finde das aber nicht mehr. Ich meine, mich zu erinnern, dass da für diese Fälle an die ältere Datei auf dem Ziel jeweils ein _backup angehängt worden ist.

Grüße und vielen Dank schonmal

Content-ID: 211512

Url: https://administrator.de/contentid/211512

Ausgedruckt am: 23.11.2024 um 01:11 Uhr

Hitman4021
Hitman4021 15.07.2013 um 14:46:44 Uhr
Goto Top
Hallo,

rsync hat ws die selben Parameter unter Linux:
 -u, --update                skip files that are newer on the receiver
     --inplace               update destination files in-place
     --append                append data onto shorter files
     --append-verify         --append w/old data in file checksum

http://linux.die.net/man/1/rsync

Gruß
Lochkartenstanzer
Lochkartenstanzer 15.07.2013 aktualisiert um 15:01:08 Uhr
Goto Top
Die Parameter von rsync sind weitgehend überall gleich. Für Dich dürfte
     --ignore-existing       skip updating files that exist on receiver

in Frage kommen.

lks

Nachtrag:
 -b, --backup                make backups (see --suffix & --backup-dir)
     --backup-dir=DIR        make backups into hierarchy based in DIR
     --suffix=SUFFIX         backup suffix (default ~ w/o --backup-dir)
Mondragor
Mondragor 15.07.2013 um 15:13:56 Uhr
Goto Top
Hallo und danke schonmal für Eure schnellen Antworten.

Mein Problem ist vielleicht, dass ich nicht sicher bin, ob ich die man-file richtig verstehe oder dass die dort stehenden Erklärungen mir nicht ausführlich genug sind.
Ich hab mir das schon angeschaut.
Was ich erreichen will, ist, dass die neueren schon mit übertragen werden, die alten aber in einer entsprechend gekennzeichneten Form bestehen bleiben, quasi als ältere Versionen der Datei. Das, was mir da das logischste scheint, wäre die entsprechende Option
-b --suffix='_backup'
Was aber würde da passieren, wenn sich eine Datei mehrfach verändert?
..._backup; ..._backup_backup; ..._backup_backup_backup ?
Und wie sähe dabei die Eigenschaft "letzter Schreibzugriff" aus? Wäre ja vorteilhaft, wenn man sehen könnte, wann die zuletzt "beschrieben" wurde.

Grüße,
Mondragor
Lochkartenstanzer
Lochkartenstanzer 15.07.2013 um 15:32:17 Uhr
Goto Top
Zitat von @Mondragor:
Das, was mir da das logischste scheint,
wäre die entsprechende Option
-b --suffix='_backup'

Darauf würde auch tippen.

Was aber würde da passieren, wenn sich eine Datei mehrfach verändert?
..._backup; ..._backup_backup; ..._backup_backup_backup ?
Und wie sähe dabei die Eigenschaft "letzter Schreibzugriff" aus? Wäre ja vorteilhaft, wenn man sehen
könnte, wann die zuletzt "beschrieben" wurde.

Am besten mit Testdaten ausprobieren. Nichts fördert das Verständnis mehr als es selbst gemacht zu haben.

lks
Mondragor
Mondragor 15.07.2013 um 15:37:15 Uhr
Goto Top
Hallo nochmal Lochkartenstanzer!

Okay, vielen Dank für Deine Hilfe.

Grüße,
Mondragor
Lochkartenstanzer
Lochkartenstanzer 15.07.2013 um 16:50:48 Uhr
Goto Top
Nachtrag:

Natürlich wird das nicht mehrfach umbenannt, sondern die "neuen" alten Dateien überschreiben die "alten" alten Dateien. Wenn die alten Dateien wichtig sind, sollten diese weggesichert werden, nachdem das rsync durch ist (oder vielleicht schon vorher face-smile).


lks
Hitman4021
Hitman4021 15.07.2013 um 18:36:02 Uhr
Goto Top
Hallo,

villeicht hilft dir das weiter:

#!/bin/bash
SERVER=("srv1.domain.at" "srv2.domain.at")  
today=`date +%u`
if [$today == "5"]; then  
        x=`date +"%V"`  
        y=`date +"%V" -d $(date +"%Y%m01")`  
        week=$((x-y))
        month=`date +%m`
        today="$today-$month-$week"  
fi
RSYNC_OPTIONS="-avzu"  


for i in ${SERVER[@]}
    do
        mkdir -p /home/backup/backup-$today/$i/
        rsync $RSYNC_OPTIONS -e "ssh -i /root/backup/crt/$i.cert" root@$i:/DATA /home/backup/backup-$today/$i/  
done

So sieht mein Standard Linux Backup aus. Und ich kann auch die verschiedenen Tage herstellen.

Gruß
Mondragor
Mondragor 16.07.2013 aktualisiert um 12:39:13 Uhr
Goto Top
Hallo nochmal.
Also offensichtlich ist, dass man bei gleichbleibendem Suffix alte Backups überschreibt und den Ansatz von Hitman find ich gut.
Mein Ansatz sieht etwas anders aus. Ich muss dazu sagen, dass etwa 6.5 TB an Daten via RSYNC synchronisiert werden müssen.
Daher habe ich nicht den Platz, um im Ziel mehrere vollständige Backups anzulegen, Einzig die veränderten Dateien sollen in
mehreren Versionen (je nach mdate und Größe) gesichert werden. Es kam schon vor, dass sowas wiederhersestellt werden sollte,
ich die älteren Versionen aber nicht mehr über die Kommerzielle Backupsoftware hatte.
Daher sichere ich das nun zusätzlich mit rsync alle 2 Wochen auf externe Raid-Türmchen.
Für das Sichern von mehr als 2 Versionen habe ich mir folgende Befehlszeile überlegt, die auch funktioniert.
rsync -avvz -b --suffix=$(date +"__backup_vom_%d.%m.%Y_um_%T") /quelle /ziel  
Da nun jedes potenzielle Backup einer Dateiversion anders heißt, wird keine mehr überschrieben.

Vielen Dank Euch für Eure Hilfe und die Denkanstöße.
Hitman4021
Hitman4021 16.07.2013 um 09:44:57 Uhr
Goto Top
Hallo,

ich arbeite auch gerade wieder mal an meinem Backup.
Ziel ist es die Datein die identisch sind per HardLinks zu verknüpfen.
Dadurch sollte ich doch einiges an Speicherplatz sparen da alle Daten nur einmal vorhanden sind.
Ich poste das Script hier sobald ich es fertig habe.

Gruß

PS.: Bei mir geht es inzwischen um ca 20TB deshalb muss ich mir langsam was einfallen lassen ;)
Mondragor
Mondragor 16.07.2013 um 10:18:39 Uhr
Goto Top
Okay, bin auf die Lösung gespannt und lasse den thread solang noch offen.
Wie geht das eigentlich mit quellcode posten und wo gibt es eine Übersicht
über solche "Befehle" fürs Forum??

Grüße,
Mondragor
Lochkartenstanzer
Lochkartenstanzer 16.07.2013 aktualisiert um 10:49:14 Uhr
Goto Top
Zitat von @Hitman4021:
Hallo,

ich arbeite auch gerade wieder mal an meinem Backup.
Ziel ist es die Datein die identisch sind per HardLinks zu verknüpfen.

Also ich mache das so, daß ich zuerst mit cp -avl einen neuen Backup-Ordner aus dem letzten Backup-Ordner erzeuge und dann per rsync --av --delete das aktuelle Backup da einspiele. Damit belegen identische dateien keinen doppelten Platz und alles was sich geändert hat, ist mehrfach vorhanden. Und durch die ANzahl derordner kann man bestimmen, wie weit der backup zurückrecht.

lks

Nachtrag: Man kann natürluch auch fdupes -L düberlaufen lassen, um weitere identsche Dateien per hardlink zu verknüpfen.
Hitman4021
Hitman4021 16.07.2013 aktualisiert um 11:05:58 Uhr
Goto Top
Hallo,

Nachtrag: Man kann natürluch auch fdupes -L düberlaufen lassen, um weitere identsche Dateien per hardlink zu verknüpfen.
Kannte ich bis jetzt nicht. Hätte mir gerade etwas Arbeit gespart.

Wie auch immer. So sieht das jetzt mal ungefähr aus. Ist aber weder fertig getestet noch bereinigt:
#!/bin/bash
SERVER=("srv.domain.at")  
today=`date +%u`
if [ $today == "5" ];   
then
    x=`date +"%V"`  
    y=`date +"%V" -d $(date +"%Y%m01")`  
    week=$((x-y))
    month=`date +%m`
    today="$today-$month-$week"  
fi
if [ $today = "1" ]  
then
	YESTERDAY="7"  
else
	YESTERDAY=$(($today-1))
fi
RSYNC_OPTIONS="-avzu"  
BIN_DIR="/root/bin/cron"  
CRT_DIR="$BIN_DIR/crt/"  
DEST_DIR="/home/backup/backup-$today"  
YESTERDAY_DEST_DIR="/home/backup/backup-$YESTERDAY/"  
SEARCH_TODAY="backup-$today"  
SEARCH_YESTERDAY="backup-$YESTERDAY"  

for i in ${SERVER[@]}
    do
		SRV_DEST_DIR="$DEST_DIR/$i"  
		SRV_YESTERDAY_DEST_DIR="$YESTERDAY_DEST_DIR/$i/"  
        mkdir -p $SRV_DEST_DIR/DATA/
		
		#Sync LOCAL From Yesterday
		rsync $RSYNC_OPTIONS $SRV_YESTERDAY_DEST_DIR $SRV_DEST_DIR
		
		#Sync From other Server
        rsync $RSYNC_OPTIONS -e "ssh -i $CRT_DIR/$i.cert" root@$i:/DATA/ $SRV_DEST_DIR/  

		#Compare with YesterDay
		for yesterDayFile in $(find $YESTERDAY_DEST_DIR/$i/* -type f -print);
		do
			todayFile=`echo $yesterDayFile | sed "s/$SEARCH_YESTERDAY/$SEARCH_TODAY/"`  
			todayMD5=`md5sum $todayFile | awk '{ print $1 }'`  
			yesterDayMD5=`md5sum $yesterDayFile | awk '{ print $1 }'`  
			if [ $todayMD5 = $yesterDayMD5 ];
			then
				ln -f $yesterDayFile $todayFile
			fi
		done
done

Gruß
Mondragor
Mondragor 16.07.2013 um 13:00:13 Uhr
Goto Top
Okay, danke.

Eine Frage hätte ich aber noch:
Wir benutzen Helios mit pcshare und ethershare. Bei einigen Dateien kommt es vor, dass die auf dem Ziel ohne Umlaute / Sonderzeichen erscheinen und dann wird der rsync sie immer wieder rüber schieben. Auch ist das keine ganz saubere sache.
Weiß jemand, wie ich das wegbekommen kann und die Zeichen sauber dargestellt bekommen kann???
Hitman4021
Hitman4021 17.07.2013 aktualisiert um 10:36:13 Uhr
Goto Top
Hallo,

ich habe den Compare Tiel nochmal überarbeitet, beim Testen war mir die Performance zu schlecht.
Außerdem wurden Fehler erzeugt wenn eine Datei nicht existiert hat.
	#Compare with YesterDay and Replace Duplicates with HardLinks
	echo "Link $i"  
	echo `date`
	for yesterDayFile in $(find $YESTERDAY_DEST_DIR/$i/* -type f -print);
	do
		todayFile=`echo $yesterDayFile | sed "s/$SEARCH_YESTERDAY/$SEARCH_TODAY/"`  
		if [ -f $todayFile ] && [ -f $yesterDayFile ];
		then
			if [ $todayFile -ef $yesterDayFile ]; 
			then
				continue
			else
				cmp -s $todayFile $yesterDayFile
				if [ $? = 0 ];
				then
					ln -f $yesterDayFile $todayFile
				fi
			fi
		fi
	done

Wir benutzen Helios mit pcshare und ethershare. Bei einigen Dateien kommt es vor, dass die auf dem Ziel ohne Umlaute / Sonderzeichen erscheinen und dann wird der rsync sie immer wieder rüber schieben. Auch ist das keine ganz saubere sache.
Weiß jemand, wie ich das wegbekommen kann und die Zeichen sauber dargestellt bekommen kann???
Du musst auf beiden Seiten das selbe Character Set benutzen.
Aber da kann dir bestimmt jemand weiterhelfen der sich mit OS X besser auskennt als ich.

Gruß
Mondragor
Mondragor 18.07.2013 um 08:55:06 Uhr
Goto Top
Okay, also eines ist eine Freigabe über AFP, die auf dem Mac gemountet ist. Das andere ist ein USB-MassStorage (externes Festplattengehäuse mit Raid-Möglichkeiten) was als MacOS Extended (Journaled) formatiert ist.
Meine nächste Frage wäre also, wie ich erfahre, welches Charset auf welchem Volume aktiviert ist.

Grüße,
Mondragor
Hitman4021
Hitman4021 19.07.2013 um 12:55:49 Uhr
Goto Top
Hallo,

ich hoffe das funktioniert auf Max OS X auch.
Poste mal die Ausgabe von:
echo $LANG
echo $LC_ALL
Auf beiden Rechnern.

Gruß
Mondragor
Mondragor 07.02.2014 aktualisiert um 10:22:52 Uhr
Goto Top
Hallo Hitman,

besser spät als nie - wie man so schön sagt.

Nun die AFP-Freigaben unter Helios geben im Helios-Admin für AFP den Zeichensatz
"MacRoman" vor.
Das "Mac OS Roman" ist im Terminal als Zeichensatz auswählbar, aber nicht aktiv.
Glaubst Du, dass es deswegen manchmal Probleme ala "File has varnished" geben könnte?

Ich habe inzwischen einen Einzeiler aus dem Backupbefehl gemacht:
rsync -aXvvuc --times --progress -b --suffix=$(date +"backup_vom_%d.&m.%Y_um_%T") /quelle /ziel  
Somit werden also nur Dateien, die eine andere md5sum aufweisen, auch neu kopiert, da der Zeitstempel
nicht immer was zu bedeuten hat. Das löscht also ältere Versionen nicht. Das Problem jetzt ist, dass die
".DS-Store"-Dateien natürlich für sehr viele subdirectories sehr häufig verändert sind bei 20 Freigaben...
Dafür würde ich gerne via --exclude oder --filter quasi diese ausschließen. Hast Du sowas schon mal gemacht?

Grüße,
Mondragor