Home > Linux/Ubuntu > Automatische Backup-Lösung mit rsync und SSH

Automatische Backup-Lösung mit rsync und SSH

Vielen Leuten gehts beim Backup so wie mir. Man weiß, dass ein Backup unverzichtbar ist, man hat sich vielleicht auch ein Script geschrieben, aber es mangelt an der Motivation dies durchzuführen oder an der Regelmäßigkeit.

Wer einen weiteren Fest-PC hat, der kann das Backup ganz automatisiert darüber ablaufen lassen. Bei mir läuft der HTPC immer und da er sowieso schon Server-Dienste übernimmt, ist er nun auch zum Backup-Server befördert worden.

Stündlich lasse ich nun mein gesamtes /home-Verzeichnis per rsync in ein Backup-Verzeichnis auf dem HTPC updaten. Und falls der Laptop einmal nicht da oder nicht an ist, verabschiedet sich rsync mit einer einfachen Fehlermeldung und belässt das Backup unberührt.

Einrichtung

Installation

Auch wenn der HTPC in diesem Fall als Backup-”Server” zuständig ist, übernimmt er eigentlich eine Client-Funktion. Deshalb spreche ich ab sofort von server (eigentlich der Laptop) und client (der HTPC).

Damit überhaupt ein Zugriff erfolgen kann, muss auf dem server ein ssh-Server (Daemon) laufen. Dieser wird unter Ubuntu durch das Paket openssh-server zur Verfügung gestellt:

user@client:~$ sudo apt-get install openssh-server

In Arch Linux heißt es einfach nur openssh.

user@client:~$ pacman -S openssh

Zusätzlich muss der Daemon unter Arch Linux noch in die /etc/rc.conf unter DAEMONS eingetragen werden, damit er bei jedem Start mitgestartet wird.

Nun kann man sich vom client auf den server einloggen:

user@client:~$ ssh user@server

Wobei für server der entsprechende Hostname bzw. IP eingesetzt wird und für user der User auf dem server, dessen Dateien gesichert werden sollen. Es wird eine Passwort-Abfrage kommen, wo das Passwort des entsprechenden users auf dem server eingegeben wird.

Falls das klappt, kann man die Sitzung mit “exit” verlassen, da wir zunächst ein paar Aufgaben auf dem client erledigen müssen.

Authentifizierung

Da unser Cronjob später nicht auf die Passwort-Abfrage reagieren kann, umgehen wir diese, indem wir ein Keyfile generieren:

user@client:~$ ssh-keygen -t dsa -f ~/.ssh/backup_key

Die passphrase wird leer gelassen, damit es später zu keiner Passwort-Abfrage kommt.

Das Programm sollte nun in ~/.ssh/ ein privates und ein öffentliches Keyfile (erkennbar an der .pub-Endung) angelegt haben.

Hinweis: Eine leere passphrase stellt ein Sicherheitsrisiko dar. Wer in die Hände des Keyfiles kommt, kann Zugriff zum server erlangen. Diese Methode sollte deshalb nur im lokalen Netzwerk verwendet werden.

Damit die Authentifizierung zwischen client und server funktioniert, muss das Keyfile auf den server übertragen werden:

user@client:~$ ssh-copy-id -i ~/.ssh/backup_key.pub user@server

Auch hier wird server und user wieder entsprechend angepasst.

Wir werden aufgefordert, den Zugang zu prüfen. Das machen wir folgendermaßen:

user@client:~$ ssh -i ~/.ssh/backup_key user@server

Falls nicht nach einem Passwort gefragt wurde, hat alles geklappt. Die Sitzung verlassen wir wieder mit “exit”.

Hier legen wir nun ein Verzeichnis an, in welches die Dateien gesichert werden sollen, z.B.:

user@client:~$ mkdir ~/backup

Synchronisation

Ab sofort sollte ein erstes Synchronisieren der Daten möglich sein:

user@client:~$ /usr/bin/rsync –delete -avze "ssh -i /home/user/.ssh/backup_key" user@server:/home/user ~/backup

Ein Paar Worte zum Befehl:

–delete sorgt dafür, dass Dateien , die am Quellort gelöscht wurden, auch am Zielort gelöscht werden
-a ist der Archiv-Modus, d.h. er behält alle Permissions, Symlinks, Zeiten, Besitzer und Gruppen bei
-v zeigt alle Dateien an, die übertragen werden.
-z überträgt die Dateien komprimiert
-e nutzen wir in diesem Fall, um die Übertragung über SSH laufen zu lassen.

user ist für die client- und server-Seite entsprechend anzupassen. Der Pfad hinter -i ist auf die client-Seite bezogen.

Der Pfad hinter user@server: ist der Remote Path, also der Pfad zu den zu sichernden Dateien auf dem server.

Die Ausführung kann eine ganze Zeit dauern, da beim ersten Aufruf noch alle Dateien übertragen werden müssen. Jeder folgende Aufruf vergleicht die Daten und überträgt nur die Veränderungen.

Hat das erfolgreich geklappt, kann ein Script geschrieben werden, wo wir den obigen Befehl eintragen:

#!/bin/bash
/usr/bin/rsync –delete -avze "ssh -i /home/user/.ssh/backup_key" user@server:/home/user ~/backup

Ich habe die Datei als /usr/bin/backup angelegt und mit

sudo chmod a+x /usr/bin/backup

ausführbar gemacht.

Ab sofort sollte der Aufruf von “backup” in der Konsole ausreichen.

Automatisierung

Fehlt nur noch ein Eintrag in der crontab, damit das Backup stündlich ausgeführt wird:

crontab -e

Folgende Zeile einfügen:

01 * * * * /usr/bin/backup

Die Zeit kann natürlich angepasst werden. In den meisten Fällen sollte auch ein tägliches Backup um 11:59 Uhr ausreichen:

59 11 * * * /usr/bin/backup

Schaut regelmäßig in /var/mail/user (user ist durch euren Benutzernamen zu ersetzen), ob Probleme aufgetreten sind.

Categories: Linux/Ubuntu Tags: , , ,
  1. Simon
    5. März 2009, 13:24 | #1

    Hallo Malte,

    Perfektes Tutorial, gut geschrieben :)

    Eine Anmerkung habe ich zu deinem Rsync-Befehl:
    /usr/bin/rsync –delete -avze “ssh -i /home/user/.ssh/backup_key” user@server:/home/user ~/backup

    -> Der Zielserver und lokale Verzeichnis müssten vertauscht werden – zuerst sollte das zu sichernde Verzeichnis kommen, dann das Verzeichnis auf dem entfernten Server.

    Grüße
    Simon

  2. Malte
    12. März 2009, 16:24 | #2

    Freut mich, dass dir das Tutorial gefaellt und vielen Dank fuer die Anmerkung, aber:

    Mein Befehl ist schon korrekt (steht schliesslich genauso in meinem Backup-Script). Der Clou liegt allerdings darin, dass der Backup-Server in diesem Fall die Client-Funktion uebernimmt, da er von meinem Laptop die Daten selbstaendig holt und mein Laptop dann den SSH-Server laufen hat. Fuer mich die optimale Loesung, andere moegens vielleicht lieber andersrum machen.

  3. Tobias
    19. November 2009, 19:02 | #3

    Hallo und vielen Dank für die schöne Anleitung! Richte grad einen alten PC als BackupServer her. Ich benutze Ubuntu 9.04. Bei mir hat die Option “-delete” zuerst nicht funktiniert. Es gab zwar keine Fehlermeldung, aber Dateien wurden auf dem Client nicht gelöscht, wenn sie auf den Server gelöscht wurden. Client-Server, wie oben beschrieben. Rest funktionierte ohne Probleme. Erst, als ich die Option durch “–delete” ersetzt habe, also beide Bindestriche!, gings. MfG Tobias

  4. Tobias
    19. November 2009, 19:05 | #4

    ok, jetzt seh ich, dass es hier auf der Webseite durch die Schrift fast nicht zu unterscheiden ist, was einer, was zwei Bindestriche sind. Im Terminal gibts ja eine richtige Lücke zwischen den beiden. Also mein Fehler.

  1. Bisher keine Trackbacks