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.