Geplante Sicherung und Wiederherstellung

LinuxBeginner
Jetzt üben

Einführung

Eine brauchbare Sicherung besteht aus mehr als nur einem Archivierungsbefehl. Sie müssen wissen, welche Dateien sie enthält, überprüfen, ob sie gelesen werden kann, die benötigte Datei wiederherstellen und dafür sorgen, dass unbeaufsichtigte Ausführungen nachvollziehbar bleiben.

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 angegeben, sodass der Auftrag nicht vom aktuellen Verzeichnis einer interaktiven Shell abhängt.

Sicherungsumfang mit einem Manifest festlegen

In diesem Schritt erstellen Sie ein Manifest: eine einfache Textdatei mit einer Liste von Pfaden, durch die der Sicherungsumfang sichtbar und überprüfbar wird.

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 überprüft werden können:

nl -ba backup-manifest.txt

Überprüfen Sie mit einer while-Schleife, ob jede aufgeführte Quelldatei vorhanden ist. Lesen Sie zunächst den Aufbau des Befehls:

  • 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 speziell zu behandeln;
  • do ... done umfasst den Befehl, der für jede Zeile wiederholt wird;
  • < backup-manifest.txt liefert das Manifest als Eingabe für die Schleife;
  • test -f prüft, ob der entsprechende Pfad eine reguläre Datei ist, und && 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 aus dem Manifest erstellen

In diesem Schritt verwenden Sie tar -T, um die Dateinamen aus dem Manifest einzulesen. 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: es mit gzip komprimieren;
  • -f: den folgenden Archivdateinamen verwenden;
  • -C data: relativ zu data arbeiten;
  • -T backup-manifest.txt: die aufzunehmenden Dateien aus dem Manifest lesen.

Untersuchen Sie die erzeugte 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 überprüfen, ohne es zu entpacken

In diesem Schritt testen Sie das Archiv, bevor Sie sich darauf verlassen. Prüfen Sie zunächst 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 im Tar-Archiv enthaltenen Dateien auf, ohne sie zu entpacken:

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

Vergleichen Sie die gespeicherte Dateiliste mit dem Manifest:

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

Der Befehl sollte keine Unterschiede anzeigen. Stellen Sie sicher, 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 unabhängigen Daten überschrieben werden. Simulieren Sie das versehentliche Löschen der Konfiguration:

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

Entpacken Sie ausschließlich config/app.conf in das separate Wiederherstellungsverzeichnis:

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

Untersuchen Sie die wiederhergestellte Datei und kopieren Sie sie anschließend an ihren ursprünglichen Speicherort 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 Archivmitglied entpackt.

Ein zeitgestempeltes Sicherungsskript erstellen

In diesem Schritt erstellen Sie ein zeitgestempeltes Sicherungsskript. Cron startet Aufträge mit einer eingeschränkten Umgebung. Verwenden Sie daher in unbeaufsichtigt ausgeführten 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 dafür, dass jeder Durchlauf einen eindeutigen Dateinamen erhält. Die zugehörige Datei mit der Endung .contents dokumentiert exakt, welche Dateien im Archiv enthalten sind.

Einen Cron-Zeitplan einrichten und überprüfen

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

Position Feld Üblicher Bereich
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 in diesem Feld jede fünfte Einheit 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, korrekten 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

Überprü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 oberhalb des Zeitplans 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 tatsächlich 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 Editorfehler, bevor Sie sich auf den Zeitplan verlassen.

Protokollierung testen und die Prozentzeichenmaskierung verstehen

In diesem Schritt testen Sie die Protokollierung der Sicherung und lernen die besondere Behandlung von Prozentzeichen durch Cron kennen. Führen Sie zunächst 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, wo gewöhnliche %-Zeichen unproblematisch sind. Cron behandelt ein nicht maskiertes % in einem Crontab-Befehl jedoch speziell. Wenn Sie date direkt in einer Crontab-Zeile verwenden, müssen Sie jedes Prozentzeichen mit einem Backslash maskieren.

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

Der installierte Auftrag 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 überprüft werden kann.

Zusammenfassung

Sie haben den Sicherungsumfang in einem Manifest festgelegt, mit tar -T ein Archiv erstellt, es ohne Entpacken überprüft und eine ausgewählte Datei wiederhergestellt. Anschließend haben Sie ein zeitgestempeltes Sicherungsskript mit absoluten Pfaden geschrieben, einen Cron-Zeitplan eingerichtet und überprü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.