Schnelles inkrementelles Bash Backupscript

Ich musste heute für ein paar Linuxserver schnell eine Sicherung zaubern die halbwegs gut funktioniert.
Bisher wurden die VMs vom ESX jede Nacht komplett auf eine NAS gecloned.
Was natürlich saulahm ist und nebenbei noch massig Platz braucht.

Da ich gerne etwas weniger Traffik zwischen NAS und Servern hätte, sollte es eine inkrementelle Backuplösung sein.

Rausgekommen ist jetzt folgendes:

#!/bin/bash
# Sicherungsscript für wöchentlich-inkrementelle Backups
# restore geht per:
#
# cd /
# tar –extract –verbose –incremental –file=/mnt/backup/sicherung_linux/roero01-2011-04.tar
# tar –extract –verbose –incremental –file=/mnt/backup/sicherung_linux/roero01-2011-04-Di.tar
# tar –extract –verbose –incremental –file=/mnt/backup/sicherung_linux/roero01-2011-04-Mi.tar
# tar –extract –verbose –incremental –file=/mnt/backup/sicherung_linux/roero01-2011-04-Do.tar
# tar –extract –verbose –incremental –file=/mnt/backup/sicherung_linux/roero01-2011-04-Fr.tar
# tar –extract –verbose –incremental –file=/mnt/backup/sicherung_linux/roero01-2011-04-Sa.tar
# tar –extract –verbose –incremental –file=/mnt/backup/sicherung_linux/roero01-2011-04-So.tar
#
# Man kann auch nur die Stammdatei und dann bis z.B. Mittwoch restoren um den Stand von Mittwoch zu bekommen
# „tar –extract“ überschreibt alle Dateien ohne nachzufragen, dran denken beim restore nach /

# Datum im Format Jahr-Kalenderwoche (Wochenstart am Montag)
DATE=`date +%Y-%V`
TAG=`date +%a`
# Name des Backups
SICHERUNG=“$HOSTNAME-$DATE“

# Ausgabe um was es geht
echo „Starte Sicherung $SICHERUNG für Host $HOSTNAME“

# NAS 52 per NFS mounten
echo ‚Mounte das NFS‘
umount /mnt/backup
mount -t nfs 5.20.32.51:/raid0/data/backup /mnt/backup
sleep 5

# Es gibt immer eine .inc Datei und eine .tar Datei
if [ -e „/mnt/backup/sicherung_linux/$SICHERUNG.inc“ ]
then
echo „Sicherungsdatei bereits da, inkrementelles Backup nach $SICHERUNG-$TAG.tar“
tar –create –no-check-device –file=/mnt/backup/sicherung_linux/$SICHERUNG-$TAG.tar –listed-incremental=/mnt/backup/sicherung_linux/$SICHERUNG.inc \
/etc \
/home \
/srv \
/root
else
echo „Wochenstart, neue Sicherungsdatei $SICHERUNG-$TAG.tar erstellen“
tar –create –no-check-device –file=/mnt/backup/sicherung_linux/$SICHERUNG.tar –listed-incremental=/mnt/backup/sicherung_linux/$SICHERUNG.inc \
/etc \
/home \
/srv \
/root
fi

# Unmount und fertig
sleep 5
echo ‚Unmounting‘
umount /mnt/backup
echo ‚Fertig‘

Ab inne crontab und fertig.

ACHTUNG: Das WordPress hier macht aus doppelten Satzzeichen ein einzelnes.
Vor den tar Parametern wie extract, incremental und so sind zwei Bindestriche, nicht wie hier im Post zu sehen nur eines.

Wenn Ihr das nutzen wollt, müsst Ihr im Prinzip nur beim mount die Adresse vom NFS Server ändern (oder evtl. sogar SMB) und den Ordner anpassen, der bei mir jetzt „sicherung_linux“ ist.

In dem Sicherungsverzeichnis hat man später dann solche Dateien:

roero01:/usr/local/bin# ls -lah /mnt/backup/sicherung_linux/
insgesamt 851M
drwxrwxrw-+ 2 root root 4,0K 25. Jan 17:11 .
drwxrwx—+ 9 mailuser crontab 4,0K 25. Jan 16:50 ..
-rw-rw-rw-+ 1 root root 3,7M 25. Jan 2011 roero01-2011-04-Di.tar
-rw-rw-rw-+ 1 root root 608K 25. Jan 2011 roero01-2011-04.inc
-rw-rw-rw-+ 1 root root 846M 25. Jan 17:10 roero01-2011-04.tar

Also quasi das Grundbackup mit dem Stand von Montagmorgen und dann für jeden Tag eine kleine Datei in der nur die Dateien enthalten sind, die an diesem Tag geändert wurden.

In der .inc Datei stehen quasi nur Dateinamen und Timestamps drin.
Da steht dann, dass /root/yada.txt vom 1.1.2011 8 Uhr ist
Mache ich jetzt mein inkrementelles Dienstagsbackup, guckt tar in die .inc Datei rein und sieht, dass die Datei nicht mehr vom 1.1.2011 ist, sondern am 25.1.2011 geändert wurde und daher jetzt in die -Di.tar reinmuss.
Im Anschluss aktualisiert tar in der .inc Datei das Datum der yada.txt auf den 25.1.2011

Restoren geht wie im Script angegeben durch das extrahieren der .tar Dateien in der korrekten Reihenfolge.
Hierfür brauchen wir btw. die .inc Datei nicht mehr, die kann zum Start einer neuen Woche quasi weggeschmissen werden.
Man könnte z.B. Montagmorgen vor dem „tar –create“ ein „rm -f *.inc“ machen.

Was noch fehlt wäre jetzt ein Part, der alte Backups löscht.
Das könnte ein anderer Job sein, oder etwas, was zu Anfang des Scripts läuft.

find /mnt/backup/sicherung_linux/ -mtime +30″

Gibt uns die Dateien zurück. die älter als 30 Tage sind.
Mit ner for Schleife wären wir dabei.

Aufgrund von unglaublich dummer Formatierung hier im WordPress gibts das Script hier zu saugen: https://myangelone.com/files/incbackup.bz2

Viel Spass beim sichern 🙂