automatisches backup

Wie so viele habe ich das Thema Backup meiner heimischen Entwicklungsumgebung und auch meiner im Netz befindlichen Server eher vernachlässigt.

Nachdem ich einige Tage Arbeit fast vollständig verloren habe, musste eine Strategie her um die laufenden Umgebungen unabhängig wo sie laufen zu sichern und möglichst nicht noch weitere kosten entstehen zu lassen.

Die Systeme laufen alle mit einem Linux. Als gewünschtes Ziel war das zuhause laufende Synology NAS schnell gewählt. Zusätzlich ist mir diese Backup Strategie wieder in den Sinn gekommen.

Meine Backup Strategie

In meiner Arbeitsumgebung gibt es einen Jump Host, der sich auf alle Umgebungen per SSH verbinden kann. Das lokale NAS wird im Dateisystem eingebunden und hactar wird genutzt um die Daten aller Systeme zu sichern.

Datenbanken werden auf jedem System mehrfach am Tag ins Dateisystem gesichert. Somit sind auch diese konsistent auf der Platte und es gibt keinerlei Probleme eine Datenbank wiederherzustellen.

Vorbereitung

Als ersten Schritt im NAS einen neuen User anlegen sowie eine eigene Freigabe für die Backups. Im folgenden ist network_backup der User, die Freigabe und das Kennwort. Die Freigabe ist bei mir ein smb/cifs Laufwerk.

Auf dem Debian Jessie basiertem Jump Host wird das Paket autofs installiert.

Natürlich muss hactar auch installiert werden. Es handelt sich um bash script, welches bei bedarf problemlos erweitert oder verändert werden kann.

wget -O /usr/local/bin/hactar https://raw.githubusercontent.com/florianbeer/hactar/master/hactar
chmod +x /usr/local/bin/hactar

Einbinden des Freigabe Ordners

Sowohl das Ubuntu Wiki als auch der Ideen bringende Beitrag erklären besser als ich es je könnte wie autofs funktioniert. Die folgenden Einstellungen habe ich bei mir gemacht um die smb Mounts meines Synology NAS unter Debian Jessie einzubinden:

Die Datei /etc/auto.master.d/cifs.autofs anlegen mit dem Inhalt:

/mnt  /etc/auto.diskstation --timeout=300 --ghost

Jetzt die Datei mit den Anweisungen zum eigentlich mount (/etc/auto.diskstation) anlegen:

diskstation -fstype=cifs,rw,username=network_backup,password=network_backup ://synology/network_backup

Nach einem Neustart (service autofs restart) des Dienstes kann mit dem Wechsel in das Verzeichnis /mnt/diskstation geprüft werden ob die Einbindung erfolgreich war.

Um ein erfolgreiches Backup, inklusive aller benötigen Dateirechte durchzuführen ist jedoch ein weiterer Schritt notwendig.

Sparse Image

Es erfolgt ein ähnlicher Prozess den auch Apple für Timemachine nutzt, es wird ein Sparse Image anlegt welches dann ins Dateisystem eingebunden wird um das eigentliche Backup durchzuführen.

Ich lege für jeden Host ein einzelnes Image an, damit wird es mir in der Zukunft leichter fallen das Backup einzelner Hosts auf andere Umgebungen zu migrieren.

Folgende Schritte führe ich aus um ein Image mit 30GB anzulegen und das image mit einem ext4 Dateisystem zu formatieren. Im folgenden muss $HOSTNAME immer angepasst werden.

mkdir /mnt/diskstation/$HOSTNAME
dd if=/dev/zero of=/mnt/diskstation/$HOSTNAME/backup.img bs=1 seek=30G count=1
mkfs.ext4 /mnt/diskstation/$HOSTNAME/backup.img

Auch das Image soll via automount zur Verfügung stehen. Deswegen wird die Datei /etc/auto.master.d/img.autofs einmalig angelegt:

/- /etc/auto.diskstation.img --timeout=300 --ghost

Jetzt müssen alle Backup Images in der Datei /etc/auto.diskstation.img nach folgendem Schema hinterlegt werden.

/backup_$HOSTNAME -fstype=ext4,defaults,sync,dirsync,commit=1,loop :/mnt/diskstation/$HOSTNAME/backup.img

Vor einem Neustart (service autofs restart) muss dann noch das jeweilige Verzeichnis angelegt (mkdir /backup_$HOSTNAME) werden.

Backup durchführen

Die neu angelegten Verzeichnisse /backup_$HOSTNAME wandern bei mir sofort in die lokale /etc/hactar.excludes Liste.

Weil es mir bisher so gereicht hat, wird für jedes Backup ein weiterer Eintrag nach dem folgenden Muster erzeugt:

# Ensure synology is present
cd /mnt/diskstation/
touch /mnt/diskstation/$HOSTNAME/last_run

# ensure that we have some backup dir
cd /backup_$HOSTNAME/
touch /backup_$HOSTNAME/run

# check if this is a filesystem to not fill the local FS
if [ -d "/backup_$HOSTNAME/lost+found/" ];then
	# mache ein backup und behalte für drei tage
	/usr/local/bin/hactar -r 7 -e /etc/hactar.excludes  $HOSTNAME_FQDN:/ /backup_$HOSTNAME/
else
	echo "no backup mount for $HOSTNAME present"
fi

Eine Funktion zu nutzen wäre sicherlich eleganter - aber so läuft es jetzt.

Damit der Jump Server sich Problemlos und ohne Kennwort auf die Systeme verbinden kann, muss ein lokal erzeugter SSH Key auf den Backup Server kopiert werden. Wenn man sich unsicher ist, kann das Hetzner Wiki helfen.

Mittels crontab wird so in der Nacht einmal alles gesichert und kann bei bedarf simpel wiederhergestellt werden. Auch das zurückholen einzelner Dateien ist - soweit sie einmal gesichert wurden - problemlos möglich.

Das spannende bei hactar ist eigentlich das es der wrapper für rsync ist wie ich ihn mir immer mal selbst schreiben wollte um das in der c't 8/03 vorgestellte Backup Konzept selbst umzusetzen.

Danke Florian.