Zwei Rechner: Daten verloren, Dokumente fehlen?

Synchronisation und lokale Versionsverwaltung für Arbeitsplatzrecher und Netbook mit Unison und Git

Monde Tux

Monde Tux by GeekRemi under CC BY-NC-ND 3.0

Auch der Einsatz von Open Source-Software gehört für mich zum Thema Aneignung und Selbstermächtigung. Deshalb wird es hier ab und an praktische Anleitungen oder theoretische Überlegungen zu diesem Themenkreis geben.

Nach der Anschaffung eines Netbooks trat das folgende bekannte Problem auf: Wie bewerkstellige ich einen sicheren aber möglichst einfachen Datenabgleich zwischen Arbeitsplatzrechner und Netbook?

Vorausetzungen für dieses Tutorial: Einsatz von Linux (ich selbst setze Mint 11 ein); Grundkenntnisse im Umgang mit der Shell und SSH. Natürlich läßt sich eine solche Lösung auch unter anderen Betriebssystemen umsetzen.

Normalerweise arbeite ich auf meine Laptop als Arbeitsplatzrechner. Wenn ich auf Reisen gehe, dann ersetzt das Netbook den Arbeitsplatzrechner, vor allem wegen der längeren Akku-Laufzeiten und des geringeren Gewichts.

Ich will natürlich nicht einzelne Dateien vom einen zum anderen Rechner übertragen. Ein noch größerer Alptraum ist der, dass ich Änderungen auf dem einen mit Änderungen auf dem anderen Rechner überschreibe. Nahezu alle meine Notizen, Termine, Dokumentauszüge und Links liegen in Form von Emacs-Org-Mode-Dateien vor. Bei der Zusammenführung von Dokumenten geht es also aktuell um reine Textdateien. Bei der reinen Synchronisation ohne Zusammenführung von Dateiinhalten handelt es sich um eine Sammlung von PDF-, Word-, OpenOffice-Dateien als digitale Bibliothek, die ich auf beiden Rechnern zur Verfügung haben möchte.

Zum Abgleich setze ich Git und Unison ein. Beides kann aus dem Paketquellen ohne großen Umstand installiert werden. Mit ersterem gleiche ich im Moment meine Org-Mode-Dateien ab, mit letzterem alle anderen wichtigen Dokumente, vor allem Lesestoff, der bei mir in einem Verzeichnis mit thematischen Unterordnern liegt.

In diesem Artikel beschreibe ich das Setup zum Nachbau – sicherlich verbesserungsfähig und eher laienhaft implementiert aber für meine Verhältnisse eine guter Start.

Auf beiden Rechnern, also auf meinem Notebook-Arbeitsplatz und dem Netbook, existiert dieselbe Verzeichnisstruktur. Das macht den Abgleich erst möglich. Beide Rechner werden per SSH über das Netzwerk verbunden.

Unison: Abgleich von Lesestoff aus der digitalen Bibliothek

Unison ist ein Tool für die Synchronisation und verwendet als Grundlage rsynch. Ich habe ein einfaches Script, welches ich an der Shell bei Bedarf alle paar Tage ausführe:

#! /bin/bash
unison /home/meinVerzeichnis ssh://$1//home/meinHomeVerzeichnis
-path meinUnterverzeichnis1
-path meinUnterverzeichnis2
-path meinUnterverzeichnis3
-ignore "meinUnterverzeichnis1/diesesVerzeichnisAuslassen"

Zur Erläuterung:

Zeile 1: Aufruf von unison; Quellverzeichnis auf Arbeitsplatzrechner; Zielverzeichnis auf Netbook; ($1) kennzeichnet einen Parameter, den ich dem Script übergebe. Dies ist die IP-Nummer, da ich im Heimnetz über den Router alle paar Tage eine andere IP je Rechner bekommen (das ist ein wenig umständlich, stört mich aber nicht weiter, da ich die Synchronisation manuell auslöse). Der Aufruf des Scripts lautet dann:

$ syn-all.sh 192.168.2.100

darunter – jweils hinter dem Parameter “-path” – folgt eine Liste der Verzeichnisse, die ich abgleichen möchte. Der Parameter “-ignore” wird gefolgt von der Angabe eines Verzeichnisses, welches ich von der Synchronisation ausnehmen möchte. In meinem Fall ist das z. B. das Mail-Verzeichnis, da ich nur über Imap-Postfächer verfüge und der Abgleich zwischen beiden Rechnern unnötig ist.

Unison gibt dann eine Liste von Verzeichnissen und/oder Dateien aus, die von einem zum anderen Rechner verändert, gelöscht oder neu angelegt wurden. Die Synchronisation nicke ich von Fall zu Fall per Hand ab; das kann man auch automatisch machen lassen, ist mir aber zu gefährlich und in meinem Fall auch unnötig.

Git: Nie wieder Ärger mit verlorenen Änderungen

Ich musste ein wenig herumprobieren, weil ich bislang nur mit Subversion gearbeitet habe. Git ermöglicht die Verwaltung eines lokalen Repository. Dies brauche ich für meine Org-mode-Dateien, einfache Textdateien, die sich jedoch oft ändern. Zudem kommt es natürlich vor, dass ich zeitweise nur auf dem Netbook arbeite; oder dass ich eine Datei auf beiden Rechnern geändert habe und nun zusammenführen muss – und genau dafür gibt es Versionierungssysteme.

Zunächst richte ich mir im Home-Verzeichnis einen Ordner ein, in dem das Repository lagern soll, also alle Dateien bzw. Projekte, die ich unter einer Versionskontrolle pflegen möchte:

$ mkdir ~/repository

Dann wird ein neues Git-Repository in diesem Ordner erzeugt. Der Parameter –bare ist notwenig, weil ich ein zentrales Repository benötige. Ein solches enthält bei Git selbst keine Arbeitsdateien, sondern nur die Verwaltungsangaben und Historie; es hat mich eine Stunde gekostet, zu eruieren, warum ich nicht in ein normales Git-Repository Änderungen einpflegen kann (im Git-Jargon heißt das “push” im Gegensatz zur Aktualisierung “pull”). Weitere Einzelheiten zum Thema kann man hier finden. Wie dem auch sei, ich brauche ein bare repository, wenn ich eine zentrale Ablage aufbauen will, deren Inhalt ich dann auf unterschiedlichen Rechnern abrufen und bei Änderungen wieder ins Repository schicken kann.

Also: Wechsel in das Verzeichnis und Anlegen eines Git-Repository:

$ cd ~/repository
$ git init --bare
Initialized empty Git repository in /home/meinVerzeichnis/repository/

Nun lege ich ein Arbeitsverzeichnis an, also jenes, in dem ich die Dateien zukünftig bearbeite:

$ git clone ~/repository ~/arbeitsverzeichnis
Cloning into /home/meinHomeVerzeichnis/arbeitsverzeichnis... done.
warning: You appear to have cloned an empty repository.

Git sagt mir, dass das Repository leer ist. Stimmt. Wurde ja auch mit dem Parameter “–bare” angelegt. Deshalb lege ich dort nun alle Datein ab, die versioniert werden sollen (z. B. “ich-bin-versioniert.txt”). Danach teile ich Git mit, dass diese Dateien von nun an unter Versionskontrolle stehen sollen und aktualisiere das Repository:

$ ~/arbeitsverzeichnis git add *
$ ~/arbeitsverzeichnis git commit -m "Initial Commit"
[master (root-commit) 2b5b2e6] Initial Commit
1 files changed, 500 insertions(+), 0 deletions(-)
create mode 100644 ich-bin-versioniert.txt

Das war es. Von nun an kann ich mit zwei Scripten, welche die wesentlichen Befehle zusammenfassen, Änderungen ins Repository schicken und von dort auch wieder abholen.

Zum Update des Repository verwende ich das Script “git-push-org”:

#! /bin/bash
cd ~/arbeitsverzeichnis
git commit -a -m "changes"
git push ~/repository

Um Änderungen aus dem Repository zu bekommen verwende ich “git-pull-org” mit folgendem Inhalt:

#! /bin/bash
cd ~/arbeitsverzeichnis
git pull ~/repository

Natürlich kann man das auch direkt an der Shell machen. Aber ich finde es so praktischer. Oder man fasst die Scripte zusammen und übergibt einen entsprechenden Parameter, je nachdem ob man aktualisieren oder einpflegen möchte. Mir reicht die beschriebene Lösung aber für den Moment.

Setup auf dem Netbook

Auf dem Netbook passiert initial das folgende: Das Repository, welches in auf dem Notebook in ~/arbeitsverzeichnis liegt, wird geklont (hier wird also kein leeres Repository (siehe oben) angelegt, sondern das Arbeitsverzeichnis vom Notebook kopiert):


$ git clone ssh://192.168.2.100/~/arbeitsverzeichnis ~/arbeitsverzeichnis

Die Scripte für die Aktualisierung und das Einpflegen von Änderungen übernehme ich vom Notebook und passe sie ein wenig an:

Zum Update “git-push-org”:

#! /bin/bash
cd ~/arbeitsverzeichnis
git commit -a -m "changes from netbook"
git push ssh://$1/~/repository

Um Änderungen einzupflegen “git-pull-org”:

#! /bin/bash
cd ~/arbeitsverzeichnis
git pull ssh://$1/~/repository

Da ich – wie weiter oben schon beschrieben – vom Router im Haus alle paar Tage eine andere IP jeweils für beide Rechner bekommen, muss diese natürlich entsprechend angepasst werden. Die schnelle Lösung ist die Übergabe der IP per Parameter $1. Der Aufruf des ersten Scriptes sieht also so aus:

$ git-push-org 192.168.2.105

Die IP finde ich über

$ ifconfig

heraus. Wie gesagt, das kann man wesentlich eleganter lösen (IP auslesen und ins Script automatisiert einsetzen), aber ich bin beim Thema Scripting ein absoluter Anfänger und habe mir deshalb die Sache so einfach wie möglich gemacht.

Ich bin vorerst mit der Lösung zufrieden, da sie einen guten Kompromiss zwischen manueller Arbeit und automatisiertem Ablauf bietet. Vorschläge und Fragen sind willkommen.

Kategorie: Allgemein, Howto, Open Source Kommentare deaktiviert

Kommentarfunktion ist deaktiviert.