Unter Linux ist es sehr leicht möglich Backups zu erstellen ohne zusätzliche Programme zu installieren. Der Vorteil von tar gegenüber anderen Backup Programmen ist, dass tar Archive mit vielen Programmen wie zum Beispiel 7zip oder WinRAR geöffnet werden können und so das Wiederherstellen von Dateien sehr einfach ist.
Zuerst wollte ich meine Daten in die Amazon S3 Cloud speichern. Dies ist sehr einfach möglich und die Kosten sind auch sehr gering. Dann fiel mir jedoch auf, dass wenn ich aktiv meine Dateien von meinem Server auf einen anderen Server / Anbieter speichere, ich immer die Zugangsdaten dort hinterlegen muss. Das heißt, dass ein Angreifer, der die Kontrolle über meinen Server hat, auch die Kontrolle über alle anderen Server / Anbieter hat, auf denen ich meine Backups speichern würde. Daher habe ich mich dazu entschieden Backups zu erstellen und diese per SFTP freizugeben. So kann ein anderer Server sich die Backups einfach downloaden und die Zugangsdaten zum Server müssen nicht auf dem zu sichernden Server hinterlegt sein. Eine Anleitung zum Erstellen eines SFTP Servers gibts hier.
Die Grundlage des Backup Scripts kommt von ubuntuusers.de.
Hier mein Backup Script
Einstellungen:
- Backupname = Name, wie die Backupdatei später heißen soll
- Backupalter = Gibt an, wie lange die Backupdateien erhalten bleiben sollen (in Tagen)
- Backupdir = Ort, wo die Backups gespeichert werden
- Source = Ein Verzeichnis oder mehrere, die gesichert werden sollen
- Emailempfänger = Wer die Email erhalten soll (funktioniert nur mit installiertem Email Server). Wenn kein Email Server installiert ist, “root” eingeben.
#!/bin/bash # Script fuer inkrementelles Backup mit 7 taegigem Vollbackup ### Einstellungen ## BACKUPNAME="Backup" ## Name der Backupdatei. Datum wird automatisch angehangen BACKUPALTER="14" ## loescht Backups, die aelter als 14 Tage sind BACKUPDIR="home/ftp/backup" ## Pfad zum Speicherort der Backups TIMESTAMP="timestamp.dat" ## Zeitstempel. Benoetigt fuer inkrementelles Backup SOURCE="home/test /var/www" ## Verzeichnis(se) welche(s) gesichert werden soll(en) DATUM="$(date +%Y-%m-%d)" ## Datumsformat einstellen wochentag="$(date +%w)" ## gibt den aktuellen Wochentag aus EMAILEMPFAENGER="euremail.de" ## Email, an die ein Bericht gesendet wird STARTZEIT="$(date +%H:%M:%S)" ### Verzeichnisse/Dateien welche nicht gesichert werden sollen ! Achtung keinen Zeilenumbruch ! ## #EXCLUDE="--exclude=home/user/Filme --exclude=home/user/Musik --exclude=home/user/Spiele" ### Wechsel in root damit die Pfade stimmen ## cd / ### Backupverzeichnis anlegen ## mkdir -p ${BACKUPDIR} ### Test ob Backupverzeichnis existiert und Mail an Admin bei fehlschlagen ## if [ ! -d "${BACKUPDIR}" ]; then mail -s "Backupverzeichnis nicht vorhanden!" "${EMAILEMPFAENGER}" <<EOM Hallo Admin, das Backup am ${DATUM} konnte nicht erstellt werden. Das Verzeichnis ${BACKUPDIR} wurde nicht gefunden und konnte auch nicht angelegt werden. EOM . exit 1 fi filename=${BACKUPNAME}-${DATUM}-${STARTZEIT}.tgz ### ueberpruefen, ob FullBackup gemacht wird. 1 = Montag, 2 = Dienstag, ...## if [ "$wochentag" = '1' ]; then tar --listed-incremental=${BACKUPDIR}/${TIMESTAMP} --level=0 -cpzf ${BACKUPDIR}/${filename} ${SOURCE} ${EXCLUDE} else tar --listed-incremental=${BACKUPDIR}/${TIMESTAMP} -cpzf ${BACKUPDIR}/${filename} ${SOURCE} ${EXCLUDE} fi ### Enddatum erfassen ### ENDZEIT="$(date +%H:%M:%S)" ### Abfragen ob das Backup erfolgreich war ## if [ $? -ne 0 ]; then mail -s "Backup (${SOURCE}) war fehlerhaft!" "${EMAILEMPFAENGER}" <<EOM Hallo Admin, das Backup ${filename} am ${DATUM} wurde mit Fehler(n) beendet. EOM else ### Dateigroesse ermitteln ### GROESSE="$(du -sh ${BACKUPDIR}/${filename})" mail -s "Backup (${SOURCE}) war erfolgreich" "${EMAILEMPFAENGER}" <<EOM Hallo Admin, das Backup wurde erfolgreich erstellt. ----------------Details-------------------- Name: ${filename} Datum: ${DATUM} Startzeit: ${STARTZEIT} Endzeit: ${ENDZEIT} Dateigroesse: ${GROESSE} EOM fi ### Loeschen der alten Backups ## find "${BACKUPDIR}" -type f -mtime +"${BACKUPALTER}" -delete
Mein Backup Script ermöglicht es, dass
- jeden Montag Vollbackups erstellt werden
- an den anderen Tagen jeweils inkrementelle Backups erstellt werden. In diesen Backups werden nur die Änderungen gegenüber dem letzten Vollbackup gespeichert. Daher sind diese deutlich kleiner.
- bei jedem Start alle Backups überprüft und die Backups, die älter als 14 Tage sind gelöscht werden. Die 14 Tage können aber beliebig verändert werden.
!!!ACHTUNG !!!
Es werden ALLE Dateien gelöscht, die im “BACKUPDIR” und älter als 14 Tage sind. Also für das “BACKUPDIR” bitte einen neuen Ordner angeben.
Script starten
Um das Script zu starten, muss eine Datei erzeugt und danach noch die Berechtigungen der Datei angepasst werden.
nano /home/Benutzername/backup.sh backup.sh ist der Name der Datei. Hier kopiert ihr den obigen Code rein. /home/Benutzername/ ist das Verzeichnis. Dies kann beliebig geändert werden. chmod +x backup.sh ermöglicht das Starten des Scripts
Crontab anlegen
Nachdem ihr den obigen Befehl erfolgreich ausprobiert habt, legen wir jetzt einen Cronjob an, damit dieser automatisch ausgeführt wird.
Das geht mit
sudo crontab -e
Wenn ihr noch keinen Crontab angelegt habt, dann sollte folgende Meldung erscheinen. Hier drückt ihr einfach “1”.
Nun solltet ihr folgendes sehen.
Mein Backup Script liegt unter “/home/user/backup.sh”.
Fügt am Ende der Datei folgende Zeile ein:
PATH=/usr/sbin:/usr/bin:/sbin:/bin 0 4 * * * /home/user/backup.sh
Erklärung
1. Stelle: Minute -> 0 2. Stelle: Stunde -> 4 3. Stelle: Tag des Monats -> * 4. Stelle: Monat -> * 5. Stelle: Wochentag -> *
Das Skript wird also jeden Tag nachts um 4 Uhr gestartet.
Hallo,
ich habe dieses Script ein wenig mit deinem Nextcloud Backup Script kombiniert, vor allem der Datenbank Teil und das Ein- und Ausschalten des Wartungsmodus. Das funktioniert auch wunderbar.
Ich würde gerne die ältesten Backups erst löschen, wenn nicht mehr genug Speicherplatz vorhanden ist. Ist das auch in Kombination mit dem “find” Befehl möglich?
Liebe Grüße,
Matthias
Hallo,
wenn man mehrere backup-scripts verwendet, weil man unterscheiden möchte zwischen webs und mails-backup, reicht eine timestamp.dat, im zielordner?
Oder ist es besser die timestamp.dat in verschiedene ordner abzulegen, damit sich nichts überschreibt, und das inkrementelle backup funktioniert.
Gruss Ralf
Hallo,
ziemlich gutes Skript. Ich habe mir Kopien angelegt. Ein backup-script sichert die Webs, ein anderes mit angepassten Pfaden sichert die Mailfolder als Beispiel. Der Zielordner ist derselbe. Muss ich für jedes Script eine eigene timestamp.dat anlegen, oder kommt das Script damit klar, dass es 2 mal backupen soll? Funktioniert dann das inkrementelle trotzdem?
Gruss Ralf
Hallo,
ziemlich cool!
kann man mit dem Script eine komplette Raspberry Pi-SD auf eine NAS sichern? Was muss ich anpassen?
Zum Rücksichern, kopiere ich dann einfach den entpackten Inhalt der TAR-Datei auf eine SD?
(ja, ich bin kompletter Anfänger…)
Neugierige Grüße,
Andreas
Könnten Sie eventuell noch erläutern wie man das Backup wiederherstellen kann?
Gruss
dein script ähnelt sehr mit dem script vom ubuntu Foren 🙂
könnten sie mir das genauer erklären wo ich zb das script einfügen soll / muss?