- Olivers Notizblog - http://www.ollihart.de -

iPhoto und iTunes synchronisieren

Nachdem ich meinen neuen Mac mini als Media Center [1] eingerichtet hatte, gab es noch die Aufgabe, meine Mediathek-Inhalte aus iTunes [2] und iPhoto [3] von meinem Macbook Pro zu überspielen und zu synchronisieren. Bevor man aber sich hier an die Arbeit macht, muss man sich aber einige Gedanken über die Art und Weise der geplanten Synchronisation [4] machen.

Meine Planung sah von anfang an vor, dass ich den Mac mini [5] – was Daten angeht – nur als Client verwenden möchte, dort also keine neuen Daten exklusiv einspiele. Meine Fotos werden weiterhin auf mein Macbook überspielt und dort in iPhoto importiert. Auch Musik, egal, ob von CD, als MP3 oder aus dem iTunes [6]-Store, wird ausschleßlich über mein iTunes [6] auf meinem MBP verwaltet. Somit habe ich hier einen eindeutigen Datenpool. Der Mac mini [5] soll nun seine Daten per Synchronisation vom Macbook Pro erhalten und mit diesem synchron bleiben. Bei einer solchen Synchronisierung spricht man von einer unidirektionalen Synchronisation, also der Datenfluss erfolgt nur in eine Richtung – also von einem Quellverzeichnis zu einem Zielverzeichnis, ab. Wenn beide Verzeichnisse geändert wurden, werden die Änderungen nicht zusammengeführt, sondern die Änderungen im Zielverzeichnis gehen verloren. Unter Unix-Systemen wird für einen solchen Datenabgleich das Programm rsync [7] eingesetzt. Häufigester Anwendungsbereich einer unidirektionalen Synchronisierung sind Backup-Vorgänge – auch Apples Time-Machine oder dirvish [8] unter Linux [9] arbeiten unidirektional.

Möchte man hingegen auf beiden Seiten Daten ändern und diese beiden Seiten dennoch synchron halten, muss man eine bidirektionale Synchronisation einsetzen. Unter UNIX und co. ist Unison [10] das bekannteste Programm, auch für Mac OS X [11] gibt es eine grafische Variante von Unison. Unison scannt nach dem Start den Dateibestand pro Client und vergleicht die Zeitstempel mit der jeweils lokal gespeicherten Liste. Stellt es Veränderungen fest, werden die entsprechenden Dateien genauer geprüft. Danach erstellt Unison eine Übersicht der beiden Replikas mit Vorschlägen für die Synchronisation und markiert nicht automatisch auflösbare Konflikte. Dateien mit Konflikten werden bei der folgenden Synchronisation übersprungen. Wurde also eine Datei nach der letzten Synchronisation auf beiden Seiten geändert, kann diese nicht synchronisiert werden. Tut man es doch, dann verliert man die Änderungen auf einer Seite.

Für den professionellen Einsatz sollte man die beiden Clients mit einem dritten Client unidirektional synchronisieren. Hierfür bietet sich eine Netzwerkfestplatte, bspw. Apples Time-Capsule. Ich habe ein solches System erfolgreich getestet, um einen Datenpool zwischen Macbook und Netbook synchron zu halten. Wer zusätzlich noch eine Versionierung der gemachten Änderungen benötigt, der sollte sich Subversion mal genauer anschauen.

Genug langweilige Theorie … Wenn man sich nun für ein Synchronisationsmdell entschieden hat – in meinem Fall die unidirektionale Synchronisation vom Macbook zum Mac mini – kann man sich um die notwendigen Skripte kümmern.

Authentifizierung via ssh sicherstellen

Mein Synchronisierungsansatz wird ohne zusätzliche Programme auskommen – alles wird über die ssh-Schnittstelle auf „Kommandozeilenebene“ ablaufen. Damit das Sync-Skript ohne Passworteingaben seine Arbeit verichten kann, muss zuvor sichergestellt werden, dass die beiden Nutzerkonten auf den zwei Clients authentifiziert sind. Dazu muss der jeweilige public-Key dem anderen Nutzerkonto bekannt gemacht werden, so dass hier eine Vertrauensstellung entsteht. Danach kann man sich ohne Eingabe des Passworts auf dem anderen Computer per ssh einloggen.

Damit diese Verbindung klappt, muss natürlich sichergestellt sein, dass der Client vom Server aus im lokalen Netzwerk erreichbar sind. Normalerweise sollte das der Nameserver des heimische Routers richten, aber falls dem nicht so ist, muss man die IP-Adresse in die lokale hosts-Datei auf dem Client eintragen. Diese hosts-Datei beinhaltet lokale Namensauflösungen und ist unter

/etc/hosts

zu finden. Testen kann man die Verbindung, in dem man den Client anpingt (ping Hostname):

Horizon:~ Oliver$ ping -c 4 Enterprise
PING Enterprise.fritz.box (192.168.100.102): 56 data bytes
64 bytes from 192.168.100.102: icmp_seq=0 ttl=64 time=457.824 ms
64 bytes from 192.168.100.102: icmp_seq=1 ttl=64 time=74.741 ms
64 bytes from 192.168.100.102: icmp_seq=2 ttl=64 time=506.242 ms
64 bytes from 192.168.100.102: icmp_seq=3 ttl=64 time=23.608 ms

--- Enterprise.fritz.box ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 23.608/265.604/506.242/217.857 ms
Horizon:~ Oliver$

Zuerst muss man – falls noch nicht geschehen – auf dem Server (also dem Mabook) ein RSA-Schlüsselpaar erstellen. Das tut man mit dem Befehl ssh-keygen. Natürlich muss man das Paar mit  dem Nutzerkonto erstellen, das später auch das Sync-Skript ausführen soll. ssh-keygen legt im Profilordner einen Unterordner .ssh an und erstellt dort das Schlüsselpaar (id_rsa und id_rsa.pub):

Horizon:~ Oliver$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/Oliver/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/Oliver/.ssh/id_rsa.
Your public key has been saved in /Users/Oliver/.ssh/id_rsa.pub.
The key fingerprint is:
b8:0f:b1:03:a0:11:3e:86:66:92:bc:03:1f:3b:5f:a2 Oliver@Horizon.fritz.box
The key's randomart image is:
...

Anschließend kopiert man den Public-Key (den Inhalt  der Datei id_rsa.pub) in die Datei

~/.ssh/authorized_keys

seines Nutzerkontos (oder des Kontos, dessen Daten synchronisiert werden sollen) auf dem Client (also dem Mac mini). Existiert die Datei nicht, legt man sie einfach an. Nun kann man sich vom Server ohne Passworteingabe auf dem Client einloggen:


Horizon:~ Oliver$ ssh Enterprise
Last login: Wed Apr 21 22:35:08 2010 from horizon.local
Enterprise:~ Oliver$

Datenpool bereitstellen & Synchronisation einrichten

Als nächsten Schritt machen wir uns an das eigentliche sync-Skript. Hierzu muss man sich vorher überlegen, welche Daten man synchronisieren möchte. Für iTunes muss der Ordner ~/Music/iTunes abgleichen, bei iPhoto braucht man das Paket ~/Pictures/iPhoto Library. Liegen die Rohdaten in einem anderen Ordner, muss man diesen natürlich auch mit kopieren.

Für eine saubere Synchronisation sollten iPhoto und iTunes auf beiden Computern vor dem Start des Abgleichs geschlossen werden. Hierfür nutze ich einfach ein  kleines AppleScript [12], das diesen Job erledigt:

[bash]
tell application „iTunes“
quit
end tell

tell application „iPhoto“
quit
end tell
[/bash]

Dieses AppleScript wird  im AppleScript-Editor als .app gespeichert und einfach im Sync-Skript vor dem eigentlichen Datenabgleich gestartet. Solche .app-Dateien kann man im Shellscript mit dem Befehl
[crayon-5d31d07203786585687953/]
starten. Jetzt haben wir alles zusammen und es fehlt nur noch das eigentliche Shellscript für die Synchronisation. Zuerst wird der Client angepingt. Wenn er erreichbar ist, dann wird das AppleScript gestartet und anschließend die Synchronisation mittels rsync. Beim Sync schließe ich noch alle ._*-Dateien aus, die übrigen Parameter kann man sich in der man-Page von rsync zusammensuchen:

[bash]
#!/bin/bash

ping -c 3 Enterprise.local > /dev/null

if [ „$?“ = „0“ ]; then

/usr/bin/open „/Users/Oliver/Scripts/quit.app“

ssh Oliver@Enterprise.local /usr/bin/open „/Users/Oliver/Scripts/quit.app“

rsync -avz –extended-attributes –delete –exclude=._*.* /Users/Oliver/Music/iTunes Enterprise.local:/Users/Oliver/Music/

rsync -avz –extended-attributes –delete –exclude=._*.* /Users/Oliver/Pictures/iPhoto\ Library Enterprise.local:/Users/Oliver/Pictures/

else
echo „Host Enterprise is down.“
fi
[/bash]

Automatisierung einrichten

Nachdem man Rechner- und Nutzername im Skript angepasst und das Skript einmal laufen lassen hat, kann man noch einen Cronjob [13] einrichten, damit der Prozess regelmäßigig und automatisch abläuft. Zusätzlich hab ich mir noch eine Verknüpfung meines Skriptes aus den Desktop gepackt, damit ich den Datenabgleich auch von Hand starten kann, wenn ich beispielsweise gerade neue Bilder eingespielt oder neue Musik geladen habe. Auch hierzu bedient man sich dem AppleScript und erstellt einfach ein Programm mit dem AppleScript-Editor und eine Verknüpfung auf dem Desktop:

[bash]
tell application „Terminal“

do shell script „/Users/Oliver/Scripts/sync.sh“

end tell
[/bash]

Da ich die iTunes- und iPhoto-Daten nun synchronisiere und hier schon etwas 100 GB zusammengekommen sind, spare ich mir für diese Daten das Backup auf dem Mac mini und habe die beiden Ordner aus dem TM-Backup ausgeschlossen. Die Daten werden ja über mein Macbook Pro schon gesichert und auf der Time-Capsule archiviert.

Mehr aus diesem Bereich: