Geplante Sicherung und Wiederherstellung

LinuxBeginner
Jetzt üben

Einführung

Eine brauchbare Sicherung besteht aus mehr als einem Archivierungsbefehl. Sie müssen wissen, welche Inhalte sie enthält, prüfen, ob sie gelesen werden kann, die benötigte Datei wiederherstellen und unbeaufsichtigte Ausführungen nachvollziehbar machen.

In diesem Lab sichern Sie einen kleinen Anwendungsarbeitsbereich anhand eines Manifests, stellen eine ausgewählte Datei wieder her, wandeln den Ablauf in ein zeitgestempeltes Skript um und richten einen Cron-Zeitplan ein. Alle automatisierten Pfade sind absolut, damit der Job nicht vom aktuellen Verzeichnis einer interaktiven Shell abhängt.

Sicherungsumfang mit einem Manifest festlegen

In diesem Schritt erstellen Sie ein Manifest: eine Klartextliste von Pfaden, die den Sicherungsumfang sichtbar und überprüfbar macht.

Wechseln Sie in den Arbeitsbereich:

cd /home/labex/project/backup-lab

Erstellen Sie ein Manifest mit Pfaden relativ zum Verzeichnis data:

cat > backup-manifest.txt <<'EOF'
config/app.conf
documents/runbook.txt
EOF

Nummerieren Sie die Einträge, damit sie leicht zu prüfen sind:

nl -ba backup-manifest.txt

Prüfen Sie mit einer while-Schleife, ob jede aufgeführte Quelldatei vorhanden ist. Lesen Sie zunächst die Struktur, bevor Sie die Schleife ausführen:

  • IFS= verhindert, dass die Shell Leerzeichen am Anfang oder Ende einer Zeile entfernt.
  • read -r item liest eine vollständige Zeile in item ein, ohne Backslashes besonders zu behandeln.
  • do ... done umfasst den Befehl, der für jede Zeile wiederholt wird.
  • < backup-manifest.txt liefert das Manifest als Eingabe der Schleife.
  • test -f prüft, ob der entsprechende Pfad eine reguläre Datei ist. && gibt ready nur aus, wenn diese Prüfung erfolgreich ist.
while IFS= read -r item; do
  test -f "data/$item" && echo "ready: $item"
done < backup-manifest.txt

Die nicht aufgeführte Datei documents/scratch.txt liegt absichtlich außerhalb dieser verwalteten Sicherung.

Ein Archiv anhand des Manifests erstellen

In diesem Schritt verwenden Sie tar -T, um Dateinamen aus dem Manifest zu lesen. Die Option -C data sorgt dafür, dass das Archiv kurze relative Pfade verwendet.

tar -czf backups/manual-backup.tar.gz -C data -T backup-manifest.txt

Die Optionen bedeuten:

  • -c: ein Archiv erstellen;
  • -z: das Archiv mit gzip komprimieren;
  • -f: den folgenden Archivdateinamen verwenden;
  • -C data: relativ zu data arbeiten;
  • -T backup-manifest.txt: die Archivdateien aus dem Manifest lesen.

Prüfen Sie die entstandene Datei:

ls -lh backups/manual-backup.tar.gz

Vergleichen Sie Zeitstempel und Größe mit den Quelldateien:

stat -c '%n size=%s modified=%y' backups/manual-backup.tar.gz data/config/app.conf data/documents/runbook.txt

Das Archiv prüfen, ohne es zu entpacken

In diesem Schritt testen Sie das Archiv, bevor Sie sich darauf verlassen. Prüfen Sie zuerst den gzip-Datenstrom:

gzip -t backups/manual-backup.tar.gz

Keine Ausgabe bedeutet, dass der komprimierte Datenstrom die Integritätsprüfung bestanden hat. Listen Sie nun die tar-Dateien auf, ohne sie zu entpacken:

tar -tzf backups/manual-backup.tar.gz | tee archive-contents.txt

Vergleichen Sie die gespeicherte Liste mit dem Manifest:

diff -u backup-manifest.txt archive-contents.txt

Der Befehl sollte keine Unterschiede anzeigen. Bestätigen Sie, dass die nicht verwaltete Scratch-Datei fehlt:

if tar -tzf backups/manual-backup.tar.gz | grep -qx 'documents/scratch.txt'; then
  echo "Unexpected scratch file found"
else
  echo "Archive scope is correct"
fi

Eine ausgewählte Datei wiederherstellen

In diesem Schritt stellen Sie nur eine ausgewählte Datei wieder her, damit keine nicht betroffenen Daten überschrieben werden. Simulieren Sie das versehentliche Löschen der Konfigurationsdatei:

rm data/config/app.conf
test -e data/config/app.conf || echo "app.conf is missing"

Entpacken Sie nur config/app.conf in das separate Wiederherstellungsverzeichnis:

rm -rf restore/*
tar -xzf backups/manual-backup.tar.gz -C restore config/app.conf

Prüfen Sie die wiederhergestellte Datei und kopieren Sie sie anschließend an ihren Arbeitsort zurück:

cat restore/config/app.conf
cp restore/config/app.conf data/config/app.conf
cmp -s restore/config/app.conf data/config/app.conf && echo "Configuration restored"

Es wurde nur das angeforderte Archivelement entpackt.

Ein zeitgestempeltes Sicherungsskript erstellen

In diesem Schritt erstellen Sie ein zeitgestempeltes Sicherungsskript. Cron startet Jobs mit einer eingeschränkten Umgebung. Verwenden Sie daher in unbeaufsichtigten Skripten absolute Pfade.

Erstellen Sie backup.sh:

cat > backup.sh <<'EOF'
#!/bin/bash

source_dir=/home/labex/project/backup-lab/data
manifest=/home/labex/project/backup-lab/backup-manifest.txt
backup_dir=/home/labex/project/backup-lab/backups
timestamp=$(date +%Y%m%d-%H%M%S)
archive="$backup_dir/backup-$timestamp.tar.gz"

mkdir -p "$backup_dir"

if [ ! -d "$source_dir" ] || [ ! -f "$manifest" ]; then
  echo "Backup source or manifest is missing" >&2
  exit 1
fi

/bin/tar -czf "$archive" -C "$source_dir" -T "$manifest" || exit 1
/bin/tar -tzf "$archive" > "$archive.contents" || exit 1

echo "Created $archive"
exit 0
EOF

Machen Sie das Skript ausführbar und testen Sie es jetzt, statt auf Cron zu warten:

chmod u+x backup.sh
./backup.sh | tee last-backup.txt
ls -1 backups

Der Zeitstempel sorgt bei jedem Lauf für einen eindeutigen Dateinamen. Die zugehörige Datei .contents dokumentiert genau, was das Archiv enthält.

Einen Cron-Zeitplan einrichten und prüfen

In diesem Schritt richten Sie einen persönlichen Cron-Zeitplan ein und prüfen ihn. Eine crontab-Zeile beginnt mit fünf Zeitplanfeldern, gefolgt vom Befehl:

Position Feld Üblicher Wertebereich
1 Minute 059
2 Stunde 023
3 Tag des Monats 131
4 Monat 112
5 Wochentag 07, wobei Sonntag 0 oder 7 ist

Ein Sternchen * steht für jeden zulässigen Wert. Ein Schritt wie */5 bedeutet, dass dieses Feld alle fünf Einheiten verwendet wird.

minute hour day-of-month month day-of-week command

Beispielsweise bedeutet */5 * * * * alle fünf Minuten. 0 2 * * * bedeutet täglich um 02:00 Uhr.

crontab -e öffnet Ihre persönliche crontab in einem Editor. Ein zuverlässiger Ablauf besteht darin, zuerst einen bekannten, gültigen Eintrag vorzubereiten und zu installieren und anschließend eine kleine interaktive Änderung vorzunehmen. Erstellen Sie einen Eintrag, der absolute Pfade verwendet und sowohl die Standardausgabe als auch die Standardfehlerausgabe protokolliert:

cat > backup.crontab <<'EOF'
*/5 * * * * /home/labex/project/backup-lab/backup.sh >> /home/labex/project/backup-lab/logs/backup.log 2>&1
EOF

Prüfen und installieren Sie den Eintrag:

cat backup.crontab
crontab backup.crontab

Öffnen Sie nun die installierte crontab in Nano:

EDITOR=nano crontab -e

Fügen Sie in der Zeile über dem Zeitplan diesen Kommentar ein:

## LabEx managed backup schedule

Drücken Sie Ctrl+O und anschließend Enter, um zu speichern. Drücken Sie Ctrl+X, um Nano zu verlassen und zur Shell zurückzukehren. Prüfen Sie mit crontab -l, was Cron genau lesen wird, und speichern Sie diese Ausgabe:

crontab -l | tee installed-crontab.txt

Die Ausgabe sollte den Kommentar gefolgt vom Eintrag für die Ausführung alle fünf Minuten enthalten. Durch die Prüfung des installierten Ergebnisses erkennen Sie Fehler im Editor, bevor Sie sich auf den Zeitplan verlassen.

Protokollierung testen und die Maskierung von Prozentzeichen verstehen

In diesem Schritt testen Sie die Protokollierung der Sicherung und lernen die besondere Behandlung von Prozentzeichen durch Cron kennen. Führen Sie zuerst den geplanten Befehl manuell aus:

/home/labex/project/backup-lab/backup.sh >> /home/labex/project/backup-lab/logs/backup.log 2>&1
tail -n 5 logs/backup.log
find backups -maxdepth 1 -type f -name 'backup-*.tar.gz' -printf '%f\n' | sort

Der Zeitstempel wird innerhalb von backup.sh erzeugt. Dort sind normale %-Zeichen unproblematisch. Cron behandelt ein nicht maskiertes % in einem crontab-Befehl jedoch besonders. Wenn Sie date direkt in einer crontab-Zeile verwenden, maskieren Sie jedes Prozentzeichen mit einem Backslash.

Speichern Sie ein korrekt maskiertes Beispiel als Referenz:

cat > cron-date-example.txt <<'EOF'
0 2 * * * /bin/echo "backup-$(/bin/date +\%Y\%m\%d-\%H\%M\%S)" >> /home/labex/project/backup-lab/logs/date-example.log 2>&1
EOF
cat cron-date-example.txt

Ihr installierter Job bleibt der einfachere skriptbasierte Eintrag. Er verwendet absolute Pfade, versieht jedes Archiv mit einem Zeitstempel und hinterlässt ein Protokoll, das nach unbeaufsichtigten Ausführungen geprüft werden kann.

Zusammenfassung

Sie haben den Sicherungsumfang in einem Manifest festgelegt, mit tar -T ein Archiv erstellt, es ohne Entpacken geprüft und eine ausgewählte Datei wiederhergestellt. Anschließend haben Sie ein zeitgestempeltes Sicherungsskript mit absoluten Pfaden geschrieben, einen Cron-Zeitplan eingerichtet und geprüft, die Ausgabe unbeaufsichtigter Ausführungen in ein Protokoll umgeleitet und gelernt, warum Prozentzeichen maskiert werden müssen, wenn date direkt in einem crontab-Befehl verwendet wird.