Meine neue Backup-Lösung

Wie ich bereits im rsync-Beitrag beschrieben habe, habe ich meine Backups bisher manuell (und dadurch viel zu selten) durchgeführt. Da ich mittlerweile ein neues Notebook benutze, wurde mein altes arbeitslos. Das alte hatte zwar einige Probleme, weswegen ich es durch ein neues ersetzt habe, aber für irgendwelche kleinen Aufgaben als Server ist es immer noch gut genug. Da ich ungern Dinge wegwerfe und Elektroschrott produziere wollte ich daraus einen Server machen, auf den ich automatisiert ein tägliches Backup speichere. Eine ähnliche Einstellung hat auch der Blogger Apo und beschreibt in seinem Blog gambaru.de noch weitere mögliche Verwendungen für alte Hardware.

Ich werde hier keine detaillierte Schritt-für-Schritt, bzw. Kochrezept-Anleitung, für einen Backup-Server veröffentlichen. Davon gibt es bereits genug und was ich fabriziert habe ist eine Lösung, die für mich gut genug ist aber wahrscheinlich nicht die perfekte Lösung.

Meine Lösung sieht grob umrissen folgendermaßen aus:

– Einmal täglich startet mein Laptop (das Neue, mit dem ich arbeite) mein altes Laptop (im folgenden Server genannt) per Wake On LAN (WOL).
– Danach sichert es mittels rsync über SSH meinen /home-Ordner und /etc
– Abschließend wird der Server über SSH in den Ruhezustand versetzt

Ich habe per rsync rudimentär die Funkionalität von rsnapshot nachgebaut, da mir rsync besser gefällt bzw. ich es schon kenne, da ich bisher manuelle Backups damit durchgeführt habe. Außerdem kann ich mittels rsync Backups über SSH an den Server senden, bei rsnapshot ist dies nicht möglich. Bei rsnapshot müsste mein Server per SSH das Backup von meinem Laptop “abholen”. Ich möchte aber keinen SSH-Server als zusätzlichen Daemon auf meinem Laptop installieren.

Wie man im Ubuntuusers-Wiki nachlesenen kann, ist es möglich mit rsnapshot beliebig zu konfigurieren wie viele tägliche/wöchentliche/monatliche/jährliche Backup-Versionen man vorhalten möchte. Ich beschränke mich bei meiner Lösung auf ein Backup pro Monat für ein Jahr lang, wobei das tagesaktuelle Backup jeweils das des aktuellen Monats ist.

Nun ein grober Abriss meines Vorgehens:

Server installieren

Als Betriebssystem habe ich Debian Wheezy (das aktuelle Stable-Release) installiert. Dabei habe ich lediglich “Desktop” abgewählt, da mein Server keine GUI benötigt, und “SSH-Server” angewählt. Eine Debian-Installation ist so einfach, dass ich das hier nicht näher erläutern muss.

SSH einrichten

SSH habe ich nach dem Artikel im Arch-Wiki eingerichtet und auch den Passwortlosen Login konfiguriert.
Ich habe lediglich die Zeile

AllowUsers BENUTERZAME@192.168.2.*

hinzugefügt um Logins nur aus meinem lokalen Netz zu erlauben. Die IP ist natürlich auf die lokalen Gegebenheiten und BENUTZERNAME auf den eigenen Benutzernamen auf dem Server anzupassen.

WOL einrichten

Um den Server, den ich täglich nur kurz für das Backup benötige, nicht ständig laufen zu lassen habe ich beschlossen Wake On LAN zu nutzen. Mein Laptop hängt per Netzwerkkabel an meinem Router und wird aufgeweckt in dem ich ein Kommando über mein per WLAN angebundes Notebook schicke. Dies habe ich nach einem Artikel im Ubuntuusers-Wiki eingerichtet.
In meinem Fall gab es noch ein kleines Problem, da meine Vodafone Easy.Box das Magic Packet (TM) blockiert. Lösen konnte ich dies indem ich im Konfigurations-Menu der Easy.Box bei Daten→NAT→Port Mapping, nach diesem Foren-Thread, folgendes eingetragen habe:

LAN IP: SERVER_IP
Protokolltyp: UDP
LAN-Port: 9
Öffentlicher Port: 12345

Als SERVER_IP muss natürlich die IP des Servers im lokalen Netzwerk eingegeben werden. Port 9 ist der Standard-Port für WOL-Pakete. Anstatt 12345 kann man auch einen anderen Port wählen, diesen muss man aber später beim Senden des WOL-Paketes angeben. Zum Senden des WOL-Paketes verwende ich das Programm wakeonlan.
Vielen Dank an die hilfsbereiten, freundlichen und kompetenten User aus dem debianforum.de-Chat, die mir halfen das Problem zu lokalisieren und zu beheben.

Backup per rsync

Nun konnte ich per WOL meinen Server wecken und per SSH darauf zugreifen und es ging darum per rsync ein Backup auf den Server zu kopieren. Herausgekommen sind folgende Zeilen:

rsync -azP --delete --link-dest=../$(expr $(date +%-m) - 1) /home/USER_LOCAL USER_SERVER@SERVER_IP:backup/$(date +%-m)
rsync -azP --delete --link-dest=../$(expr $(date +%-m) - 1) /etc USER_SERVER@SERVER_IP:backup/$(date +%-m)

USER_LOCAL → Benutzername auf meinem Laptop, dessen home-Ordner ich sichere.
USER_SERVER → Benutzername auf dem Server, auf dem ich das Backup ablege.
SERVER_IP → IP des Servers (surprise, surprise :D)
Die Optionen -azP sind relativ simpel und können leicht in der manpage von rsync nachvollzogen werden.
`backup/$(date +%-m)` gibt an, dass das Update auf dem Server im Unterordner backup in einem weiteren Unterordner abgelegt wird. Der weitere Unterordner wechselt monatlich, d.h. im Juli wird nach $/backup/7 gesichert, im August nach $/backup/8. Dadurch erhalte ich Ordner 1 – 12, die jeweils das letze Backup für den Monat enthalten und kann auf jeweils ein monatliches Backup des letzten Jahres zurückgreifen.
`--delete` sorgt dafür, dass Dateien welche ich lokal lösche auch aus dem Backup entfernt werden.
Mittels `--link-dest=` gebe ich einen Ordner an, indem nach Übereinstimmungen gesucht wird. Ist in diesem Ordner eine Datei vorhanden und im Vergleich zur zu sichernden Datei unverändert, wird diese Datei nicht erneut übertragen sondern ein Hardlink auf die vorhandene Datei gesetzt. Dadurch wird die Größe des Backups verringert (Deduplikation). `../$(expr $(date +%-m) - 1)` sorgt dafür, dass als Linkziel der Ordner gewählt wird, der das Backup des Vormonats enthält (z.B. im Juli $/backup/6, im August $/backup/7). Im Januar funktioniert dies natürlich nicht ordnungsgemäß, da 1 – 1 = 0 ergibt. Das habe ich recht hemdsärmelig gelöst indem ich einen Symlink von $/backup/0 auf $/backup/12 gelegt habe. Damit wird auch im Januar der Vormonat Dezember als Linkziel gewählt.

Ruhezustand
Abschließend wird der Server per `ssh root@SERVER_IP:"pm-suspend & exit"` in den Ruhezustand versetzt.
Automatisierung

Um mich nicht mehr um das Backup kümmern zu müssen, sondern dieses automatisiert ablaufen zu lassen habe ich ein Script erstellt und unter `/etc/cron.daily/` gespeichert, damit es täglich ausgeführt wird.
Dieses Script sieht vor den Server per WOL aufzuwecken, anschließend das Backup durchzuführen und am Ende den Server in Suspend zu schicken. Das Script funktioniert auch soweit, ist allerdings noch nicht optimal und verhält sich teilweise noch nicht ganz korrekt, weshalb ich es hier noch nicht veröffentliche. Sobald die Kinderkrankheiten ausgemerzt sind werde ich es hier veröffentlichen.

[Nachtrag 2013-09-12]

Mittlerweile habe ich ein Script, das nach einigen Änderungen alles tut was es soll.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#! /bin/sh

# Backup-Server hochfahren
wakeonlan -p WOL_PORT SERVER_MAC 1>/dev/null
# Auch unter /usr/local/bin/wol

# Warten bis Backup-Server bereit
sleep 10

if [ `ping -c 1 SERVER_IP | grep -wc 100%` -eq 0 ]
then

sudo -u martin notify-send -a Backup "Automatisches Backup wird durchgeführt."

# Bei Problemen zu Testzwecken auskommentieren
# ssh -v -p SSH_PORT martin@SERVER_IP /bin/true

# Backup per rsync
rsync -az --delete --rsh="ssh -p SSH_PORT" --link-dest=../$(expr $(date +%-m) - 1) --exclude=martin/.cache --exclude=martin/Videos /home/martin martin@SERVER_IP:backup/$(date +%-m)
rsync -az --delete --rsh="ssh -p SSH_PORT" --link-dest=../$(expr $(date +%-m) - 1) /etc martin@SERVER_IP:backup/$(date +%-m)
rsync -az --delete --rsh="ssh -p SSH_PORT" --link-dest=../$(expr $(date +%-m) - 1) /root martin@SERVER_IP:backup/$(date +%-m)

# Server nach Backup schlafen schicken
ssh root@SERVER_IP -p SSH_PORT "pm-suspend-hybrid & exit"
# Bei Servern, die per SSH vom Internet erreichbar sind sollte man sich überlegen den root-login zu sperren und stattdessen sudo für pm-suspend-hybrid zu nutzen.

else
echo "Backup konnte nicht durchgeführt werden. \nDer Server war nicht erreichbar." | mail -s "Backup fehlgeschlagen!" martin@hostname
fi

Ich werde demnächst auch noch im Detail erklären, warum ich das so gelöst habe. Im Moment fehlt mir dazu leider die Zeit.

Teilen: FB | G+ | TW | E-Mail

Hinterlasse einen Kommentar oder diskutiere im OSBN-Chat.

In den Kommentaren können folgende Formatierungen genutzt werden.