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 itemliest eine vollständige Zeile initemein, ohne Backslashes speziell zu behandeln;do ... doneumfasst den Befehl, der für jede Zeile wiederholt wird;< backup-manifest.txtliefert das Manifest als Eingabe für die Schleife;test -fprüft, ob der entsprechende Pfad eine reguläre Datei ist, und&&gibtreadynur 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 zudataarbeiten;-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 | 0–59 |
| 2 | Stunde | 0–23 |
| 3 | Tag des Monats | 1–31 |
| 4 | Monat | 1–12 |
| 5 | Wochentag | 0–7, 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.



