Thread zur Backup-FAQ

Habe mich mittlerweile auch durch den Thread durchgearbeitet, um mir eine Backuplösung zu basteln. Folgendes Shellscript ist dabei entstanden, vielleicht leistet es ja noch anderen gute Dienste.

Es sollte eigentlich nur noch nötig sein die ersten 5 Variablen zu definieren.

Code:
#!/bin/bash

# Dieses Shellscript erstellt eine Kopie eines Verzeichnisses auf einem beliebigen Volumen mit Hilfe
# von rsync. Das Script kann in periodischen Zeitabständen durch crontab oder launchdaemon gestartet werden. 
# Eine Kopie wird erstellt, wenn das vorgegebene Sicherungsintervall überschritten wird.
# 
# Die Anzahl der vorhandenen Sicherungskopien können frei definiert werden, wobei die nötigen Verzeichnisse
# automatisch erstellt und für bereits ungeänderte und auf dem Backupvolumen vorhandene Dateien sog. Hardlinks
# erstellt werden, um den benötigten Speicherplatz möglichst gering zu halten.
#
# Das Script verwendet wahlweise folgende Programme im Verzeichniss /usr/local/bin/ 
# – rsync (version 2.6.0  protocol version 27 Copyright HFS+ filesystem support for OSX)
# – rm
# – mv
# Diese wurden mit den Rechten "sudo chmod 6755", "sudo chown root" und "sudo chgrp staff" versehen, damit
# restlos alle Dateien im Quellenverzeichniss kopiert werden.
#
# Datum: 04.03.06

# Voreinstellungen für rotierendes Backup

# absolute Pfadangabe des Quellenverzeichnisses
declare quelle=""

# absolute Pfadangabe des Backupvolumen
declare backup_volume=""

# Name des Backups
declare backup_name=""

# Sicherungsintervall in Sekunden
declare -i backup_intervall=86400 # 1 Tag

# Anzahl der letzten verfügbaren Sicherungskopien
declare -i backup_rotation=3





# Pfad zu den vorzugweise verwendeten Programmen
PATH=/usr/local/bin:$PATH

# sollvariablen für das sicherungsintervall in sekunden
declare -i sollzeit_users=$backup_intervall
	
# istvariablen des sicherungsintervalls
if [ -e $quelle"/"backup_protokoll ]
then
	declare -i istzeit_users=$(($(date +%s)-$(stat -f %m $quelle"/"backup_protokoll)))
else
	declare -i istzeit_users=$(($backup_intervall+10))
	date > $quelle"/"backup_protokoll
fi
	
if [ $istzeit_users -gt $sollzeit_users ]
then

		if [ ! -e $backup_volume ]
		then
			/usr/sbin/diskutil mount /dev/disk1s10
		fi
		
		# Backup Disk gemountet ?
		if [ -e $backup_volume ]
		then
			# Ins Backupvolume wechseln
			cd $backup_volume
	
			# Verzeichniss des Backups erstellen
			if [ ! -e $backup_name ]
			then
				mkdir $backup_name
			fi
	
			# Ins Backupverzeichniss wechseln
			cd $backup_name 

			# Überprüfen ob mac im lokalen Netzwerk verfügbar ist.
			#mac=`ping -qn -c 1 192.168.1.4 | grep -c "1 packets received"`
			declare -i mac=1
		
			if [ $mac = 1 ]
			then
				# Backupordner anlegen
				mkdir backup.0

				#Log Variable schreiben (Anfangszeit)
				declare backupBeg=$(date)

				# Backup starten
				time rsync --rsync-path=/usr/local/bin/rsync -a --eahfs --showtogo --link-dest=""$backup_volume"/"$backup_name"/"backup.1"" ""$quelle"" ""$backup_volume"/"$backup_name"/"backup.0"" > $quelle"/"backup_protokoll

				# Wenn Backup erfolgreich (komplett oder teilweise gesichert), dann akzeptieren und ältestes Backup löschen, ansonsten Backup verwerfen. Fehler 23 -> Dateien oft nicht kopiert wegen fehlender Rechte
				if test $? = 0 -o $? = 23
				then
					i=$backup_rotation
					while [ $i -ge 0 ]										 
					do
						if [ ! -e backup.$i ]
						then
							mkdir backup.$i
						fi
					
  						mv -f backup.$i backup.$(($i+1))
  						i=$(($i-1))	
					done
					rm -rf backup.$(($backup_rotation+1))
				
					#Log schreiben (Endzeit)
					echo "Backup begonnen um:" >> backup.log
					echo $backupBeg >> backup.log
					echo "Backup beendet um:" >> backup.log
					date >> backup.log
					echo "--------------------------------------" >> backup.log
				else
					rm -rf backup.0
					echo Backup nicht erfolgreich
				fi
			fi

		fi
fi
 
Zuletzt bearbeitet:
hy

Rsync hat wunderbar bis zu neuinstallation funktioniert.
wenn ich was neu auf dem Mac kopiert tut er es auch auf die Archivplatte.

Jetzt trifft folgende Fehlermeldung auf wenn etwas auf der Archivplatte zu viel ist: (sudo & -avE)

rsync: delete_one: unlink "/Volumes/backup/Documents/Sing that iTune!/Pharcyde/Runnin.txt" failed: Unknown error: 0 (0)
rsync: delete_one: unlink "/Volumes/backup/Documents/Sing that iTune!/Nelly/Dilemma.txt" failed: Directory not empty (66)
 
chrigu schrieb:
...
Es sollte eigentlich nur noch nötig sein die ersten 5 Variablen zu definieren, vorausgesetzt die Programme mv, rm und rsync befinden sich unter: /usr/local/bin .
Nachdem diese Programme aber standardmäßig dort nicht liegen, empfehle ich folgende Änderung.
Am Beginn des Skriptes:
PATH=$PATH:/usr/local/bin
oder
PATH=/usr/local/bin:$PATH
Im Skript dann den Pfad bei den Programmen weglassen. Sie werden dann im aktuellen Suchpfad und in "/usr/local/bin" gesucht.
Je nach dem, welche Variante man wählt, werden die Programme zuerst oder zuletzt in "/usr/local/bin" gesucht.
Damit kann man steuern, welche Programm Version verwendet wird, falls es mehrere gibt.
 
Nachdem diese Programme aber standardmäßig dort nicht liegen, empfehle ich folgende Änderung.
Am Beginn des Skriptes:
PATH=$PATH:/usr/local/bin
oder
PATH=/usr/local/bin:$PATH
Danke Meister, ich hab das sogleich in die Tat umgesetzt und oben korrigiert.
 
sheep schrieb:
Nein, ist es nicht. Siehe Ausschnitt aus dem Script:

Code:
/usr/bin/rsync -avE $quelle/ $ziel/
/usr/bin/rsync -avE $ziel/ $quelle/

Damit wird zuerst (1. Zeile) alle, was in der Quelle anders / neu ist, ins Ziel kopiert und dann (2. Zeile) alles, was im Ziel anders / neu ist, in die Quelle kopiert.

Das sollte so eigentlich funktionieren (wobei ich Fehler natürlich nie zu 100% ausschliessen kann, irgendwo schleicht sich immer etwas ein ;)) - wenn du das Script so übernommen hast, könnte der Fehler woanders liegen, hast du irgendwelche Meldungen erhalten?

ich habe irgendwie das selbe problem, mit neu hinzugefügten Dokumenten geht es, geändete werden jeweils in die Richtung "Ziel" gesynct und wenn da das neu geändete Dokuntent liegt sind die Änderungen futsch! gibts da ne lösung, das script ist soweit richtig übernommen!
hier mein script
#! /bin/sh

#Variablen für die Pfade
declare quelle="$HOME/Desktop/Test"
declare ziel="/Volumes/192.168.178.21/Dokumente/Test"

#Synch ausführen

/usr/bin/rsync -avE $quelle/ $ziel/
/usr/bin/rsync -avE $ziel/ $quelle/

bisher habe ich zwei scrips für die jeweilige Richtung, nur wenn ich mich damit mal vertue sind die geänderten Daten futsch!
 
Zuletzt bearbeitet:
diskutil mount ins syncscript einbauen?

Erstmal Vielen Dank für die wirklich tolle Anleitung!
Habe alles wie beschrieben gemacht, funktioniert einwandfrei.
Ich würde gerne den diskutil mount Befehl, der in dem crontab- Anleitungsteil vorkommt, in das syncscript einbauen, sodass automatisch erst die Platte gemountet wird, wenn ich das script mit ./sync_Herz starte (s.u.). (Vielleicht geht ja sogar am Ende wieder ein unmount?)
Danke für die Nachhilfe, grusz oe7


#!/bin/sh

#Variablen fuer die Pfade
declare quelle="/Volumes/Audio/Herz_der_Finsternis"
declare ziel="/Volumes/Thebigboss/Sicherheitskopien/Herz_der_Finsternis"

#Synchronisation ausführen
/usr/bin/rsync -avE $quelle/ $ziel/
/usr/bin/rsync -avE $ziel/ $quelle/
 
@oe7

das geht "eigentlich" ganz einfach: am Anfang diskutil mount /dev/disk.... eingeben und am Ende diskutil unmount /dev/disk....

Ich habe das auch so bei mir gemacht, da ich alle 4 Stunden ein Backup meines Home-Verzeichnisses machen lasse und in der Zwischenzeit habe ich keinen Bock auf eine ewig spinnende HDD. Der Ruhezustand war für mich auch keine Lösung, da die ext. HDD immer wieder anlief, sobald ich den Finder öffne.

Der einzige (auch für mich immer noch ungelöste) Haken an der Sache ist aber folgender:

Wenn man in der Zwischenzeit (also in meinem Beispiel 4 Stunden) z.B. einen USB Stick anschließt, haut die /dev/disk-Zuordnung nicht mehr hin.

Ich weiß leider nicht, wie man der ext. HDD einen absoluten Mount-Point zuweist. Unter Linux soll das relativ einfach gehen.

Wenn du aber nicht so oft andere ext. Geräte anschließt, ist das nicht so schlimm, kann aber u.U auch zu Problemen führen.

Vielleicht hat ja noch Jemand einen Tipp für uns?
 
Danke für den Hinweis

Funktioniert alles bestens. Das mit dem USB-Stick kann ich nicht reproduzieren, bei mir sieht diskutil list so aus:

/dev/disk0
#: type name size identifier
0: Apple_partition_scheme *74.5 GB disk0
1: Apple_partition_map 31.5 KB disk0s1
2: Apple_HFS System 15.1 GB disk0s3
3: Apple_HFS Audio 59.2 GB disk0s5
/dev/disk1
#: type name size identifier
0: Apple_partition_scheme *465.8 GB disk1
1: Apple_partition_map 31.5 KB disk1s1
2: Apple_HFS Thebigboss 465.6 GB disk1s3

für diskutil mount musst du /dev/disk1s3 (/dev/disk1 reicht nicht!) angeben, USB-Stick dran und weg hat nichts verändert.

gruss oe7
 
freut mich, dass es bei dir funktioniert. Das man /dev/diskXsY eingeben muss ist mir schon klar.

Ich habe jetzt mal folgendes gemacht:
1. Keine externen Datenträger am Mini
2. mit USB Stick
3. mit ext. HDD
4. mit ext. HDD und USB Stick

Je nachdem hat der USB Stick bei mir den Identifier:
1. -
2. disk2s1
3. -
4. disk1s1

die ext. HDD hat natürlich ihren Identiefier nicht verändert, da sie ab der Nr. 3 permanent dran war. Wenn ich jetzt aber die ext. HDD auswerfe und dann den Stick ran mache und dann wieder die HDD passiert das gleiche wie oben beschrieben mit dem USB Stick.
Verstehst du was ich meine?

Ich würde gerne irgendwo eingeben können, dass der und der MountPoint immer immer nur für das Gerät mit der Bezeichnung XY reserviert ist oder wie auch immer man das lösen könnte. Habe da nicht so den Plan, was Lösungswege angeht.
 
jetzt verstehe ich: du steckst eine USB-Platte ab, einen Stick dran -wieder ab -Platte wieder dran. Das hört sich in der Tat nach einem komplizierteren Problem an.Bei mir hängt die externe Platte permanent am Firewire 800 Port, wenn sie nicht gemountet ist, dreht sie auch nicht (jedenfalls nicht hörbar).
Da kann ich blutiger Depp (wie man im Saarland so schön sagt) dir leider überhaupt nicht weiterhelfen.

grusz oe7
 
ich habe mich jetzt noch mal (aus aktuellem Anlass) mit der Thematik befasst. Rsycn gepachted, die Scripte noch mal überarbeitet usw.

Ist alles ganz einfach aufgebaut bei mir, da ich echt nicht so die Chegge habe. Läuft aber. *freu*

Nun habe ich es so eingerichtet, dass ich von dem Backup eingentlich nicht so viel mitbekomme. Die ext. Platte sehe ich nicht usw.

Daher wäre ich nun doch daran interessiert eine Email o.ä. zu bekommen, wenn was nicht geklappt hat.

Wo muss ich denn im Skript was eintragen, damit ich eine Email an meine ganz normale Email-Adresse bekomme?

Und in welchem Fall wird eine Email verschickt und was steht da drin?

Danke
 
problem mit ordner "Application Support"

ich möchte gerne das adressebuch in o.g. order syncen. der entsprechende eintrag lt. tutorial ist ja wie folgt

Code:
declare quelle="$HOME/Library/Application\ Support/AddressBook"

ich habe den verdacht, dass bei der ausführung des scripts, das leerzeichen in "application support" ein problem darstellt, denn es wird folgende meldung ausgegeben:

Code:
building file list ... rsync: link_stat "/Users/tobias/Library/Application\" failed: No such file or directory (2)
rsync: link_stat "/Users/tobias/Desktop/Support/AddressBook/." failed: No such file or directory (2)
done

er sucht also einerseits das verzeichnis "Application" andererseits das verzeichnis "Support".

wie könnte da eine lösung aussehen?
 
Radiohead schrieb:
Wenn du es in " setzt, brauchst du doch kein \ mehr verwenden...

hm,

also mein syncfile sieht jetzt so aus:

#!/bin/sh

#Variablen fuer die Pfade
declare quelle="$HOME/Library/Application Support/AddressBook"
declare ziel="$Home/Desktop/AddressBook"

#Synchronisation ausführen
/usr/bin/rsync -avE $quelle/ $ziel/
/usr/bin/rsync -avE $ziel/ $quelle/

die fehlermeldung jedoch, obwohl die verzeichnisse existieren (!?):

building file list ... rsync: link_stat "/Users/tobias/Library/Application" failed: No such file or directory (2)
rsync: link_stat "/Users/tobias/Desktop/Support/AddressBook/." failed: No such file or directory (2)
done
rsync: mkdir "/Desktop/AddressBook" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at /SourceCache/rsync/rsync-24/rsync/main.c(396)
rsync: connection unexpectedly closed (8 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at /SourceCache/rsync/rsync-24/rsync/io.c(359)
building file list ... rsync: link_stat "/Desktop/AddressBook/." failed: No such file or directory (2)
rsync: link_stat "/Users/tobias/Library/Application" failed: No such file or directory (2)
done
rsync: mkdir "/Users/tobias/Desktop/Support/AddressBook" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at /SourceCache/rsync/rsync-24/rsync/main.c(396)
rsync: connection unexpectedly closed (8 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at /SourceCache/rsync/rsync-24/rsync/io.c(359)
 
hatte mich mit $Home vertippt, habe ich korrigiert ($HOME), trotzdem noch eine fehlermeldung:

building file list ... rsync: link_stat "/Users/tobias/Library/Application" failed: No such file or directory (2)
rsync: link_stat "/Users/tobias/Desktop/Support/AddressBook/." failed: No such file or directory (2)
done

sent 25 bytes received 20 bytes 90.00 bytes/sec
total size is 0 speedup is 0.00
rsync error: some files could not be transferred (code 23) at /SourceCache/rsync/rsync-24/rsync/main.c(717)
building file list ... rsync: link_stat "/Users/tobias/Library/Application" failed: No such file or directory (2)
done
rsync: mkdir "/Users/tobias/Desktop/Support/AddressBook" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at /SourceCache/rsync/rsync-24/rsync/main.c(396)
rsync: connection unexpectedly closed (8 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at /SourceCache/rsync/rsync-24/rsync/io.c(359)
 
Hi

ich habe das gleiche Problem wie oben. Dass die Leerzeichen nicht akzeptiert werden.

Gibt es inzwischen ne Lösung?

Gruß

Sandjedi
 
Sandjedi schrieb:
Hi

ich habe das gleiche Problem wie oben. Dass die Leerzeichen nicht akzeptiert werden.

Gibt es inzwischen ne Lösung?
...
Ja, steht doch oben.
Pfad in " " schreiben.
 
Zurück
Oben Unten