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“.

cert_3

Nun solltet ihr folgendes sehen.

cert_4

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.

Teile diesen Beitrag
Christian

Categories:

13 Kommentare

    • Das Skript kann an jedem beliebigen Ort gespeichert / erstellt werden.

      Später im Schritt „Crontab anlegen“ muss nur auf diesen Pfad verwiesen werden.
      In diesem Beispiel wurde das Skript an folgendem Ort erstellt: „/home/Nutzername/backup.sh“

  1. 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

    • Hallo,
      ich weiß leider nicht genau, ob Linux „sich selbst“ sichern kann. Habe es noch nie versucht.
      Das Skript ist gedacht um wichtige Daten zu sichern.

      Sie können es jedoch gerne ausprobieren und mir dann davon berichten. Wenn Sie alles sichern möchten, dann müssen Sie diese Zeile Code nutzen
      BACKUPDIR=""

      Liebe Grüße
      Christian

  2. 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

  3. 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

  4. 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.