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:
Ubuntu 20.04 Focal Fossa
Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
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 (universe)
Befehl zum Installieren der Pakete:
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 BackupverzeichnisROTATEDIR="media/backup/rotate"
- Pfad, wo die Backups nach 30 Tagen konserviert werdenSOURCE="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.
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 -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.
Links¶
Using tar to Perform Incremental Dumps 🇬🇧 im tar-Handbuch
Backup Your System - tar 🇬🇧 - nützliche tar-Parameter im englischen Ubuntu-Wiki