Automatische Backups und Syncs unter OS X

sheep

Aktives Mitglied
Thread Starter
Dabei seit
21.03.2005
Beiträge
1.255
Reaktionspunkte
25
EINLEITUNG: AUTOMATISCHE BACKUPS UND SYNCS UNTER OS X

1. Übersicht


Es gibt hier im Forum sehr viele Anfragen dazu, wie man unter OS X am einfachsten und wenn möglich kostenlos Backups erstellt. Mal sollen es nur einzelne Ordner sein, ein ander mal soll das ganze System auf eine externe Festplatte geclont werden, oder auch nur zwei Verzeichnisse auf zwei Macs oder PCs regelmässig abgeglichen werden.

Das alles geht -- und dazu noch automatisiert -- mit OS X bzw. Unix schnell, einfach und völlig kostenlos. Ich werde daher hier versuchen, möglichst zielgerichtet, Schritt für Schritt und ohne grosse Erläuterungen der technischen Grundlagen (die kann man sich durch Bücher oder anderswo im Internet erwerben, hier geht es nur um das Resulatat) zu erklären, wie man mit dem Unix-Tool "rsync" und einem Cronjob automatisierte Backups und Syncs einrichtet.

Wie gesagt, es geht hier nur um eine funktionierende und effiziente Backup-Lösung -- angesprochen sind daher gerade (blutige) Anfänger, die mit Unix noch nie etwas zu tun hatten und solche, die weder Zeit noch Lust haben, sich mit den technischen Hintergründen zu befassen.


2. Erläutert werden hier:

- TEIL I: Backups (gelöschte Dateien behalten, Klons, bootbar) mit rsync
- TEIL II: Synchronisation (Verzeichnisse, zwischen zwei Macs oder mit einem PC) mit rsync
- TEIL III: die Automatisierung davon durch einen Cronjob

NEU: Inkrementelle Backups

Empfehlung:
Ich empfehle allen Benutzern den Einsatz von inkrementellen Backups. Diese Lösung bietet eine wesentlich höhere Datensicherheit als normale Backups, da mehrere alte Versionen behalten und rekonstruiert werden können (ähnlich wie beim kürzlich vorgestellten TimeMachine von OS X 10.5 Leopard).


3. Voraussetzung ist nur ein Mac mit OS X Tiger* und ein geeignetes Backup-Medium.

Optimal als Medium sind externe Festplatten mit Firewire-Anschluss (oder interne Festplatten), ebenfalls gut geeignet (ausser für System-Backups) ist ein anderer Mac oder PC, mit dem eine Netzwerkverbindung besteht. Ausserdem ist es möglich (für kleinere Datenmengen) USB-Sticks zu verwenden. Ebenfalls möglich ist die Verwendung eines webDAV-Dienstes wie z.B. .Mac oder GMX-Mediacenter (Tipp von MacApfel). Nicht geeignet sind hingegen DVDs oder CD-ROMs.

* Das rsync-Tool früherer Versionen von Mac OS X verfügt leider nicht über die Möglichkeit, die sog. Resource Forks (zuständig u.a. für die Namensgebung der Standardverzeichnisse) zu kopieren. Daher funktionieren die Scripts momentan leider nur auf OS X 10.4 vollständig; eine Notlösung bestünde allenfalls darin, jeweils die Option "-E" wegzulassen, das ist allerdings eher nicht zu empfehlen.

(vielen Dank an maceis für diesen Hinweis)


========================================
UPDATES
========================================

FAQ VERFÜGBAR
Ab sofort ist unter Ergänzungen eine Sammlung der meistgestellten Fragen verfügbar. Ich werde sie bei Bedarf und Gelegenheit erweitern.

========================================
 
  • Gefällt mir
Reaktionen: Waldschrahdt, hookz, Jim Panse und 7 andere
Teil I - Backups

TEIL I - BACKUPS

1. Übersicht

In diesem Abschnitt wird beschrieben, wie man Backups unter OS X erstellt und zwar für

- das Home-Verzeichnis
- (ein) einzelne(s) Verzeichnis(se)
- das komplette System (bootbar)

Als Backup-Medium ist -- besonders bei grossen Datenmengen -- eine externe Festplatte zu empfehlen. Für einen bootbaren Klon des Systems ist eine externe Festplatte mit Firewire-Anschluss (also kein USB!) oder eine interne Festplatte zwingend notwendig. Ansonsten genügt ein anderer Mac oder PC, der über Netzwerk angeschlossen ist.

Die folgenden Kapitel bauen bewusst nicht aufeinander auf, sondern können je nach persönlichem Bedarf benutzt werden, um ein Backup einzurichten.


2. Das Home-Verzeichnis

Um das komplette Home-Verzeichnis auf eine externe Festplatte oder einen Netzwerkrechner abzugleichen, geht man wie folgt vor:

1. "TextEdit" starten und im Menü "Format" den Punkt "In reinen Text umwandeln" wählen


2. Per copy & paste folgenden Text einfügen:
Code:
#!/bin/sh

#Variablen fuer die Pfade
declare quelle="$HOME"
declare ziel="<ziel>"

#Log schreiben (Anfangszeit)
/bin/echo "Backup begonnen um:" >> $ziel/backup.log
/bin/date >> $ziel/backup.log

#Backup ausführen und protokollieren
/usr/bin/time /usr/bin/rsync -avE $quelle/ $ziel/ > $ziel/protokoll.log

#Log schreiben (Endzeit)
/bin/echo "Backup beendet um:" >> $ziel/backup.log
/bin/date >> $ziel/backup.log
/bin/echo "--------------------------------------" >> $ziel/backup.log

Dabei muss der Parameter "<ziel>" ganz am Anfang durch einen entsprechenden Pfad ersetzt werden. Wenn z.B. die externe Festplatte oder das gemountete Netzwerk-Share "Backup" heisst (= Name, der auf dem Desktop angezeigt wird) und der Kurzname des aktuellen Benutzers "sheep" lautet, so:

Code:
/Volumes/Backup/sheep

Der Ordner "sheep" muss dabei auf dem Ziel-Medium vorher angelegt werden; er braucht auch nicht unbedingt dem Benutzernamen zu entsprechen, sondern kann beliebig gewählt werden. Der Name des Volumes darf keine Leerzeichen enthalten!


3. Datei unter dem Namen "backup_home"* auf dem Schreibtisch speichern und schliessen.
*ACHTUNG: TextEdit versieht standardmässig alle Dateien mit dem Suffix .txt, was hier unerwünscht ist. Daher sollte man im Speichern-Dialog den Haken bei ".txt verwenden, falls kein Suffix angegeben ist" entfernen.


4. Programm "Terminal" (Programme/Dienstprogramme) starten und eingeben:
Code:
cd Desktop
chmod +x backup_home

Jetzt ist das Script eine ausführbare Datei (vereinfacht: ein Unix-Programm) und kann ausgeführt werden, indem man eingibt:

Code:
sudo ./backup_home

Diese Eingabe verlangt ein Passwort und zwar dasjenige des aktuellen Benutzers (Admin-Konto wird vorausgesetzt). Dieses muss blind (!) eingegeben und mit Enter bestätigt werden. Danach startet der Sicherungsvorgang.

Wenn alles korrekt funktioniert, ist nach dem Ausführen das gesamte Home-Verzeichnis auf dem Ziel-Medium "Backup" im Ordner "sheep" (= Benutzername) gesichert. Ausserdem wird dort eine Datei mit Namen "backup.log" angelegt, aus der entnommen werden kann, wann die letzte Sicherung durchgeführt wurde. Zusätzlich gibt es eine Datei "protokoll.log", in welcher der gesamte Sicherungsvorgang inkl. allfälliger Fehler protokolliert wird.


3. (Ein) Einzelne(s) Verzeichnis(se)

Um ein beliebiges Verzeichnis -- im Beispiel den Ordner für die Mails von AppleMail -- auf eine externe Festplatte oder einen Netzwerkrechner abzugleichen, geht man wie folgt vor:

1. "TextEdit" starten und im Menü "Format" den Punkt "In reinen Text umwandeln" wählen


2. Per copy & paste folgenden Text einfügen:

Code:
#!/bin/sh

#Variablen fuer die Pfade
declare quelle="$HOME/Library/Mail"
declare ziel="<ziel>"

#Log schreiben (Anfangszeit)
/bin/echo "Backup begonnen um:" >> $ziel/backup.log
/bin/date >> $ziel/backup.log

#Backup ausführen und protokollieren
/usr/bin/time /usr/bin/rsync -avE $quelle/ $ziel/ > $ziel/protokoll.log

#Log schreiben (Endzeit)
/bin/echo "Backup beendet um:" >> $ziel/backup.log
/bin/date >> $ziel/backup.log
/bin/echo "--------------------------------------" >> $ziel/backup.log

Dabei muss der Parameter "<ziel>" ganz am Anfang durch einen entsprechenden Pfad ersetzt werden. Wenn z.B. die externe Festplatte oder das gemountete Netzwerk-Share "Backup" heisst (= Name, der auf dem Desktop angezeigt wird), so:

Code:
/Volumes/Backup/Mail

Der Ordner "Mail" muss dabei auf dem Ziel-Medium vorher angelegt werden; er braucht auch nicht unbedingt dem Benutzernamen zu entsprechen, sondern kann beliebig gewählt werden. Der Name des Volumes darf keine Leerzeichen enthalten!


3. Datei unter dem Namen "backup_home"* auf dem Schreibtisch speichern und schliessen.
*ACHTUNG: TextEdit versieht standardmässig alle Dateien mit dem Suffix .txt, was hier unerwünscht ist. Daher sollte man im Speichern-Dialog den Haken bei ".txt verwenden, falls kein Suffix angegeben ist" entfernen.


4. Programm "Terminal" (Programme/Dienstprogramme) starten und eingeben:
Code:
cd Desktop
chmod +x backup_mail

Jetzt ist das Script eine ausführbare Datei (vereinfacht: ein Unix-Programm) und kann ausgeführt werden, indem man eingibt:

Code:
sudo ./backup_mail

Diese Eingabe verlangt ein Passwort und zwar dasjenige des aktuellen Benutzers (Admin-Konto wird vorausgesetzt). Dieses muss blind (!) eingegeben und mit Enter bestätigt werden. Danach startet der Sicherungsvorgang.

Wenn alles korrekt funktioniert, ist nach dem Ausführen das Verzeichnis, welche die Mails von AppleMail hält, auf dem Ziel-Medium "Backup" im Ordner "Mail" gesichert. Ausserdem wird dort eine Datei mit Namen "backup.log" angelegt, aus der entnommen werden kann, wann die letzte Sicherung durchgeführt wurde. Zusätzlich gibt es eine Datei "protokoll.log", in welcher der gesamte Sicherungsvorgang inkl. allfälliger Fehler protokolliert wird.


4. Das komplette System (bootbar)

Um das komplette System auf eine externe Festplatte mit Firewire-Anschluss zu clonen, geht man wie folgt vor:

1. "TextEdit" starten und im Menü "Format" den Punkt "In reinen Text umwandeln" wählen


2. Per copy & paste folgenden Text einfügen:


Code:
#!/bin/sh

#Variablen fuer die Pfade
declare quelle="/"
declare ziel="<ziel>"

#Log schreiben (Anfangszeit)
/bin/echo "System-Clon begonnen um:" >> $ziel/backup.log
/bin/date >> $ziel/backup.log

#Clon anfertigen und Vorgang protokollieren
/usr/bin/time /usr/bin/rsync -avE --delete --exclude-from /backup_excludes.txt $* $quelle $ziel/ > $ziel/protokoll.log

#Volumen bootbar machen
bless -folder $ziel/System/Library/CoreServices
#Log schreiben (Endzeit)
/bin/echo "System-Clon beendet um:" >> $ziel/backup.log
/bin/date >> $ziel/backup.log
/bin/echo "--------------------------------------" >> $ziel/backup.log

Dabei muss der Parameter "<ziel>" ganz am Anfang durch einen entsprechenden Pfad ersetzt werden. Wenn z.B. die externe Festplatte "Backup" heisst (= Name, der auf dem Desktop angezeigt wird), so:

Code:
/Volumes/Backup

Wichtig:
- Ein bootfähiger System-Clon erfordert eine eigene, leere Festplatte oder eine eigene, leere Partition auf dieser! Falls nicht vorhanden, muss eine solche mit dem Festplattendienstprogramm angelegt werden (Vorsicht, beim Partitionieren gehen alle Daten auf der Platte verloren)!
- Die Festplatte muss Benutzerrechte unterstützen! Um diese zu aktivieren, klickt man auf das entsprechende Volume auf dem Desktop und wählt "Ablage" | "Informationen". Dort muss der Haken vor "Eigentümer auf diesem Volume ignorieren" entfernt werden!


3. Datei unter dem Namen "backup_system"* auf dem Schreibtisch speichern und schliessen.
*ACHTUNG: TextEdit versieht standardmässig alle Dateien mit dem Suffix .txt, was hier unerwünscht ist. Daher sollte man im Speichern-Dialog den Haken bei ".txt verwenden, falls kein Suffix angegeben ist" entfernen.


4. Eine weitere neue Datei mit TextEdit anlegen, "Datei" | "In reinen Text umwandeln" wählen und folgendes einfügen:

Code:
/tmp/*
/proc
/Network/*
/Volumes/*
/cores/*
*/.Trash
/dev/*
/afs/*
/automount/*
/private/tmp/*
/private/var/run/*
/private/var/spool/postfix/*

Dann die Datei auf dem Desktop unter dem Namen "backup_excludes.txt"* speichern. Diese Ausnahmeliste wird später dafür sorgen, dass der Sicherungsvorgang reibungslos durchlaufen kann.
*ACHTUNG: TextEdit versieht standardmässig alle Dateien mit dem Suffix .txt, was hier unerwünscht ist. Daher sollte man im Speichern-Dialog den Haken bei ".txt verwenden, falls kein Suffix angegeben ist" entfernen.


5. Programm "Terminal" (Programme/Dienstprogramme) starten und eingeben:
Code:
cd Desktop
chmod +x backup_system
sudo mv backup_excludes.txt /

Die letzte Eingabe verlangt ein Passwort und zwar dasjenige des aktuellen Benutzers (Admin-Konto wird vorausgesetzt). Dieses muss blind (!) eingegeben und mit Enter bestätigt werden.

Jetzt ist das Script eine ausführbare Datei (vereinfacht: ein Unix-Programm) und die Ausnahme-Liste ist an ihrem Platz, sodass das Script nun ausgeführt werden kann, indem man eingibt:

Code:
sudo ./backup_system

Allenfalls muss hier das Admin-Passwort erneut eingegeben werden. Danach startet der Sicherungsvorgang.

Wenn alles korrekt funktioniert, ist nach dem Ausführen ein bootbarer Clon des aktuellen Systems auf der externen oder internen Festplatte vorhanden. Von diesem kann gebootet werden, indem man den Mac neu startet und ganz am Anfang ALT gedrückt hält. Es erscheint nun eine Auswahl, aus welcher man das zu startende System wählen kann.


FRAGEN bitte in folgendem Thread posten:
Thread zur Backup-FAQ
 
Teil II - Synchronisation

TEIL II - SYNCHRONISATION

Wichtiger Hinweis:


In letzter Zeit sind einige Probleme und Unklarheiten bezüglich dieses Abschnitts aufgetaucht. Das hier beschriebene Script verhält sich möglicherweise anders, als vom Benutzer beabsichtigt, weil es diesbezüglich sehr unterschiedliche Anforderungen gibt. Bitte bei Unklarheiten unbedingt die FAQ, Abschnitt "Spezielle Fragen zu Synchronisationen" lesen.

Wer nach dieser Anleitung vorgeht, sollte sich einfach darüber im Klaren sein, dass er oder sie das Script unter Umständen noch den eigenen Bedürfnissen anpassen muss (Hilfe erhält man ggf. im Frage-Thread, siehe unten). Ausserdem sollte man es auf keinen Fall auf wichtige Daten anwenden, ohne von diesen vorher eine Sicherungskopie angelegt zu haben! Das Script überschreibt alte Versionen von Dateien (dafür ist es da), also bitte nicht unüberlegt damit herumexperimentieren!



In diesem Abschnitt wird beschrieben, wie man zwei Ordner unter OS X synchronisiert. Dabei wird nicht einfach ein Verzeichnis auf ein externes Medium oder einem anderen Rechner gesichert, sondern es werden zwei Verzeichnisse miteinander abgeglichen, sodass sie immer den genau gleichen Inhalt aufweisen. Dies kann z.B. dann sinnvoll sein, wenn man zwei Macs besitzt und auf beiden die Mails, das Adressbuch etc. abgleichen möchte.

Hier wird davon ausgegangen, dass das Home-Verzeichnisses eines anderen Macs gemountet wurde (freigegeben über Samba oder APF). Um die Synchronisation einzurichten -- im Beispiel werden die AppleMail-Verzeichnisse der beiden Macs abgeglichen -- geht man wie folgt vor:


1. "TextEdit" starten und im Menü "Format" den Punkt "In reinen Text umwandeln" wählen


2. Per copy & paste folgenden Text einfügen:

Code:
#!/bin/sh

#Variablen fuer die Pfade
declare quelle="$HOME/Library/Mail"
declare ziel="<ziel>/Library/Mail"

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

Dabei muss der Parameter "<ziel>" ganz am Anfang durch einen entsprechenden Pfad ersetzt werden. Wenn z.B. das gemountete Netzwerk-Share "iMac" (= Name, der auf dem Desktop angezeigt wird) heisst, so:

Code:
/Volumes/iMac

Der Name des Volumes darf keine Leerzeichen enthalten!

Selbstverständlich können $quelle und $ziel durch beliebige Pfade ersetzt werden, z.B. für das Adressbuch so:

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


3. Datei unter dem Namen "sync_mail"* dem Schreibtisch speichern und schliessen.
*ACHTUNG: TextEdit versieht standardmässig alle Dateien mit dem Suffix .txt, was hier unerwünscht ist. Daher sollte man im Speichern-Dialog den Haken bei ".txt verwenden, falls kein Suffix angegeben ist" entfernen.


4. Programm "Terminal" (Programme/Dienstprogramme) starten und eingeben:
Code:
cd Desktop
chmod +x sync_mail

Jetzt ist das Script eine ausführbare Datei (vereinfacht: ein Unix-Programm) und kann ausgeführt werden, indem man eingibt:

Code:
./sync_mail

Wenn alles korrekt funktioniert hat, befindet sich nach dem Synchronisieren in den beiden Verzeichnissen exakt derselbe Inhalt, im Beispiel werden also auf jedem der Macs alle Mails oder Adressen von beiden Rechnern vorhanden sein, so ähnlich wie es mit .mac möglich ist.


FRAGEN bitte in folgendem Thread posten:
Thread zur Backup-FAQ
 
Teil III - Automatisierung

TEIL III - AUTOMATISIERUNG

1. Der Cronjob - Grundlagen

Nachdem in Teil I und II und beschrieben wurde, wie man Backups und Synchronisationen einrichtet und von Hand ausführt, kommt nun der interessanteste Teil:

Wir möchten das Backup oder die Synchronisation nicht mehr selber in Gang setzen müssen, sondern dies dem Mac überlassen. Dazu benutzt man einen sog. Cronjob, um immer um eine bestimmte Zeit automatisch das entsprechende Script zu starten.

Als erstes sollten -- damit die Scripte nicht unnötig auf dem Desktop herumliegen, denn sie sollen in Zukunft ja automatisch gestartet werden -- folgende Schritte ausgeführt werden:

1. Terminal starten

2. Eingeben (Achtung, Punkte "." genau beachten!):
Code:
mkdir .scripts
cd Desktop
mv <script> ../.scripts

Dies legt ein verstecktes Verzeichnis ".scripts" im Home-Verzeichnis an und verschiebt ein Script dorthin. Der Parameter <script> muss dabei durch den Namen eines Scripts ersetzt werden, z.B. "backup_home" oder "sync".


Um einen Cronjob einzurichten, ist es zuerst nötig, einige Dinge über seine Funktionsweise zu lernen. Ein Cronjob besteht im Prinzip nur aus einer Zeile Text (zur Installation später) und ist folgendermassen aufgebaut:

Code:
Minute Stunde Tag Monat Wochentag Befehl

Folgende Werte sind jeweils möglich:

Code:
0-60 0-23 1-31 1-12 0-6 Befehl

Die ersten fünf Spalten (Werte) dienen also dazu, die Zeit zu definieren, zu welcher ein bestimmter Befehl bzw. Script (= letzte Spalte) ausgeführt werden soll. Beim Wochentag (5. Spalte) bedeutet 0 Sonntag, 1 Montag, 2 Dienstag usw.


Dies lässt sich am leichtesten an ein paar praktischen Beispielen zeigen (die Namensgebung der Scripts stammt aus Teil II und III):

Beispiel 1: tägliches Backup des Home-Verzeichnisses um 20.00 Uhr
Code:
0 20 * * * $HOME/.scripts/backup_home
Die drei Sterne "*" stehen dabei für "jeden Tag des Monats", "jeden Monat", "jeden Wochentag"

Beispiel 2: Backup des Systems jeden Sonntag um 10.15
Code:
15 10 * * 0 $HOME/.scripts/backup_system
Die zwei Sterne "*" stehen dabei für "jeden Tag des Monats", "jeden Monat". Die "0" schränkt dies allerdings auf den Sonntag ein.

Beispiel 3: Backup des Systems am 17. jeden Monats um 15.40
Code:
40 15 17 * * $HOME/.scripts/backup_system
Die zwei Sterne "*" stehen dabei für "jeden Monat", "jeden Wochentag".

Beispiel 4: Synchronisation zweier Verzeichnisse zur vollen Stunde
Code:
0 * * * * $HOME/.scripts/sync
Die vier Sterne "*" stehen dabei für "jede Stunde", jeden Tag des Monats", "jeden Monat", "jeden Wochentag"

Beispiel 5: Synchronisation zweier Verzeichnisse jeden Montag im Dezember jeweils alle 15 Minuten
Code:
*/15 * 12 * 1 $HOME/.scripts/sync
Das Symbol "*/15" steht dabei für "alle 15 Minuten", die beiden Sterne "*" für "jede Stunde", "jeden Tag des Monats"

Zugegebenermassen ist Beispiel 5 ziemlich unrealistisch, aber es zeigt die vielen Möglichkeiten, die man hat, am besten.



2. Der Cronjob - Installation

Um jetzt einen Cronjob zu installieren, geht man wie folgt vor:

1. Terminal starten (Programme/Dienstprogramme)

2. Befehl ausführen:
Code:
sudo crontab -e
und mit dem Admin-Passwort bestätigen.

Dies öffnet die sog. Crontab (Tabelle mit Cronjobs) des Users root. Selbstverständlich hat jeder Benutzer auf dem System eine eigene Crontab, die so bearbeitet werden kann:

Code:
crontab -e

Für manche Aktionen ist es aber nötig, die Crontab von root zu verwenden, weil es sonst Probleme mit Zugriffsrechten kommt (v.a. bei einem Clon des Systems). Schädlich ist es jedenfalls -- unabhängig davon, ob es unbedingt nötig ist -- nicht, solange man vorsichtig zu Werke geht.

3. Taste "i" (kleiner Buchstabe "I") drücken, um in die Tabelle zu schreiben

4. Cronjob einfügen, z.B.:

Code:
0 20 * * * /Users/<benutzer>/.scripts/backup_home

Achtung: in einem Cronjob müssen immer die absoluten (d.h. vollständigen) Pfade angegeben werden. Da im Beispiel mit der Crontab des Users root gearbeitet wird, kann ausserdem nicht das Kürzel $HOME benutzt werden, sondern man muss den Pfad ausschreiben. Der Parameter <benutzer> muss dabei durch den Kurznamen des aktuellen Benutzers ersetzt werden, z.B. "/users/sheep/.scripts/backup_home".

5. Taste "ESC" drücken

6. Eingeben
Code:
:wq
und mit ENTER bestätigen.
(Doppelpunkt, kleines "W", kleines "Q", ENTER)

Damit ist der Cronjob installiert, was im Terminal entsprechend angezeigt wird. Von nun an wird um die eingestellte Zeit (im Beispiel jeden Tag um 20.00 Uhr) ein Script gestartet (im Beispiel dasjenige für ein Backup des Home-Verzeichnisses).


3. Der Cronjob - Feinheiten und Fehlerbehebung

Wie man sich leicht denken kann, ist es möglich, dass ein Cronjob ab und zu "ins Leere läuft", wenn z.B. die externe Festplatte gerade nicht am Computer hängt, der ander Mac oder PC im Netzwerk nicht läuft oder auch einfach der Mac sich gerade im Ruhezustand befindet.

Dies ist an sich kein Grund zur Sorge, da nichts weiter passiert. Allerdings macht es Sinn, gewisse Vorkehrungen zu treffen, damit a) der Cronjob möglichst oft durchlaufen kann und b) keine Benachrichtigungs-Mails vom System versendet werden. Letzteres ist ein normales Verhalten eines Unix-Systems und äussert sich darin, dass man beim Öffnen des Terminals eine Meldung "You have new mail" erhält.

Um den (hier i.d.R. unnötigen) Mail-Versand zu stoppen, kann man den Cronjob mit der Eweiterung ">> /dev/null 2>&1" versehen, also z.B. so:

Code:
0 20 * * * /Users/<benutzer>/.scripts/backup_home >> /dev/null 2>&1

Damit der Cronjob möglichst oft durchlaufen kann, ist es bei einer externen Festplatte sinnvoll, vor dem Ausführen des Scripts zu versuchen, diese zu mounten (falls sie angeschlossen, aber nicht gemountet ist):

Code:
0 20 * * * /usr/sbin/diskutil mount /dev/disk2s10 && /Users/<benutzer>/.scripts/backup_home >> /dev/null 2>&1

Die Bezeichnung "disk2s10" ist hier beispielhaft. Sie kann herausgefunden werden, indem man im Terminal eintippt:

Code:
sudo diskutil list

was eine solche Ausgabe ergibt:

Code:
/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 Macintosh HD       74.4 GB   disk0s3
/dev/disk2
   #:                   type name               size      identifier
   0: Apple_partition_scheme                    *149.1 GB disk2
   1:    Apple_partition_map                    31.5 KB   disk2s1
   2:         Apple_Driver43                    28.0 KB   disk2s2
   3:         Apple_Driver43                    28.0 KB   disk2s3
   4:       Apple_Driver_ATA                    28.0 KB   disk2s4
   5:       Apple_Driver_ATA                    28.0 KB   disk2s5
   6:         Apple_FWDriver                    256.0 KB  disk2s6
   7:     Apple_Driver_IOKit                    256.0 KB  disk2s7
   8:          Apple_Patches                    256.0 KB  disk2s8
   9:              Apple_HFS System             74.4 GB   disk2s10
  10:              Apple_HFS Daten              74.4 GB   disk2s12

/dev/disk0 ist dabei die interne Festplatte, /dev/disk2 die Firewire-Platte. Ganz unten erkennt man -- in meinem Beispiel -- die beiden Partitionen "Daten" und "System" auf der FW-Platte, ihre Bezeichnungen sind disk2s10 und disk2s12.


FRAGEN bitte in folgendem Thread posten:
Thread zur Backup-FAQ
 
Ergänzungen

ERGÄNZUNGEN


FAQ - häufig gestellte Fragen
Hier findet man ein paar der häufig gestellten Fragen (und solche, die man sich leicht stellen könnte) zu Backups im Allgemeinen und der hier beschriebenen Methode im Besonderen.

Allgemeines / Methode

Q:
Ich benutze das Programm XYZ für meine Backups. Warum sollte ich diese Methode benutzen, wo sie doch relativ kompliziert ist?
A: Ein Script bietet Flexibilität, die man für kein Geld der Welt in Form eines Tools kaufen kann. Ausserdem sind die Möglichkeiten zur Automatisierung quasi unlimitiert.

Q: Ich benutze das Programm XYZ für meine Backups und kann das nur jedem empfehlen!
A: Dann benutze dieses bitte weiter! Ein Hinweis darauf ist hier aber weder nötig noch sinnvoll.

Q: Warum sollte ich meine Daten nicht einfach sichern, indem ich sie im Finder auf das Medium XYZ ziehe?
A: Kannst du natürlich, ist aber nicht sinnvoll. Die zu übertragende Datenmenge ist viel höher als mit dieser Methode, der Finder wird u.U. blockiert und das Ganze lässt sich kaum automatisieren.

Q: Ich möchte Backups per Klick starten statt automatisiert oder vom Terminal aus.
A: Dazu reicht es aus, den Dateinamen des Scripts mit der Endung ".command" zu versehen. Diese Datei lässt sich dann per Doppelklick ausführen und sogar ins Dock legen (links neben dem Papierkorb).

Q: Kann ich während dem Backup-Vorgang normal weiterarbeiten oder muss ich Angst haben, dass Dateien deswegen nicht gesichert werden?
A: Das ist ohne Weiteres möglich. Der Vorgang wird unter allen Umständen vollständig durchlaufen, allenfalls dauert er etwas länger. Jedoch werden keine Dateien übersprungen (Ausnahme ist die sehr unwahrscheinliche Situation, dass man eine Datei von A nach B verschiebt, während B bereits gesichert wurde, A aber noch nicht).

Q: Was passiert, wenn mein Rechner zu jenem Zeitpunkt, wo das Backup automatisch startet, nicht läuft?
A: Es geschieht gar nichts. Wenn der Mac im Ruhezustand oder ausgeschaltet ist, bleibt er dies auch und die Sicherung wird auch nicht nach dem Wieder-Einschalten nachgeholt.

Q: Ich habe das Skript erstellt und ausführbar gemacht, wenn ich es starten will, erhalte ich aber eine Fehlermeldung der Form "unable to execute <Skript-Name einsetzen>: No such file or directory" bzw. "sudo: unable to execute ./<Skript-Name einsetzen>: No such file or directory"
A: Das Problem liegt an einer fehlerhaften Zeichenkodierung von TextEdit (was hierfür genau die Ursache ist, ist bisher leider unbekannt, jedenfalls sorgt der Fehler dafür, dass die Datei vermeintlich nicht mehr gefunden werden kann). Die Abhilfe sieht so aus:

1. Kopiere dein Script per Apfel-C in die Zwischenablage
2. öffne das Terminal
3. wechsle in das Verzeichnis, wo dein Script liegt
4. tippe "vi <Skript-Name einsetzen>" (ohne eckige Klammern)
5. drücke die Taste "i"
6. drücke Apfel-V, um das Script einzufügen
7. drücke die ESC-Taste und schreibe dann ":wq", drücke die ENTER-Taste
8. tippe "chmod +x <Skript-Name einsetzen>" (ohne eckige Klammern)
9. versuche, das neue Script "<Skript-Name einsetzen>" auszuführen (ohne eckige Klammern)

Was dieser Ablauf bewirkt, ist, dass du eine neue, saubere Textdatei "backup_home2" mit dem Terminal-Editor VI anlegst und dann dein Script da reinkopierst. Dieses verfügt - da es mit VI geschrieben wird - auf jeden Fall über eine saubere Zeichenkonvertierung, sodass der Fehler oben nicht mehr auftritt.


Backup-Medien / Bootbare Clons

Q:
Kann ich auch eine USB-Festplatte benutzen?
A: Ja! Du kannst aber nicht davon booten, das geht nur mit Firewire.


Zurücksichern / Wiederherstellung

Q:
Angenommen, ich komme in eine Situation, wo ich das Backup brauche - wie muss ich vorgehen, um meine Daten zurückzubekommen?
A: Das kommt auf die Sicherungsart an:
- "Normale" Daten können ohne Weiteres im Finder an ihren Platz zurückgeschoben werden
- Einen System-Clon spielt man am einfachsten mit dem Festplatten-Dienstprogramm zurück (den Clon booten, Festplatten-Dienstprogramm starten --> auf "Wiederherstellen" klicken --> als Quelle den Clon und als Ziel die interne Festplatte angeben)
- Ein Benutzerordner mit allen Daten und Einstellungen kann mit dem Migrationsassistenten von Apple sehr einfach wiederhergestellt werden


Betriebssysteme / Kompatibilität

Q:
Ich habe Mac OS X "Panther" 10.3. Kann ich meine Daten trotzdem mit dieser Methode sichern?
A: Ja, aber mit Einschränkungen. Das Sichern der sog. Ressource Forks (beeinhalten Dateiinformationen wie Icons) wird nämlich nicht unterstützt. Allerdings kann man Abhilfe schaffen, indem man eine andere Version von rsync als die mitgelieferte benutzt, welche die nötige Option mitbringt - z.B. die von rsyncX.

Q: Ich habe einen PC mit Linux / *BSD / anderes Unix oder einen Mac mit Linux. Kann ich diese Methode auch dort benutzen?
A: Da rsync für so gut wie jedes Unix-System existiert, ist das ohne Weiteres möglich. Man muss sich allerdings über ein paar Dinge im Klaren sein, die bei jedem System anders sein können (z.B. ist die Option -e nur unter OS X vorhanden und die Pfade können natürlich variieren).


Spezielle Fragen zu Synchronisationen

Q:
Was passiert, wenn eine Datei auf beiden zu synchronisierenden Rechnern geändert wird?
A: Die ältere Version (d.h. die zuerst geänderte) wird vollständig und unwiderruflich weggeschmissen. Nur die neuere (d.h. die zuletzt geänderte) wird behalten.

Q: Das o.g. Verhalten gefällt mir nicht, was kann ich tun?
A: Momentan habe ich dafür leider keine Lösung, das ist das Verhalten von rsync, wie es hier gewollt ist. Andere Tools, wie z.B. Subversion sollen aber dazu in der Lage sein, verschiedene Versionen von Dateien sinnvoll zu vereinen.

Q: Wenn ich eine Datei auf einem der Macs lösche, welche auf dem anderen ebenfalls vorhanden ist, wird sie durch letztere wiederhergestellt. Warum und was kann ich dagegen tun?
A: Das Verhalten ist so gewollt, um unbeabsichtige Datenverluste zu vermeiden. Wenn du das wirklich ändern willst, kannst du den Parameter --delete bei beiden rsync-Aufrufen im Script verwenden.
 
Zuletzt bearbeitet:
UPDATE: Inkrementelle Backups

Hallo liebe MUs

Nach längerer Zeit gibts hier wieder mal ein Update:

Aus einem Bedürfnis nach zusätzlicher Sicherheit heraus habe ich mich daran gemacht, ein neues Skript zu schreiben, das inkrementelle Backups erstellen kann.

Ich habe im ursprünglichen Howto den Begriff leider falsch bzw. etwas anders verwendet, hier geht es jetzt um "richtige" inkrementelle Backups - zur Klärung:

Gemeint ist, dass mehrere Versionen des Backups angelegt werden. Es entsteht eine volle Sicherung und mehrere Sicherungen, die jeweils die Änderungen enthalten. Für den Benutzer allerdings erscheint es so, als wären alle Versionen volle Sicherungen, d.h. man kann in jedem Ordner sämtliche Dateien und Verzeichnisse wiederfinden. Apple hat kürzlich die Backup-Lösung TimeMachine vorgestellt, welche in Leopard (OS X 10.5) integriert werden soll. Die Funktionsweise dieses Konzeptes entspricht im Wesentlichen dem hier (allerdings ohne die Integration in die Oberfläche).


Das Skript sieht so aus:

Hinweis:
Ab sofort wird hier wieder rsync von Apple benutzt und nicht mehr rsyncX (vielen Dank an Pseudemys für den Hinweis auf bestehende Fehler in rsyncX). Dies bedeutet lediglich, dass diese Version auch mit Intel-Macs vollständig kompatibel ist, ohne dass irgendwelche Änderungen vorgenommen werden müssten.

Code:
#!/bin/sh

# INKREMENTELLLE BACKUPS

# Die folgenden Variablen müssen vom Benutzer angepasst werden

        # Zu sicherndes Verzeichnis (z.B. /Users/):
          a="/Users/sheep/"

        # Verzeichnis bzw. Volume, in dem die Backups gespeicher werden sollen (z.B. /Volumes/Backup):
          b="/Volumes/Backup"

        # Anzahl zu sichernde Versionen (z.B. 5; das Minimum ist 2!):
          c=5


# Ab hier sollte man normalerweise nichts mehr ändern müssen

# Überprüfen, ob das Verzeichnis $b existiert bzw. das entsprechende Volume gemountet ist - abbrechen, falls nicht
if [ -d $b ]; then
        echo "" > /dev/null
else
        exit
fi

# Backup-Verzeichnisse erstellen, falls sie nicht existieren
e=$c
while [  $e -gt 0 ]; do
let e=e-1
if [ -d $b/backup.$e ]; then
        echo "" > /dev/null
else
        mkdir $b/backup.$e
fi
done

# Datum aufzeichnen (Beginn)
touch $b/backup.log
/bin/echo "Backup begonnen um:" >> $b/backup.log
/bin/date >> $b/backup.log

# Backup-Verzeichnisse rotieren
let c=c-1
d=$c
rm -rf $b/backup.$c
while [  $c -gt 1 ]; do
        let d=$c
        let c=c-1
        mv $b/backup.$c $b/backup.$d
done
let d=d-1
let c=c-1
cd $b/backup.$c && find . -print | cpio -dpl ../backup.$d

# Den eigentlichen Backup-Prozess starten
/usr/bin/rsync -aE --delete --exclude=.Spotlight-V100 $a $b/backup.0/

# Datum aufzeichnen (Ende)
/bin/echo "Backup beendet um:" >> $b/backup.log
/bin/date >> $b/backup.log
/bin/echo "--------------------------------------" >> $b/backup.log

# Datum von backup.0 in eine Datei sichern
/bin/date > $b/backup.0/datum

Wie man sieht (oder auch nicht ;)) ist das aktuellste Backup stets das vollständige, alle anderen enthalten eigentlich nur die "Differenzen" zu ersterem, der Rest sind nur Verknüfungen* - daher ist die Geschichte überraschend nicht-speicherintensiv.

Das Script macht so gut wie alles von alleine, man muss lediglich Quelle, Ziel und gewünschte Anzahl Versionen (2 - unendlich) angeben. Sogar die Versions-Verzeichnisse auf dem Ziel werden automatisch angelegt, egal wie viele es sind.

Ich hoffe, dass das sonst noch jemand brauchen kann, ich selber bin damit sehr zufrieden, es hat einfach den Vorteil, dass man gelöschte (und v.a. überschriebene) Dateien weiter zurück rekonstruieren kann und vergleichsweise wenig Speicherplatz braucht (also volles Backup + alle Änderungen).


P.S.: Einige wichtige Teile habe ich "ausgeliehen", ich habe einfach ein Gesamtkonzept daraus gemacht und die WHILE-Routinen etc. eingebaut, damit es schön benutzerfreundlich wird :). Auf eine detaillierte Erklärung verzichte ich an dieser Stelle, da das Skript ungleich komplexer ausgefallen ist, als die anderen.

* Die verwendeten Verknüpfungen sind keine Aliase, sondern sog. Hardlinks. Diese sind etwas vollkommen anderes als Aliase, wie man sie vom Finder her kennt. Wichtig ist nur, dass man weiss, dass sie im Finder nicht als Verknüpfungen dargestellt werden, also nicht verwirren lassen, wenn es so aussieht, als hätte die Sache mit den Verknüfungen nicht geklappt!

Kleines Update
Das Script sichert jetzt das Datum des aktuellen inkrementellen Backups in eine Datei, sodass man leichter nachvollziehen kann, wann welche Version erstellt wurde.

Update (23.09.2006)
Das Script ist ab sofort mit PPC- und Intel-Macs vollständig kompatibel, da rsync von Apple verwendet wird.
 
Update: Intel-Macs

Sämtliche Scripts sind nun vollständig mit PPC- und Intel-Macs kompatibel.
 
Prbleme bei der Ausführung von backup_home

Hi sheep,

danke für die Einführung in Unix!

Ich habe das Programm backup_home abgetippt und kann es auch ausführen.
Leider meldet das Programm folgendes:
rsync: readir(Library/Caches/Safari/0206) Input/Output Error (5)

Allerdings scheint das Programm sonst seinen Job korrekt zu machen:) .

Hast Du eine Idee? Anbei meine Änderungen:

declare quelle="$HOME"
declare ziel="/Volumes/LACIE/Backup"
/bin/echo "Backup begonnen um:" >> $ziel/backup.log
/bin/date >> $ziel/backup.log
/bin/echo "Backup"
#Backup ausfuehrn und protokollieren
/usr/bin/time /usr/bin/rsync -avE $quelle/ $ziel/ > $ziel/protokoll.log
/bin/echo "Backup beendet. "
#Log schreiben (Endzeit)
/bin/echo "Backup beendet um:" >> $ziel/backup.log
/bin/date >> $ziel/backup.log
/bin/echo "-------------------------------" >> $ziel/backup.log

Danke.
Stacki
 
Bitte hier keine Fragen stellen, dafür gibt es einen eigenen Thread:

Thread zur Backup-FAQ
(Zu deinem Problem: es kommt immer mal vor, dass einzelne Dateien nicht gesichert werden können - ich nehme an, dass es ein Problem mit den Dateinamen ist. Allerdings war es bisher immer so [die Frage wurde schon öfter gestellt], dass das völlig unwichtige Daten waren; wie in deinem Fall eine Datei im Cache von Safari)
 
Danke. Ich werde künftige Fragen dann dort stellen.
Gruß,
stacki
 
uppps - sorry, zu spät gelesen mit keine Fragen und so.
 
@sheep: Bei mir funktioniert der Link nicht, ich bekomme vielmehr eine Fehlermeldung, die besagt, dass ich nicht die nötigen Rechte habe um den Beitrag zu ändern o.ä.
martin
 
Zuletzt bearbeitet:
Inkrementelles Backup mit Email?

Hi Leute!

Gibt es schon ein Update für Inkrementelles Backup für die Funktion nach Backup ein Email zuversenden?

Schöne Grüße
Macsea
 
Häng doch 'ne Zeile an das Skript an, die einen Automator-Ablauf startet:
- backup.log suchen (mit "Finder-Objekte suchen" - der Pfad ist ja immer der gleiche)
- an Mail übergeben
- Mail verschicken

Die Zeile müßte dann wohl so aussehen:

Code:
open <Pfad zum Automator-Ablauf>
 
Hallo, ich bin noch ein echtes MAC-Greenhorn. Wieso kann ich die Erläuterungen Teil 1-3 nicht öffnen, obwohl ich ein angemeldetes Mitglied bin? Stattdessen bekomme ich eine Fehlermeldung, das ich keine Rechte dazu hätte. Warum?
 
Danke für das gute Tutorial!

Wie wäre es mit einem Update bzgl. launchd statt crontab?
 
Zurück
Oben Unten