Zum Inhalt springen

Datensicherung

Drei Dinge passieren garantiert, nur der Zeitpunkt ist offen:

  • Hardware stirbt. Festplatten und SSDs fallen aus, oft ohne Vorwarnung.
  • Menschen machen Fehler. rm -rf im falschen Verzeichnis, ein Skript mit einer leeren Variable, ein Update, das die Konfiguration überschreibt.
  • Ransomware verschlüsselt. Und sie verschlüsselt alles, was vom befallenen System aus erreichbar ist, auch die «Sicherung» auf der angeschlossenen USB-Platte oder dem gemounteten Netzlaufwerk.

Eine Datensicherung (Backup) ist eine Kopie, die zu einem anderen Zeitpunkt entstanden ist und an einem anderen Ort liegt. Ein RAID ist kein Backup (es spiegelt den Fehler sofort mit), ein Snapshot ist kein Backup (er liegt auf derselben Platte), und eine Cloud-Synchronisation ist kein Backup (sie synchronisiert auch das Löschen).

Art Was wird gesichert Vorteile Nachteile
Vollsicherung Alles Ein einziges Set, einfacher Restore Viel Zeit, viel Platz
Inkrementell Alles seit der letzten Sicherung (egal welcher Art) Schnell, wenig Platz Restore braucht die Vollsicherung und alle Inkremente in der richtigen Reihenfolge
Differenziell Alles seit der letzten Vollsicherung Restore braucht nur zwei Sets (Voll + letztes Differenzial) Jeden Tag etwas grösser und langsamer als inkrementell
flowchart LR
    subgraph inkrementell
        direction LR
        A1[So<br/>Voll] --> A2[Mo<br/>seit So]
        A2 --> A3[Di<br/>seit Mo]
        A3 --> A4[Mi<br/>seit Di]
    end
    subgraph differenziell
        direction LR
        B1[So<br/>Voll]
        B1 --> B2[Mo<br/>seit So]
        B1 --> B3[Di<br/>seit So]
        B1 --> B4[Mi<br/>seit So]
    end

Der Pfeil zeigt jeweils, worauf sich eine Sicherung bezieht. Fällt bei der inkrementellen Kette ein Glied aus, fehlt ab dort alles. Beim differenziellen Verfahren ist jedes Set für sich zusammen mit der Vollsicherung vollständig. Das Backup-Skript in Teil 4 arbeitet darum differenziell: eine Vollsicherung pro Monat, dazwischen täglich die Differenz.

  • 3 Kopien der Daten (das Original zählt mit).
  • Auf 2 verschiedenen Medien oder Systemen.
  • 1 davon an einem anderen Ort (andere Brandzone, anderes Rechenzentrum, anderes Haus).

Für deine Server-VM heisst das zum Beispiel: Daten auf der VM, Archiv auf einer zweiten Disk oder im Proxmox-Backup, und eine Kopie per rsync auf ein System, das nicht am selben Ort steht.

tar («tape archiver», aus der Zeit der Magnetbänder) packt Verzeichnisbäume mit allen Rechten, Besitzern und Zeitstempeln in eine Datei. Es ist auf jedem Unix vorhanden und das Standardformat für Linux-Archive. Die wichtigsten Optionen:

Option Bedeutung
-c / -x / -t create, extract, list (eine davon, immer)
-f DATEI Archivdatei (sonst versucht tar ein Bandlaufwerk)
-v verbose, zeigt die Dateien an
-z / -j / -J komprimieren mit gzip (.tar.gz), bzip2 (.tar.bz2), xz (.tar.xz)
--zstd komprimieren mit zstd (.tar.zst), schnell und gut
--exclude=MUSTER auslassen, Muster wird auf jeden Pfadteil angewendet
--newer=DATEI nur Dateien, die neuer sind als diese Datei (oder ein Datum)
-C VERZ vor der Arbeit nach VERZ wechseln

Hands-on: Sichere dein Home-Verzeichnis. Das Ziel liegt für die Übung unter /tmp/backup, in echt wäre es eine andere Disk.

  1. Eine Datei anlegen, an der du den Restore später erkennst:
    Server-VM
    echo "wichtige Notiz vom $(date)" > ~/notiz.txt
    mkdir -p /tmp/backup
  2. Archiv erstellen. -C /home plus $USER ergibt Pfade wie alice/notiz.txt im Archiv:
    Server-VM
    tar -czvf "/tmp/backup/home-$(date +%F).tar.gz" -C /home --exclude=.cache "$USER"
    ls -lh /tmp/backup/
  3. Inhalt ansehen, ohne auszupacken. Das machst du vor jedem Restore:
    Server-VM
    tar -tzvf "/tmp/backup/home-$(date +%F).tar.gz" | head
    tar -tzf "/tmp/backup/home-$(date +%F).tar.gz" | grep notiz
  4. Datei löschen und aus dem Archiv zurückholen. Nicht direkt nach /home, sondern in ein Restore-Verzeichnis, von dort kopierst du gezielt zurück:
    Server-VM
    rm ~/notiz.txt
    mkdir -p /tmp/restore
    tar -xzvf "/tmp/backup/home-$(date +%F).tar.gz" -C /tmp/restore "$USER/notiz.txt"
    cat "/tmp/restore/$USER/notiz.txt"
    cp "/tmp/restore/$USER/notiz.txt" ~/
  5. Differenz seit der Vollsicherung. Die Zeitstempeldatei markiert den Zeitpunkt der Vollsicherung:
    Server-VM
    touch /tmp/backup/vollsicherung.stamp
    echo "zweite Zeile" >> ~/notiz.txt
    tar -czvf /tmp/backup/home-diff.tar.gz -C /home --newer=/tmp/backup/vollsicherung.stamp "$USER"
    tar -tzf /tmp/backup/home-diff.tar.gz
    Verzeichnisse erscheinen immer (tar sichert ihre Metadaten mit), Dateien nur die geänderte notiz.txt.

Was erwartest du bei Schritt 4, wenn du den Pfad notiz.txt ohne $USER/ angibst? Probiere es aus und lies die Fehlermeldung.

tar -z ruft intern gzip auf. Du kannst die Programme auch direkt verwenden, zum Beispiel für Logdateien oder Datenbank-Dumps:

Server-VM
cp /var/log/dpkg.log /tmp/dpkg.log
gzip /tmp/dpkg.log # ergibt dpkg.log.gz, Original ist weg
zcat /tmp/dpkg.log.gz | head # lesen ohne auszupacken
gunzip /tmp/dpkg.log.gz

zstd (sudo apt install zstd) komprimiert bei gleicher Grösse deutlich schneller als gzip und wird von tar --zstd unterstützt. Für neue Skripte ist es die bessere Wahl, gzip ist überall vorhanden.

dd kopiert Blöcke, nicht Dateien. Damit klonst du eine ganze Disk oder Partition, inklusive Bootsektor:

nur lesen, nicht tippen
sudo dd if=/dev/sdb of=/backup/sdb.img bs=4M status=progress

Eine laufende Datenbank schreibt dauernd. Kopierst du ihre Dateien unter /var/lib/mysql oder /var/lib/postgresql, erwischst du einen inkonsistenten Zwischenstand, der sich oft nicht mehr laden lässt. Stattdessen erzeugst du mit dem Werkzeug der Datenbank einen Dump, eine SQL-Textdatei, und sicherst diese wie jede andere Datei:

Konzept
mysqldump --single-transaction meinedb | gzip > /backup/meinedb.sql.gz
pg_dump meinedb | gzip > /backup/meinedb.sql.gz

Der Restore ist der umgekehrte Weg: zcat meinedb.sql.gz | mysql meinedb beziehungsweise psql meinedb. In Modul 11 kommt das mit einem Container-Projekt zum Einsatz.

Für mehr als ein paar Verzeichnisse nimmst du ein fertiges Werkzeug, statt alles selbst zu bauen:

  • restic und BorgBackup: Deduplizierung, Verschlüsselung, Versionierung, Ziel kann ein lokaler Pfad, SSH oder Objektspeicher sein. Erste Wahl für eigene Server.
  • BackupPC: Zentraler Backup-Server mit Weboberfläche, holt sich die Daten von den Clients.
  • Proxmox Backup Server: Sichert ganze VMs und Container des Proxmox-Clusters, inkrementell und dedupliziert.
  • Snapshots (Proxmox, LVM, ZFS, btrfs): Ideal vor einem Update, um in einer Minute zurück zu sein. Aber kein Backup: Sie liegen auf derselben Platte wie die Daten.
Lösung anzeigen
Terminal-Fenster
script labs/linux/10-remote-backup/tar.txt
mkdir -p ~/projekt/alt
echo eins > ~/projekt/a.txt; echo zwei > ~/projekt/b.txt; echo alt > ~/projekt/alt/c.txt
mkdir -p /tmp/backup /tmp/restore
tar -czvf /tmp/backup/projekt.tar.gz -C ~ --exclude=projekt/alt projekt
tar -tzvf /tmp/backup/projekt.tar.gz
rm ~/projekt/a.txt
tar -xzvf /tmp/backup/projekt.tar.gz -C /tmp/restore projekt/a.txt
cat /tmp/restore/projekt/a.txt
# 5: Der Snapshot liegt auf demselben Storage wie die VM; stirbt der, ist beides weg.
# Eine Kopie gehört auf ein anderes System und eine davon an einen anderen Ort.
exit

Selbstcheck · 5 Fragen

1. Was braucht ein Restore bei differenzieller Sicherung?
2. Was bedeutet 3-2-1?
3. Welche Befehle zeigen den Inhalt eines Archivs, ohne es auszupacken?
4. Warum entfernt tar den führenden Schrägstrich?
5. Welche Aussagen stimmen? (mehrere Antworten möglich)