ubuntuusers.de

inkrementelles Backup

Ausbaufähige Anleitung

Dieser Anleitung fehlen noch einige Informationen. Wenn Du etwas verbessern kannst, dann editiere den Beitrag, um die Qualität des Wikis noch weiter zu verbessern.


Anmerkung: Das im Artikel enthaltene Skript könnte überarbeitet werden (siehe Diskussion).

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

Wiki/Icons/terminal.png Wie wertvoll ein Backup der persönlichen Daten sein kann, erkennt man meist erst, wenn der Ernstfall eingetreten ist. Einige lehnen sich dann entspannt zurück und schreiben die "verlorenen Daten" mit einer kurzen Befehlszeile zurück, andere beißen vor Wut in die Tischkante, weil sie vergessen haben, ein Backup zu machen. Mittels des hier vorgestellten kleinen Skriptes sollte jeder in der Lage sein, sich im Ernstfall entspannt zurückzulehnen.

Funktion

Dieses Backupskript erstellt ein Grundbackup und eine tägliche Sicherung der geänderten Daten. Dazu bedient es sich des Programmes tar und des Dienstes anacron. Der Dienst anacron sorgt dafür, dass immer ein Backup nach dem ersten Rechnereinschalten des Tages gemacht wird. Somit ist sichergestellt, dass nicht vergessen wird, ein Backup anzulegen bzw. dass ein Backup nicht angelegt wird, weil die Ausführungszeit vor Einschalten des Rechners liegt, was z.B. der Fall bei cron wäre. Nach jedem Backupvorgang wird eine Mail an root gesendet, in der mitgeteilt wird ob das Backup von Erfolg gekrönt war oder ob ein Fehler aufgetreten ist.

Installation

Folgendes Paket sollte bei Bedarf installiert werden [4]:

  • mailutils (universe)

Paketliste zum Kopieren:

sudo apt-get install mailutils 

Oder mit apturl installieren, Link: apt://mailutils

(nur notwendig wenn man keinen anderen MTA installiert hat und sich Mails über den Backup-Erfolg senden lassen möchte)

Das Skript

Zuerst öffnet man einen Texteditor [2] und kopiert den folgenden Text hinein:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
#!/bin/bash
# Script fuer inkrementelles Backup mit 30 taegigem Vollbackup

### Einstellungen ##
BACKUPDIR="media/backup"           ## Pfad zum Backupverzeichnis
ROTATEDIR="media/backup/rotate"    ## Pfad wo die Backups nach 30 Tagen konserviert werden
TIMESTAMP="timestamp.dat"          ## Zeitstempel
SOURCE="home/user"                 ## Verzeichnis(se) welche(s) gesichert werden soll(en)
DATUM="$(date +%d-%m-%Y)"          ## Datumsformat einstellen
ZEIT="$(date +%H:%M)"              ## Zeitformat einstellen >>Edit bei NTFS und Verwendung auch unter Windows : durch . ersetzen

### Verzeichnisse/Dateien welche nicht gesichert werden sollen ! Achtung keinen Zeilenumbruch ! ##
EXCLUDE="--exclude=home/user/Filme --exclude=home/user/Musik --exclude=home/user/Spiele --exclude=home/user/.VirtualBox  --exclude=home/user/.local/share/Trash"

### 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!" root <<EOM
Hallo Admin,
das Backup am ${DATUM} konnte nicht erstellt werden. Das Verzeichnis ${BACKUPDIR} wurde nicht gefunden und konnte auch nicht angelegt werden.
Mit freundlichem Gruss Backupscript
EOM

 . exit 1
fi

### Alle Variablen einlesen und letzte Backupdateinummer herausfinden ##
set -- ${BACKUPDIR}/backup-???.tgz
lastname=${!#}
backupnr=${lastname##*backup-}
backupnr=${backupnr%%.*}
backupnr=${backupnr//\?/0}
backupnr=$[10#${backupnr}]

### Backupdateinummer automatisch um +1 bis maximal 30 erhoehen ##
if [ "$[backupnr++]" -ge 30 ]; then
mkdir -p ${ROTATEDIR}/${DATUM}-${ZEIT}

### Test ob Rotateverzeichnis existiert und Mail an Admin bei fehlschlagen ##
if [ ! -d "${ROTATEDIR}/${DATUM}-${ZEIT}" ]; then

mail -s "Rotateverzeichnis nicht vorhanden!" root <<EOM
Hallo Admin,
die alten Backups konnten am ${DATUM} nicht verschoben werden. Das Verzeichnis ${ROTATEDIR} wurde nicht gefunden und konnte auch nicht angelegt werden.
Mit freundlichem Gruss Backupscript
EOM

 . exit 1
else
### alter Code: mv ${BACKUPDIR}/* ${ROTATEDIR}/${DATUM}-${ZEIT}  Damit verschiebt er die Dateien in sich selbst weil rotate ein Unterverzeichnis von backup ist. Es kommt zur Fehlermeldung ##
### /b* und /t* weil die Dateien nur mit b und t beginnen ##
mv ${BACKUPDIR}/b* ${ROTATEDIR}/${DATUM}-${ZEIT} 
mv ${BACKUPDIR}/t* ${ROTATEDIR}/${DATUM}-${ZEIT} 
fi

### Abfragen ob das Backupverschieben erfolgreich war ##
if [ $? -ne 0 ]; then

mail -s "Backupverschieben fehlerhaft!" root <<EOM
Hallo Admin,
die alten Backups konnte am ${DATUM} nicht verschoben werden.
Mit freundlichem Gruss Backupscript
EOM

exit 1
else

mail -s "Backupverschieben erfolgreich" root <<EOM
Hallo Admin,
die alten Backups wurde am ${DATUM} erfolgreich nach ${ROTATEDIR}/${DATUM}-${ZEIT} verschoben.
Mit freundlichem Gruss Backupscript
EOM

### die Backupnummer wieder auf 1 stellen ##
backupnr=1 
fi 
fi

backupnr=000${backupnr}
backupnr=${backupnr: -3}
filename=backup-${backupnr}.tgz

### Nun wird das eigentliche Backup ausgefuehrt ##
tar -cpzf ${BACKUPDIR}/${filename} -g ${BACKUPDIR}/${TIMESTAMP} ${SOURCE} ${EXCLUDE}

### Abfragen ob das Backup erfolgreich war ##
if [ $? -ne 0 ]; then

mail -s "Backup (${SOURCE}) war fehlerhaft!" root <<EOM
Hallo Admin,
das Backup ${filename} am ${DATUM} wurde mit Fehler(n) beendet.
Mit freundlichem Gruss Backupscript
EOM

else

mail -s "Backup (${SOURCE}) war erfolgreich" root <<EOM
Hallo Admin,
das Backup ${filename} am ${DATUM} wurde erfolgreich beendet.
Mit freundlichem Gruss Backupscript
EOM

fi

Erklärungen

Die wenigen Einstellungen, welche man im Skript vornehmen muss, sind eigentlich hinreichend beschrieben. Wichtig sind:

  • BACKUPDIR="media/backup" - Pfad zum Backupverzeichnis

  • ROTATEDIR="media/backup/rotate" - Pfad, wo die Backups nach 30 Tagen konserviert werden

  • SOURCE="home/user" - Verzeichnis(se), welche(s) gesichert werden soll(en)

Weiterhin sollte man die Unterverzeichnisse des Source-Verzeichnisses, welche nicht gesichert werden sollen anpassen.

  • EXCLUDE="--exclude=home/user/Filme ........ "

Das Skript speichert man im Homeverzeichnis unter dem Namen backup. Der Dateiname darf keine Punkte enthalten, sonst wird das Script von Anacron nicht regelmäßig automatisch ausgeführt!

Wie das tar-Handbuch 🇬🇧 empfiehlt, sollte man beim Backup eines LVM-Snapshots mit tar die Option --no-check-device übergeben. Möchte man den Inhalt von Mountpoints, die auf andere Dateisysteme zeigen, nicht sichern, so fügt man die Option --one-file-system hinzu; diese Option kann z.B. für Backups des gesamten Dateisystems, also von / benutzt werden, um temporäre Dateisysteme wie /proc auszuschließen. All diese Optionen sollten vor -czf stehen, da nach f der Dateiname des Backups folgen muss.

Bereit zum Ausführen

Nun wird ein Terminal geöffnet [1] und das Skript ausführbar gemacht [3]

sudo chmod +x ~/backup 

Anschließend wird das Skript dann mit Root-Rechten verschoben, um es täglich automatisch ausführen zu lassen:

sudo mv backup /etc/cron.daily 

Achtung!

Das Skript überprüft nicht, ob im Backupverzeichnis genügend freier Speicher vorhanden ist. Sollte der Platz zu gering sein, bricht das Skript mit einer Fehlermeldung ab. Wer sich keine automatische Statusmail schicken lässt, sollte daher immer mal das Backupverzeichnis kontrollieren.

Hinweis:

Alle 30 Tage wird der Inhalt des Backupordners verschoben und ein neues Komplettbackup angelegt. Die "alten Backups" werden nicht automatisch gelöscht, sondern müssen bei Bedarf manuell gelöscht werden. Zu finden sind diese im {ROTATEDIR}/{DATUM}.

Daten zurücksichern

Das Backup wird erstellt, um im Ernstfall die Daten wiederherstellen zu können. Dies funktioniert dann ganz einfach per Terminal [1]:

BACKUPDIR=/media/backup   # Pfad zum Backupverzeichnis
cd / # Dies sollte trotz des Parameters -C ausgeführt werden, da ansonsten u. U. mittlerweile gelöschte Dateien eines inkrementellen Backups dennoch wiederhergestellt werden.
for archiv in ${BACKUPDIR}/backup-*.tgz; do
tar --listed-incremental=/dev/null -xpzf $archiv -C /
done 

Erfolgt die Wiederherstellung nicht vom ursprünglichen System aus, sondern z.B. von einer Live-CD, sollte man den Parameter --numeric-owner in Betracht ziehen.

Achtung!

tar löscht alle Dateien, die zum Zeitpunkt der Sicherung nicht existiert haben!

Wenn man dies als eine ausführbare Datei [3] speichert (z.B. ruecksicher.sh), so kann man später einfach per Terminal [1] die Daten wiederherstellen:

chmod +x ./ruecksicher.sh # vor dem ersten Ausführen
./ruecksicher.sh 

Will man nur einzelne Dateien zurücksichern, so bedient man sich des folgenden Tricks. Dies ist notwendig, da mit inkrementellen Backups gearbeitet wird und die letzte Sicherung der verlorenen Datei benötigt wird.

  1. Zuerst sucht man die Datei:

    BACKUPDIR=media/backup
    ls -l ${BACKUPDIR}
    for archiv in ${BACKUPDIR}/backup-*.tgz; do
    tar -tzf $archiv -C / | grep Name_der_Datei;
    done 
  2. Nun merkt man sich den Pfad und stellt die Datei wieder her:

    for archiv in ${BACKUPDIR}/backup-*.tgz; do
    tar -xpzf $archiv -C /   home/user/pfad/zur/datei/Name_der_Datei
    done 

    Die Datei wird nun im ursprünglichem Pfad wiederhergestellt.

Probleme bei Backup Quellen, die über Samba/CIFS oder NFS eingebunden werden

Nach einem Neustart des Systems kann es vorkommen, dass tar wieder ein komplettes Backup macht, anstatt nur die Änderungen zu speichern, wenn die Backupquelle über Samba/CIFS oder NFS eingebunden ist. Dies liegt daran, dass tar Metadaten in den Snapshot Dateien speichert, die die Device Nummern enthalten. Diese können sich nach einem Kernel Update oder gerade bei Netzwerkquellen nach einem Neustart ändern. tar kann gezwungen werden, diese Information zu ignorieren. Dies geschieht über die Angabe der Option --no-check-device beim Programmaufruf.

Diese Revision wurde am 14. April 2019 11:26 von Beforge erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Backup, Shell, Sicherheit