Apr21
2010

iPhoto und iTunes synchronisieren

Geschrieben 21. April 2010 von
Veröffentlicht in HowTo ... ? 3 Kommentare »
1 Stern2 Sterne3 Sterne4 Sterne5 Sterne ( 13 Stimme/n, Durchschnitt: 4,85 von 5 [96,92%])
Loading...


Nachdem ich meinen neuen Mac mini als Media Center eingerichtet hatte, gab es noch die Aufgabe, meine Mediathek-Inhalte aus iTunes und 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 machen.

Meine Planung sah von anfang an vor, dass ich den – 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 -Store, wird ausschleßlich über mein auf meinem MBP verwaltet. Somit habe ich hier einen eindeutigen Datenpool. Der Mac mini 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 -Systemen wird für einen solchen Datenabgleich das Programm eingesetzt. Häufigester Anwendungsbereich einer unidirektionalen Synchronisierung sind Backup-Vorgänge – auch Apples Time-Machine oder unter 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 das bekannteste Programm, auch für 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 , das diesen Job erledigt:

tell application "iTunes"
quit
end tell

tell application "iPhoto"
quit
end tell

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

/usr/bin/open "name.app"

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:

#!/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

Automatisierung einrichten

Nachdem man Rechner- und Nutzername im Skript angepasst und das Skript einmal laufen lassen hat, kann man noch einen Cronjob 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:

tell application "Terminal"

do shell script "/Users/Oliver/Scripts/sync.sh"

end tell

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:


Geschrieben von Oliver Hartwich
Erschienen am Mittwoch, den 21. April 2010 um 23:57 Uhr | 67.890 Besuche
Abgelegt unter HowTo ... ?

Tags: , , , , , , , , , , , , ,


Kommentar schreiben


Diesen Beitrag drucken
Diesen Beitrag als PDF speichern

RSS-Feed  ·  RSS 2.0 Kommentar-Feed  ·   Trackback  ·   Permalink

3 Kommentare zum Beitrag “iPhoto und iTunes synchronisieren”

  1. 1
    Dirk schreibt:

    Danke für diese super Beschreibung. Ohne diese Hilfe hätte ich mich nicht an die UNIX-Befehle herangetraut. Dafür kann ich eine kleine Apple-Script-Hilfe im Gegenzug anbieten: Wenn man an eine App nur einen einzigen Befehl übergibt, reicht eine Zeile statt drei:
    tell application „iPhoto“ to quit
    :-)

    Ich habe aber zwei Fragen, weil das Skript bei mir nicht rund läuft.
    1. Der rsync-Befehl nudelt auch beim zweiten Durchlauf eine riesige Menge Dateien durch. Das dauert. Ich hatte damit gerechnet, dass nach dem ersten Sync nur die Differenzen übertragen werden. Woran kann das liegen, oder habe ich da etwas falsch verstanden?
    2. Die Bibliothek auf dem Client-Mac-mini funktioniert nicht richtig. Die Veränderungen werden sauber übernommen, die Miniaturen werden korrekt angezeigt. Aber nach einem Doppelklick auf ein Thumbnail-Bild erscheint die Fehlermeldung ‚Konnte nicht gefunden werden‘, weil diese Links in der Datenbank anscheinend immer noch auf die alten Originale auf dem MacBook-Server verweisen. Es spielt ganz offensichtlich keine Rolle, ob die Fotos dabei außerhalb der iPhoto-Library gespeichert waren oder innerhalb, es kam in beiden Fällen vor.
    Hat jemand eine Idee, was ich falsch gemacht habe?

  2. 2
    Dirk schreibt:

    kleine Korrektur:
    Zu 2: Die Lib auf meinem Mini funktioniert doch, zumindest größtenteils Ich bin sogar erstaunt, dass auch die externe verwalteten Dateien gefunden werden. Ich habe nämlich meine Fotos nicht komplett an iPhoto übergeben, sondern sammle die Originaldateien in Monatsordnern außerhalb des iPhoto-Library-Pakets. Auch diese Fotos werden nach der Übertragung auf den Mini korrekt verlinkt – offensichtlich sind das doch relative Links, was ich nicht vermutet hatte.
    Aber seltsamerweise funktionieren einige Links innerhalb der Datenbank nicht. Nur konnte ich noch nicht herausbekommen, woran das im Einzelnen liegt.
    Zu 1: Das Datenvolumen ist zwar nicht so super riesig, aber es überrascht schon. Nachdem ich ein paar Fotos eingefügt habe, werden 250MB übertragen, und zwar auch Files, die mit den eingefügten überhaupt nichts zu tun zu haben scheinen. Die eigentliche Datenbank ist zwar 25GB groß, aber trotzdem ist die Zahl verwunderlich.
    Insgesamt bleibt aber trotz dieses sehr netten rsync-workarounds das Erstaunen, dass dieses Feature der iPhoto-Synchronisation nicht von Apple selbst eingebaut wird. Nur auf Streamen zu setzen, das kann es ja nicht sein.
    Viele Grüße
    :-) Dirk

  3. 3
    Wolfgang schreibt:

    Hallo Oliver,
    dein Beitrag hat mich sehr interessiert, da die Konstellation genau auf mich zutrifft.
    Also ich möchte meine Photos und die Musik von meinem „Schreibtisch Mac-mini“ auf den Media Center Mac-mini kopieren. Das habe ich bisher immer mit dem Finder gemacht. Das hat funktioniert, aber es dauerte immer sehr lange. Das von dir geschilderte Prinzip ist mir aus der Dos-Welt bekannt. Beruflich setze ich sehr oft robocopy ein. Allerdings scheitere ich hier schon am ssh Key. Ich kann das Mediacenter mit dem Hostnamen anpingen. Ich habe den ssh Key generiert und die Datei id_rsa.ssh in den Ordner .ssh/authorized_key des Benutzers vom Mediacenter kopiert. (War das schon mein Fehler?) Zur Sicherheit habe ich die Datei auch noch mal in das Verzeichnis meines eigenen Benutzers auf dem Server (wo die Musik und die Photos sind) kopiert. Aber ich komme nicht über das ssh logon hinaus:

    Ich werde nach dem Password gefragt! In den ersten Versuchen bin bei der Password-Eingabe bei key-gen mit Enter drüber gegenagen. Später habe ich dann 123456 o.ä. eingeben.
    Ich habe für mich alle erdenklichen Möglichkeiten beim ssh logon erfolglos versucht. Leider ohne Erfolg. Ich frage dich nun – wo mache ich einen Fehler???
    Viele Grüße Wolfgang

Kommentiere diesen Beitrag





Highslide for Wordpress Plugin