ubuntuusers.de

Hinweis: Dies ist ein statischer Snapshot unseres Wikis vom 25. März 2013 und kann daher nicht bearbeitet werden. Der aktuelle Artikel ist unter wiki.ubuntuusers.de zu finden.

inkrementelles Backup

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

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

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

Wiki/Vorlagen/Installbutton/button.png mit apturl

Paketliste zum Kopieren:

sudo apt-get install mailutils 

sudo aptitude install 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
#!/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

### 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
mv ${BACKUPDIR}/* ${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 -czf ${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 ........ "

Diese Datei speichert man in sein Home-Verzeichnis unter dem Namen backup.sh

Bereit zum Ausführen

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

sudo chmod +x ~/backup.sh 

Anschließend wird das Skript dann direkt verschoben, um es täglich automatisch ausführen zu lassen.

sudo mv backup.sh /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 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
for archiv in ${BACKUPDIR}/backup-*.tgz; do
tar -xzf $archiv -C /
done 

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.

./ruecksicher.sh 

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

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 

Nun merkt man sich den Pfad und stellt die Datei wieder her.

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

Die Datei wird nun in den ursprünglichem Pfad wiederhergestellt.

ubuntuusers.local › WikiSkripteinkrementelles Backup