Kapitel 10. Datenmanagement

Inhaltsverzeichnis

10.1. Austauschen, kopieren und archivieren von Dateien
10.1.1. Archivierungs- und Kompressionswerkzeuge
10.1.2. Kopier- und Synchronisationswerkzeuge
10.1.3. Aufrufe für Archivierungsoperationen
10.1.4. Aufrufe für Kopieroperationen
10.1.5. Aufrufe für die Auswahl von Dateien
10.1.6. Archivierungsmedien
10.1.7. Wechseldatenträger
10.1.8. Dateisystemauswahl für den Datenaustausch
10.1.9. Datenaustausch über das Netzwerk
10.2. Datensicherung und -wiederherstellung
10.2.1. Richtlinien für Datensicherung und -wiederherstellung
10.2.2. Programmsammlungen für Datensicherungsaufgaben
10.2.3. Backup-Tipps
10.2.3.1. Grafische Backup-Software
10.2.3.2. Automatisches Backup, durch ein mount-Ereignis ausgelöst
10.2.3.3. Automatisches Backup, durch ein timer-Ereignis ausgelöst
10.3. Datensicherheits-Infrastruktur
10.3.1. Schlüsselverwaltung für GnuPG
10.3.2. Verwendung von GnuPG mit Dateien
10.3.3. Verwendung von GnuPG mit Mutt
10.3.4. Verwendung von GnuPG mit Vim
10.3.5. Die MD5-Prüfsumme
10.3.6. Passwort-Schlüsselbund
10.4. Werkzeuge zur Quellcode-Zusammenführung (merge)
10.4.1. Unterschiede für Quelldateien extrahieren
10.4.2. Aktualisierungen für Quelldateien zusammenführen
10.4.3. Interaktives Zusammenführen (merge)
10.5. Git
10.5.1. Konfiguration eines Git-Clients
10.5.2. Grundlegende Git-Befehle
10.5.3. Git-Tipps
10.5.4. Weitere Referenzen zu Git
10.5.5. Andere Versionskontrollsysteme

Hier werden Werkzeuge und Tipps zur Verwaltung von Binär- und Textdateien auf einem Debian-System beschrieben.

[Warnung] Warnung

Nicht-koordinierte zeitgleiche Schreibzugriffe auf Geräte und Dateien durch mehrere Prozesse sind nicht erlaubt, da dadurch eine Race Condition (Wettlaufsituation um konkurrierende Zugriffe auf die Ressource) entstehen könnte. Dies kann über einen File locking-Mechanismus mittels flock(1) umgangen werden.

Die Sicherheit der Daten und deren kontrolliertes Austauschen mit anderen hat verschiedene Aspekte:

  • Erzeugung von Datenarchiven;

  • Fern-Speicherzugriff;

  • Vervielfältigung;

  • Nachverfolgung der Änderungshistorie;

  • Erleichterung des Tauschens von Daten;

  • Verhinderung von unerlaubten Dateizugriffen;

  • Erkennung von unerlaubten Dateiveränderungen.

Diese können über die Verwendung einer Kombination von Werkzeugen realisiert werden:

  • Archivierungs- und Kompressionswerkzeuge

  • Kopier- und Synchronisationswerkzeuge

  • Netzwerk-Dateisysteme;

  • Wechseldatenträger;

  • Secure Shell;

  • Authentifizierungssysteme;

  • Versionskontrollsysteme;

  • Hash- und kryptographische Verschlüsselungswerkzeuge.

Hier eine Zusammenfassung von Archivierungs- und Kompressionswerkzeugen im Debian-System:

Tabelle 10.1. Liste von Archivierungs- und Kompressionswerkzeugen

Paket Popcon Größe Erweiterung Befehl Erläuterung
tar V:895, I:999 3085 .tar tar(1) Standard-Archivierungs-Programm (De-Facto-Standard)
cpio V:321, I:998 1201 .cpio cpio(1) Unix-Archivier-Programm im System-V-Stil, zu verwenden mit find(1)
binutils V:170, I:643 1118 .ar ar(1) Archivier-Programm zur Erstellung von statischen Bibliotheken
fastjar V:1, I:10 183 .jar fastjar(1) Archivier-Programm für Java (zip-artig)
pax V:6, I:10 167 .pax pax(1) neues POSIX-Archivier-Programm, Kompromiss zwischen tar und cpio
gzip V:890, I:999 256 .gz gzip(1), zcat(1), … GNU LZ77-Kompressionswerkzeug (De-Facto-Standard)
bzip2 V:165, I:971 113 .bz2 bzip2(1), bzcat(1), … Burrows-Wheeler Block-Sorting Kompressions-Werkzeug mit höherem Kompressionsverhältnis als gzip(1) (langsamer als gzip mit ähnlicher Syntax)
lzma V:0, I:12 349 .lzma lzma(1) LZMA-Kompressionswerkzeug mit höherem Kompressionsverhältnis als gzip(1) (überholt)
xz-utils V:311, I:980 1475 .xz xz(1), xzdec(1), … XZ-Kompressionswerkzeug mit höherem Kompressionsverhältnis als bzip2(1) (langsamer als gzip, aber schneller als bzip2; ersetzt das LZMA-Kompressionswerkzeug)
zstd V:132, I:760 2312 .zstd zstd(1), zstdcat(1), … Zstandard: schnelles verlustfreies Kompressionswerkzeug
p7zip V:8, I:259 8 .7z 7zr(1), p7zip(1) 7-Zip-Dateiarchivier-Programm mit hohem Kompressionsverhältnis (LZMA-Kompression)
p7zip-full V:28, I:280 12 .7z 7z(1), 7za(1) 7-Zip-Dateiarchivier-Programm mit hohem Kompressionsverhältnis (LZMA- und andere Kompressionsalgorithmen)
lzop V:12, I:139 164 .lzo lzop(1) LZO-Kompressionswerkzeug mit höherer Kompressions- und Dekompressionsgeschwindigkeit als gzip(1) (niedrigeres Kompressionsverhältnis als gzip mit ähnlicher Syntax)
zip V:48, I:372 627 .zip zip(1) InfoZIP: DOS-Archivierungs- und Kompressionswerkzeug
unzip V:107, I:762 387 .zip unzip(1) InfoZIP: DOS-Dearchivierungs- und Dekompressionswerkzeug

[Warnung] Warnung

Setzen Sie nicht die "$TAPE"-Variable, außer Sie sind sich über die Folgen im klaren. Sie verändern dadurch das Verhalten von tar(1).

Hier finden Sie mehrere Wege, um den kompletten Inhalt des Verzeichnisses "./source" mit verschiedenen Werkzeugen zu kopieren.

rsync(8):

# cd ./source; rsync -aHAXSv . /dest
# cd ./source; rsync -aHAXSv . [email protected]:/dest

Sie können auch die Syntax mit Schrägstrich am Ende des Zielverzeichnisses nutzen:

# rsync -aHAXSv ./source/ /dest
# rsync -aHAXSv ./source/ [email protected]:/dest

Alternativ auch:

# cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . /dest
# cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . [email protected]:/dest

GNU cp(1) und openSSH scp(1):

# cd ./source; cp -a . /dest
# cd ./source; scp -pr . [email protected]:/dest

GNU tar(1):

# (cd ./source && tar cf - . ) | (cd /dest && tar xvfp - )
# (cd ./source && tar cf - . ) | ssh [email protected] '(cd /dest && tar xvfp - )'

cpio(1):

# cd ./source; find . -print0 | cpio -pvdm --null --sparse /dest

Sie können in allen Beispielen, die einen "." enthalten, diesen "." durch "foo" ersetzen, um Dateien aus dem Verzeichnis "./source/foo" in das Verzeichnis "/dest/foo" zu kopieren.

Auch kann in allen Beispielen, die einen "." enthalten, dieser "." durch einen absoluten Pfad wie "/pfad/zu/source/foo" ersetzt werden, damit kann dann auf "cd ./source;" verzichtet werden. Dadurch werden, abhängig von den verwendeten Werkzeugen, die Dateien an unterschiedliche Orte kopiert:

  • bei rsync(8), GNU cp(1) und scp(1): nach "/dest/foo";

  • bei GNU tar(1) und cpio(1): nach "/dest/pfad/zu/source/foo".

[Tipp] Tipp

rsync(8) und GNU cp(1) unterstützen die Option "-u", um Dateien zu überspringen, die am Zielort neuer sind als im Quellverzeichnis.

find(1) wird verwendet, um Dateien für Archivierungs- und Kopierbefehle auszuwählen (lesen Sie Abschnitt 10.1.3, „Aufrufe für Archivierungsoperationen“ und Abschnitt 10.1.4, „Aufrufe für Kopieroperationen“) oder xargs(1) (Näheres in Abschnitt 9.4.9, „Einen Befehl wiederholt mit einer Schleife über verschiedene Dateien ausführen“). Dies kann mit deren Befehlsargumenten noch erweitert werden.

Die grundsätzliche Syntax von find(1) kann wie folgt zusammengefasst werden:

  • Seine bedingten Argumente werden von links nach rechts ausgewertet.

  • Die Auswertung wird beendet, sobald ihr Resultat ermittelt wurde.

  • Ein "logisches ODER" (definiert über "-o" zwischen den Bedingungen) hat eine niedrigere Priorität als ein "logisches UND" (das über "-a" oder nichts zwischen den Bedingungen definiert wird).

  • Ein "logisches NICHT" (definiert über "!" vor der Bedingung) hat eine höhere Priorität als ein "logisches UND".

  • "-prune" liefert immer ein logisches WAHR zurück und, falls es ein Verzeichnis ist, wird die Suche nach Dateien an diesem Punkt beendet.

  • "-name" findet Dateien über den Anfang des Dateinamens mittels Shell-Glob-Suchmuster (lesen Sie dazu Abschnitt 1.5.6, „Shell-Glob“), findet sie aber über Metazeichen wie "*" und "?" auch bei einem führenden "." (neue POSIX-Funktionalität).

  • "-regex" findet Dateien mit vollständigem Pfad standardmäßig über Emacs-artige reguläre Ausdrücke (BRE, nähere Infos finden Sie in Abschnitt 1.6.2, „Reguläre Ausdrücke“).

  • "-size" findet Dateien basierend auf der Dateigröße (mit einem "+" vor dem Wert für größer, mit einem "-" für kleiner).

  • "-newer" findet Dateien, die neuer sind als in dem Argument angegeben.

  • "-print0" liefert immer ein logisches WAHR zurück und gibt den kompletten Dateinamen (abgeschlossen durch ein Nullzeichen) auf der Standardausgabe aus.

find(1) wird oft in einem idiomatischen Stil verwendet, wie hier:

# find /path/to \
    -xdev -regextype posix-extended \
    -type f -regex ".*\.cpio|.*~" -prune -o \
    -type d -regex ".*/\.git" -prune -o \
    -type f -size +99M -prune -o \
    -type f -newer /path/to/timestamp -print0

Das bedeutet folgendes:

  1. nach allen Dateien suchen, beginnend in "/pfad/zu";

  2. die Suche global auf das Dateisystem beschränken, in dem sie begonnen wurde, und stattdessen reguläre Ausdrücke (ERE, lesen Sie dazu Abschnitt 1.6.2, „Reguläre Ausdrücke“) verwenden;

  3. Dateien ausschließen, auf die die regulären Ausdrücke ".*\.cpio" oder ".*~" zutreffen, indem die Suche abgebrochen wird;

  4. Verzeichnisse ausschließen, auf die der reguläre Ausdruck ".*/\.git" zutrifft, indem die Suche abgebrochen wird;

  5. Dateien ausschließen, die größer als 99 Megabyte (1048576 Byte) sind, indem die Suche abgebrochen wird;

  6. Dateinamen ausgeben, die obige Suchkriterien erfüllen und neuer als "/path/to/timestamp" sind.

Bitte beachten Sie die idiomatische Verwendung von "-prune -o", um in obigen Beispielen Dateien auszuschließen.

[Anmerkung] Anmerkung

Auf Unix-artigen Nicht-Debian-Systemen werden einige Optionen von find(1) unter Umständen nicht unterstützt. Versuchen Sie in diesem Fall, die Suchmethoden anzupassen und "-print0" durch "-print" zu ersetzen. Unter Umständen müssen Sie auch zugehörige Befehle anpassen.

Wenn Sie Speichermedien für die Sicherung wichtiger Daten suchen, sollten Sie sorgfältig deren Einschränkungen abwägen. Für eine kleine persönliche Datensicherung verwende ich CD-R und DVD-R von einem Markenhersteller und lagere die Disks in einer kühlen, dunklen, trockenen und sauberen Umgebung. (Für die professionelle Nutzung scheinen Tapes (Speicherbänder) zur Archivierung sehr beliebt zu sein.)

[Anmerkung] Anmerkung

Ein feuerbeständiger Tresor ist gedacht für Dokumente in Papierform. Jedoch haben die meisten Speichermedien eine niedrigere Temperaturtoleranz als Papier. Ich baue auf mehrere sicher verschlüsselte Kopien, die an verschiedenen sicheren Orten aufbewahrt werden.

Optimistische Angabe der Lebensdauer von Speichermedien, gefunden im Internet (überwiegend Herstellerangaben):

  • 100 Jahre und mehr: säurefreies Papier mit Tinte;

  • 100 Jahre: Optische Speichermedien (CD/DVD, CD-R/DVD-R);

  • 30 Jahre: Magnetische Speichermedien (Bänder, Disketten);

  • 20 Jahre: Optische Medien basierend auf Phasenänderung (CD-RW).

Hierbei sind keine mechanischen Ausfälle durch Handhabung usw. berücksichtigt.

Optimistische Angabe von Schreibzyklen der Speichermedien, gefunden im Internet (überwiegend Herstellerangaben):

  • 250000 Zyklen und mehr: Festplattenlaufwerk;

  • 10000 Zyklen und mehr: Flash-Speicher;

  • 1000 Zyklen: CD-RW/DVD-RW;

  • 1 Zyklus: CD-R/DVD-R, Papier.

[Achtung] Achtung

Die obigen Angaben zu Lebensdauer und Schreibzyklen sollten nicht für Entscheidungen bezüglich kritischer Datenspeicherung herangezogen werden. Bitte konsultieren Sie in diesem Fall die spezifischen Produktinformationen des Herstellers.

[Tipp] Tipp

Da CD-R/DVD-R und Papier nur einmal beschrieben werden können, schützen sie von Natur aus vor dem versehentlichen Datenverlust durch Überschreiben. Dies ist ein Vorteil!

[Tipp] Tipp

Wenn Sie eine schnelle und wiederholte Sicherung großer Datenmengen benötigen, könnte eine Festplatte in einem fernen Rechner, verbunden über eine schnelle Internetverbindung, die einzige realistische Option sein.

[Tipp] Tipp

Wenn Sie wiederbeschreibbare Medien für Ihre Backups verwenden, könnte es eine gute Idee sein, Dateisysteme wie btrfs oder zfs zu nutzen, die nur-lesbare Schnappschüsse unterstützen.

Wechseldatenträger können folgende Geräte sein:

Sie können über eine dieser Möglichkeiten verbunden sein:

Moderne Arbeitsplatzumgebungen wie GNOME und KDE können diese Wechseldatenträger auch ohne einen entsprechenden "/etc/fstab"-Eintrag automatisiert einbinden.

  • Das udisks2-Paket enthält einen Daemon und dazugehörige Hilfsprogramme, um diese Datenträger automatisch einzubinden und zu trennen.

  • D-bus erzeugt Ereignisse, um automatische Prozesse anzustoßen.

  • PolicyKit stellt die erforderlichen Berechtigungen bereit.

[Tipp] Tipp

Automatisch eingebundene Geräte haben eventuell die mount-Option "uhelper=", die von umount(8) genutzt wird.

[Tipp] Tipp

In modernen Arbeitsplatzumgebungen funktioniert das automatische Einbinden von Laufwerken nur, wenn diese Geräte nicht in "/etc/fstab" aufgelistet sind.

Der Einbindungspunkt wird in modernen Umgebungen in der Form "/media/benutzername/laufwerksname" abgebildet; die Laufwerksbezeichnung (manchmal auch als Disk-Label bezeichnet) kann wie folgt angepasst werden:

  • mlabel(1) bei FAT-Dateisystemen;

  • genisoimage(1) mit der Option "-V" bei ISO9660-Dateisystemen;

  • tune2fs(1) mit der Option "-L" bei ext2-/ext3-/ext4-Dateisystemen.

[Tipp] Tipp

Die verwendete Zeichenkodierung muss unter Umständen als mount-Option angegeben werden (lesen Sie dazu Abschnitt 8.1.3, „Dateinamenkodierung“).

[Tipp] Tipp

Die Verwendung des grafischen GUI-Menüs zur Trennung eines eingebundenen Dateisystems könnte auch dessen dynamisch erzeugte Gerätedatei (z.B. "/dev/sdc" entfernen. Falls Sie diese Gerätedatei erhalten möchten, trennen Sie die Einbindung mit dem umount(8)-Befehl von einem Shell-Prompt.

Um Daten mit anderen Systemen über Wechseldatenträger auszutauschen, sollten Sie diese mit einem Dateisystem formatieren, das von beiden Systemen unterstützt wird.


[Tipp] Tipp

Details zum plattformübergreifenden Datenaustausch mit Verschlüsselung auf Geräteebene finden Sie in Abschnitt 9.9.1, „Verschlüsselung von Wechseldatenträgern mit dm-crypt/LUKS“.

Das FAT-Dateisystem wird von nahezu allen modernen Dateisystemen unterstützt und ist für den Datenaustausch über Wechseldatenträger sehr nützlich.

Wenn Sie Geräte wie externe Festplatten für den plattformübergreifenden Datenaustausch mit dem FAT-Dateisystem formatieren, sollten die folgenden Varianten eine sichere Wahl sein:

Wenn das FAT- oder ISO9660-Dateisystem für den Dateiaustausch verwendet wird, sollte folgendes eine sichere Variante sein:

  • archivieren der Dateien in eine Archivdatei mittels tar(1) oder cpio(1), um die langen Dateinamen, symbolischen Links, originalen Unix-Dateiberechtigungen und Benutzerinformationen zu erhalten;

  • splitten der Archivdatei in Stücke kleiner als 2 GiB mittels split(1), um so die Beschränkung der Dateigröße umgehen zu können;

  • verschlüsseln der Archivdatei, um den Inhalt vor unberechtigtem Zugriff zu schützen.

[Anmerkung] Anmerkung

Bei dem FAT-Dateisystem liegt - begründet durch sein Design - die maximale Dateigröße bei (2^32 - 1) Byte = (4 GiB - 1 Byte). Bei einigen Anwendungen auf älteren 32-Bit-Betriebssystemen war die maximale Dateigröße sogar noch kleiner: (2^31 - 1) Byte = (2 GiB - 1 Byte). Debian ist von letzterem nicht betroffen.

[Anmerkung] Anmerkung

Microsoft selbst empfiehlt FAT nicht für Laufwerke oder Partitionen über 200 MB Größe. Microsoft hebt die Nachteile wie ineffiziente Speicherplatznutzung in seiner "Übersicht über die Dateisysteme FAT, HPFS und NTFS" hervor. Natürlich sollten wir für Linux normalerweise das ext4-Dateisystem nutzen.

[Tipp] Tipp

Mehr Informationen über Dateisysteme und Dateisystemzugriffe finden Sie im "Filesystems HOWTO" (Englisch).

Wir alle wissen, dass Computer manchmal defekt sein können oder menschliche Fehler System- und Datenausfälle verursachen. Aktionen zur Datensicherung und -wiederherstellung sind unverzichtbarer Teil einer erfolgreichen Systemadministration. Alle möglichen Fehlervarianten werden Sie eines Tages ereilen.

[Tipp] Tipp

Halten Sie Ihr Datensicherungssystem einfach und führen Sie häufig Sicherungen durch. Aktuelle Sicherungen von seinen Daten zu haben ist wichtiger als die technische Qualität der Sicherungsmethodik.

Es gibt drei Schlüsselfaktoren, die letztendig die Sicherungs- und Wiederherstellungsstrategie bestimmen:

  1. Zu wissen, was man sichern und wiederherstellen muss:

  2. Wissen, wie Sie Daten sichern und wiederherstellen:

    • Sicheres Speichern von Daten: geschützt vor Überschreiben und Systemausfällen;

    • Häufige Datensicherungen: Sicherungen planen;

    • Redundante Datensicherungen: Spiegeln der Sicherungsdateien;

    • Idiotensicheres Vorgehen: Sicherung durch einen einfachen Befehl.

  3. Bewertung der entstehenden Risiken und Kosten:

    • Risiko, falls die Daten verloren gehen;

      • Daten sollten zumindest auf verschiedenen Festplattenpartitionen, besser sogar auf unterschiedlichen Laufwerken und Maschinen liegen, um unanfällig gegen Dateisystembeschädigungen zu sein. Wichtige Daten sollten am besten auf einem schreibgeschützten Dateisystem abgelegt werden. [4]

    • Risiko, falls die Daten öffentlich werden;

      • Sensible Identitätsdaten wie "/etc/ssh/ssh_host_*_key", "~/.gnupg/*", "~/.ssh/*", "~/.local/share/keyrings/*", "/etc/passwd", "/etc/shadow", "popularity-contest.conf", "/etc/ppp/pap-secrets" oder "/etc/exim4/passwd.client" sollten nur verschlüsselt gesichert werden. [5] (Siehe auch Abschnitt 9.9, „Tipps zur Datenverschlüsselung“.)

      • Fügen Sie niemals System-Login-Passwörter oder Verschlüsselungs-Passphrasen in ein Skript ein, nicht einmal auf einem System, dem Sie vertrauen. (Siehe dazu Abschnitt 10.3.6, „Passwort-Schlüsselbund“.)

    • Mögliche Ausfälle und deren Wahrscheinlichkeit.

      • Hardware-Defekte (speziell bei Festplatten) sind wahrscheinlich

      • Dateisysteme könnten beschädigt werden und enthaltene Daten gehen verloren

      • Fernen Speichersystemen (Cloud, ...) können Sie aufgrund von Sicherheitslücken nicht trauen

      • Ein schwacher Passwortschutz kann leicht kompromittiert werden

      • Systeme zur Festlegung von Dateiberechtigungen können kompromittiert werden

    • Für die Sicherung benötigte Ressourcen: Personen, Hardware, Software, …;

      • Automatisch ablaufende Backups über cron-Jobs oder systemd-timer-Jobs

[Tipp] Tipp

Sie können die debconf-Konfigurationsdaten mit "debconf-set-selections debconf-selections" wiederherstellen und die dpkg-Paketauswahl mit "dpkg --set-selection <dpkg-selections.list".

[Anmerkung] Anmerkung

Machen Sie keine Sicherungen von den Pseudo-Dateisystemen in /proc, /sys, /tmp und /run (Näheres dazu in Abschnitt 1.2.12, „procfs und sysfs“ und Abschnitt 1.2.13, „tmpfs“). Dies sind absolut nutzlose Daten, außer Sie genau wissen, was Sie tun.

[Anmerkung] Anmerkung

Sie sollten eventuell einige Anwendungs-Daemons wie den MTA (lesen Sie dazu Abschnitt 6.2.4, „Mail Transfer Agent (MTA)“) beenden, während Sie die Datensicherung durchführen.

Hier eine Auswahl erwähnenswerter, im Debian-System verfügbarer Datensicherungsprogramme:

Tabelle 10.5. Liste von Datensicherungsprogrammen

Paket Popcon Größe Beschreibung
bacula-common V:6, I:7 2501 Bacula: Datensicherung, -wiederherstellung und -verifizierung über das Netzwerk - gemeinsame Hilfsdateien
bacula-client V:0, I:2 199 Bacula: Datensicherung, -wiederherstellung und -verifizierung über das Netzwerk - Client-Metapaket
bacula-console V:0, I:2 112 Bacula: Datensicherung, -wiederherstellung und -verifizierung über das Netzwerk - Textkonsole
bacula-server I:0 199 Bacula: Datensicherung, -wiederherstellung und -verifizierung über das Netzwerk - Server-Metapaket
amanda-common V:0, I:2 9851 Amanda: Advanced Maryland Automatic Network Disk Archiver (Netzwerk-Backup-System - Bibliotheken)
amanda-client V:0, I:2 1099 Amanda: Advanced Maryland Automatic Network Disk Archiver (Netzwerk-Backup-System - Client)
amanda-server V:0, I:0 1093 Amanda: Advanced Maryland Automatic Network Disk Archiver (Netzwerk-Backup-System - Server)
backuppc V:1, I:1 3088 BackupPC ist ein leistungsfähiges System der Enterprise-Klasse zur Datensicherung von PCs (festplatten-basiert)
duplicity V:6, I:50 2649 Inkrementelles Backup (auch von fern)
deja-dup V:30, I:45 5031 GUI-Frontend für duplicity
borgbackup V:12, I:27 3477 deduplizierendes Backup (auch von fern)
borgmatic V:3, I:4 946 borgbackup-Hilfsprogramm
rdiff-backup V:2, I:7 1207 Inkrementelles Backup (auch von fern)
restic V:4, I:9 24708 Inkrementelles Backup (auch von fern)
backupninja V:2, I:2 360 ressourcenschonendes, erweiterbares Meta-Backup-System
slbackup V:0, I:0 147 Inkrementelles Backup (auch von fern)
backup-manager V:0, I:0 573 befehlszeilen-basiertes Datensicherungs-Werkzeug
backup2l V:0, I:0 110 wartungsarmes Sicherungs-/Wiederherstellungsprogramm für mount-fähige Medien (festplatten-basiert)

Datensicherungs-Werkzeuge haben alle ihren speziellen Fokus:

  • Mondo Rescue ist ein Backup-System, das die schnelle Wiederherstellung eines vollständigen Systems von CD/DVD ermöglicht, ohne dass dabei die normalen Systeminstallations-Prozesse durchlaufen werden müssen.

  • Bacula, Amanda und BackupPC sind voll ausgestattete Backup-Lösungen, die auf die regelmäßige Datensicherung über Netzwerk fokussiert sind.

  • Duplicity und Borg sind einfache Backup-Werkzeuge für typische Arbeitsplatzrechner.

Für einen Arbeitsplatzrechner könnte eine voll ausgestattete, für Server-Umgebungen entwickelte Backup-Lösung unpassend sein. Gleichzeitig könnten aber vorhandene Backup-Werkzeuge für Arbeitsplatzrechner auch Schwächen haben.

Hier einige Tipps, um Backups zu erleichtern, bei gleichzeitig mimimalem Aufwand. Diese Techniken können bei allen Backup-Programmen Anwendung finden.

Für Demonstrationszwecke gehen wir hier davon aus, dass der primäre Benutzer- und Gruppenname penguin ist. Wir erstellen ein Beipiel für ein Backup- und Schnappschuss-Skript namens "/usr/local/bin/bkss.sh" wie folgt:

#!/bin/sh -e
SRC="$1" # source data path
DSTFS="$2" # backup destination filesystem path
DSTSV="$3" # backup destination subvolume name
DSTSS="${DSTFS}/${DSTSV}-snapshot" # snapshot destination path
if [ "$(stat -f -c %T "$DSTFS")" != "btrfs" ]; then
  echo "E: $DESTFS needs to be formatted to btrfs" >&2 ; exit 1
fi
MSGID=$(notify-send -p "bkup.sh $DSTSV" "in progress ...")
if [ ! -d "$DSTFS/$DSTSV" ]; then
  btrfs subvolume create "$DSTFS/$DSTSV"
  mkdir -p "$DSTSS"
fi
rsync -aHxS --delete --mkpath "${SRC}/" "${DSTFS}/${DSTSV}"
btrfs subvolume snapshot -r "${DSTFS}/${DSTSV}" ${DSTSS}/$(date -u --iso=min)
notify-send -r "$MSGID" "bkup.sh $DSTSV" "finished!"

Hier wird nur das Basiswerkzeug rsync(1) genutzt, um das System-Backup zu vereinfachen, und der Speicherplatz wird durch Btrfs effizient genutzt.

[Tipp] Tipp

Zu Ihrer Information: der Autor nutzt ein eigenes, ähnliches Shell-Skript "bss: Btrfs Subvolume Snapshot Utility" für seinen Arbeitsplatzrechner.

Hier ein Beispiel zur Einrichtung einer grafischen Ein-Klick Backup-Lösung.

Bei jedem Klick werden Ihre Daten aus "~/Documents" auf den USB-Speicher gesichert und es wird ein btrfs-Schnappschuss (nur lesbar) erzeugt.

Hier ist ein Beispiel, wie Sie ein automatisches Backup einrichten, das durch ein mount-Ereignnis ausgelöst wird.

Bei jedem mount-Ereignis werden Ihre Daten aus "~/Documents" auf den USB-Speicher gesichert und ein btrfs-Schnappschuss (nur lesbar) wird erstellt.

Hierbei können Sie die Namen aller systemd-mount-Units, die systemd aktuell im Speicher hat, anzeigen lassen mit "systemctl --user list-units --type=mount".

Hier ein Beispiel für ein Backup, das automatisch durch ein timer-Ereignis ausgelöst wird.

  • Bereiten Sie einen USB-Massenspeicher vor, der für das Backup genutzt wird (siehe Abschnitt 10.2.3.1, „Grafische Backup-Software“).

  • Erstellen Sie eine systemd timer-Unit-Datei "~/.config/systemd/user/snap-Documents.timer" wie hier:

    [Unit]
    Description=Run btrfs subvolume snapshot on timer
    Documentation=man:btrfs(1)
    
    [Timer]
    OnStartupSec=30
    OnUnitInactiveSec=900
    
    [Install]
    WantedBy=timers.target
    
  • Erstellen Sie eine systemd Service-Unit-Datei "~/.config/systemd/user/snap-Documents.service":

    [Unit]
    Description=Run btrfs subvolume snapshot
    Documentation=man:btrfs(1)
    
    [Service]
    Type=oneshot
    Nice=15
    ExecStart=/usr/local/bin/bkss.sh %h/Documents /media/%u/BKUP Documents
    IOSchedulingClass=idle
    CPUSchedulingPolicy=idle
    StandardOutput=append:%h/.cache/systemd-snap.log
    StandardError=append:%h/.cache/systemd-snap.log
    
  • Aktivieren Sie diese systemd-Unit-Konfiguration mit:

     $ systemctl --user enable snap-Documents.timer
    

Bei jedem timer-Ereignis werden Ihre Daten aus "~/Documents" auf den USB-Speicher gesichert und ein btrfs-Schnappschuss (nur lesbar) wird erstellt.

Hierbei können Sie die Namen aller systemd-timer-Units, die systemd aktuell im Speicher hat, anzeigen lassen mit "systemctl --user list-units --type=timer".

Für ein modernes Arbeitsplatzsystem kann dieser systemd-Ansatz einen feiner dosierten Ansatz bieten als die traditionellen Unix-Lösungen mit at(1), cron(8) oder anacron(8).

Die Sicherheitsinfrastruktur für Ihre Daten wird durch eine Kombination verschiedener Programme gewährleistet: Verschlüsselungswerkzeug, Message-Digest-Werkzeug und Signaturwerkzeug.


In Abschnitt 9.9, „Tipps zur Datenverschlüsselung“ finden Sie Infos über dm-crypt und fscrypt, die automatische Datenverschlüsselungs-Infrastrukturen über Linux-Kernelmodule implementieren.

Hier einige Befehle für die grundlegende Schlüsselverwaltung mit GNU Privacy Guard:


Hier die Bedeutung des Vertrauenscodes:


Folgendes lädt meinen Schlüssel "1DD8D791" auf den populären Schlüsselserver "hkp://keys.gnupg.net" hoch:

$ gpg --keyserver hkp://keys.gnupg.net --send-keys 1DD8D791

Ein gutes Standard-Schlüsselserver-Setup in "~/.gnupg/gpg.conf" (oder dem alten Ort "~/.gnupg/options") enthält folgendes:

keyserver hkp://keys.gnupg.net

Mit dem folgenden Befehl beziehen Sie unbekannte Schlüssel vom Schlüsselserver:

$ gpg --list-sigs --with-colons | grep '^sig.*\[User ID not found\]' |\
          cut -d ':' -f 5| sort | uniq | xargs gpg --recv-keys

Es gab einen Fehler in OpenPGP Public Key Server (Versionen vor 0.9.6), durch den Schlüssel mit mehr als zwei Unterschlüsseln korrumpiert wurden. Das neue gnupg-Paket (>1.2.1-2) kann mit diesen korrumpierten Unterschlüsseln umgehen. Lesen Sie in gpg(1) den Abschnitt zur Option "--repair-pks-subkey-bug".

md5sum(1) enthält ein Werkzeug, um über die in RFC1321 beschriebene Methode eine Digest-Datei zu erzeugen und jede Datei darüber zu verifizieren:

$ md5sum foo bar >baz.md5
$ cat baz.md5
d3b07384d113edec49eaa6238ad5ff00  foo
c157a79031e1c40f85931829bc5fc552  bar
$ md5sum -c baz.md5
foo: OK
bar: OK
[Anmerkung] Anmerkung

Die Berechnung der MD5-Prüfsumme ist weniger CPU-intensiv als die für die krypthographische Signatur durch GNU Privacy Guard (GnuPG). Üblicherweise ist nur die Digest-Datei der obersten Ebene (z.B. das Wurzelverzeichnis eines Verzeichnisbaums) kryptographisch signiert, um die Datenintegrität sicherzustellen.

Es gibt viele Werkzeuge für die Zusammenführung von Quellcode. Folgende Befehle haben meine Aufmerksamkeit erregt:

Tabelle 10.10. Liste von Werkzeugen zur Quellcode-Zusammenführung

Paket Popcon Größe Befehl Beschreibung
patch V:77, I:716 242 patch(1) eine diff-Datei auf ein Original anwenden
vim V:85, I:353 4077 vimdiff(1) zwei Dateien nebeneinander in vim vergleichen
imediff V:0, I:0 348 imediff(1) interaktives Werkzeug für Zwei-/Dreiwege-Zusammenführung mit Vollbildschirmmodus
meld V:5, I:25 3546 meld(1) vergleichen und zusammenführen von Dateien (GTK)
wiggle V:0, I:0 175 wiggle(1) zurückgewiesene Patches anwenden
diffutils V:879, I:997 1768 diff(1) Dateien Zeile für Zeile vergleichen
diffutils V:879, I:997 1768 diff3(1) drei Dateien Zeile für Zeile vergleichen und zusammenführen
quilt V:1, I:19 885 quilt(1) Serien von Patches verwalten
wdiff V:5, I:43 651 wdiff(1) Wort-für-Wort-Unterschiede zwischen Textdateien anzeigen
diffstat V:10, I:106 79 diffstat(1) eine Grafik der Veränderungen für eine diff-Datei erstellen
patchutils V:12, I:104 242 combinediff(1) einen kumulativen Patch aus zwei inkrementellen Patches erzeugen
patchutils V:12, I:104 242 dehtmldiff(1) ein Diff aus einer HTML-Seite extrahieren
patchutils V:12, I:104 242 filterdiff(1) Diffs aus einer Diff-Datei extrahieren oder entfernen
patchutils V:12, I:104 242 fixcvsdiff(1) von CVS erstellte Diff-Dateien, die patch(1) falsch interpretiert, reparieren
patchutils V:12, I:104 242 flipdiff(1) die Reihenfolge zweier Patches ändern
patchutils V:12, I:104 242 grepdiff(1) anzeigen, welche Dateien von einem Patch entsprechend einem regulären Ausdruck modifiziert werden
patchutils V:12, I:104 242 interdiff(1) Unterschiede zwischen zwei Unified-Diff-Dateien anzeigen
patchutils V:12, I:104 242 lsdiff(1) zeigen, welche Dateien von einem Patch verändert werden
patchutils V:12, I:104 242 recountdiff(1) Zähler und Offsets in vereinheitlichten Context-Diffs neu berechnen
patchutils V:12, I:104 242 rediff(1) Offsets und Zähler eines hand-editierten Diffs bereinigen
patchutils V:12, I:104 242 splitdiff(1) inkrementelle Patches aussortieren
patchutils V:12, I:104 242 unwrapdiff(1) Patches von fehlerhaften Zeilenumbrüchen befreien
dirdiff V:0, I:1 167 dirdiff(1) Unterschiede zwischen Verzeichnissen anzeigen und zusammenführen
docdiff V:0, I:0 554 docdiff(1) zwei Dateien Wort-für-Wort / Buchstabe-für-Buchstabe vergleichen
makepatch V:0, I:0 99 makepatch(1) erweiterte Patch-Dateien erzeugen
makepatch V:0, I:0 99 applypatch(1) erweiterte Patch-Dateien anwenden

Git ist derzeit das Werkzeug der Wahl für Versionskontrollsysteme (VCS), da es alles Nötige sowohl für lokales wie auch für fernes Code-Management erledigen kann.

Debian stellt freie Git-Dienste über Debian Salsa bereit. Dokumentation finden Sie unter https://wiki.debian.org/Salsa.

Hier einige Git-betreffende Pakete:


Sie möchten vielleicht wie folgt verschiedene globale Konfigurationsoptionen in "~/.gitconfig" zur Verwendung durch Git setzen, z.B. Name und E-Mail-Adresse:

$ git config --global user.name "Name Surname"
$ git config --global user.email [email protected]

Sie können das Standardverhalten von Git wie folgt auch noch weiter anpassen:

$ git config --global init.defaultBranch main
$ git config --global pull.rebase true
$ git config --global push.default current

Wenn Sie an CVS- oder Subversion-Befehle gewohnt sind, können Sie wie hier auch folgende Befehls-Alias setzen:

$ git config --global alias.ci "commit -a"
$ git config --global alias.co checkout

Sie können mit folgendem Befehl Ihre globale git-Konfiguration kontrollieren:

$ git config --global --list

An Vorgängen mit Git sind verschiedene Datenbereiche beteiligt:

  • Der Arbeitsbereich, der für den Benutzer sichtbare Dateien enthält und dort Änderungen erlaubt.

    • Änderungen müssen explizit ausgewählt und dem Index hingefügt werden, um aufgezeichnet zu werden. Dies erledigen die Befehle git add und git rm.

  • Der Index, der hinzugefügte Dateien enthält.

    • Dem Index hinzugefügte Dateien werden auf Anfrage in das lokale Depot übernommen. Dies erledigt der Befehl git commit.

  • Das lokale Depot, das übernommene Dateien enthält.

    • Git zeichnet die Historie der übernommenen Daten auf und bereitet diese in Form von Zweigen (Branches) im Depot auf.

    • Das lokale Depot kann über den git push-Befehl Daten an das ferne Depot senden.

    • Das lokale Depot kann über die Befehle git fetch und git pull Daten vom fernen Depot empfangen.

      • Der Befehl git pull führt git merge oder git rebase nach dem git fetch-Befehl aus.

      • Dabei führt git merge zwei separate Zweige (Branches) zu einem Stand zusammen. (Dies ist das Standardverhalten von git pull - solange es nicht bewusst angepasst wurde - und sollte passend sein für Upstream-Entwickler, die Zweige (Branches) an viele Leute verteilen.)

      • Dabei erstellt git rebase einen einzigen Zweig (Branch) aus der aufeinander folgenden Historie des fernen Zweigs, dem der lokale Zweig folgt. (Dies entspricht der Anpassung pull.rebase true, und ist vermutlich passend für den Rest von uns.)

  • Das ferne Depot, das übernommene Dateien enthält.

    • Für die Kommunikation zum fernen Depot wird ein sicheres Protokoll wie SSH oder HTTPS verwendet.

Als Arbeitsbereich gilt der Bereich außerhalb des .git/-Verzeichnisses. Zu den Dateien innerhalb von .git/ gehören der Index, die lokalen Depotdaten und einige Textdateien für die Git-Konfiguration.

Hier ein Überblick über die wichtigsten Git-Befehle:


Hier einige Tipps zu Git:

Tabelle 10.13. Git-Tipps

Git-Befehlszeile Funktion
gitk --all vollständige Git-Historie anzeigen und weiterverarbeiten, wie z.B. Zurücksetzen des HEAD auf einen anderen Commit, Herauspicken von einzelnen Änderungen, Erzeugen von Tags und Branches, ...
git stash einen sauberen Arbeitsbereich erhalten, ohne Daten zu verlieren
git remote -v Einstellung für ferne Depots anzeigen
git branch -vv Einstellung für Zweig (Branch) anzeigen
git status Status des Arbeitsbereichs anzeigen
git config -l Git-Einstellungen auflisten
git reset --hard HEAD; git clean -x -d -f alle Änderungen im Arbeitsbereich zurücksetzen und vollständig bereinigen
git rm --cached dateiname bereits über git add dateiname zum Index hinzugefügte Änderungen zurücknehmen
git reflog Git-Referenz-Log anzeigen (nützlich, um Commits von gelöschten Zweigen (Branches) wiederherzustellen)
git branch neuer_zweig_name HEAD@{6} einen neuen Zweig aus reflog-Informationen erzeugen
git remote add new_remote URL ein fernes Depot new_remote mit angegebener URL hinzufügen
git remote rename origin upstream den Namen des fernen Depots origin in upstream umbenennen
git branch -u upstream/branch_name das Remote-Tracking auf das ferne Depot upstream und seinen Zweig namens branch_name setzen.
git remote set-url origin https://foo/bar.git URL von origin ändern
git remote set-url --push upstream DISABLED push zu upstream deaktivieren (passen Sie .git/config an, um dies wieder zu aktivieren)
git remote update upstream Updates aller fernen Zweige im upstream-Depot abrufen
git fetch upstream foo:upstream-foo einen lokalen (eventuell verwaisten) Zweig upstream-foo als Kopie des foo-Zweigs im upstream-Depot erzeugen
git checkout -b topic_branch ; git push -u topic_branch origin einen neuen Zweig namens topic_branch erzeugen und nach origin aktualisieren (push)
git branch -m alter-name neuer-name den Namen eines lokalen Zweigs umbenennen
git push -d origin zu-loeschender-zweig einen fernen Zweig (Branch) löschen (neue Methode)
git push origin :zu-loeschender-zweig einen fernen Zweig (Branch) löschen (alte Methode)
git checkout --orphan unconnected einen neuen unconnected-Zweig erzeugen
git rebase -i origin/main Neuordnen/Löschen/Verdichten der Commits von origin/main, um eine saubere Branch-Historie zu bekommen
git reset HEAD^; git commit --amend Verdichten der letzten 2 Commits in einen einzigen
git checkout topic_branch ; git merge --squash topic_branch Verdichten eines kompletten Zweigs topic_branch in einen Commit
git fetch --unshallow --update-head-ok origin '+refs/heads/*:refs/heads/*' einen shallow-Clone in einen Clone aller Zweige konvertieren
git ime den letzten Commit in eine Serie von kleineren Datei-für-Datei-Commits konvertieren (imediff-Paket wird benötigt)
git repack -a -d; git prune Neupacken des lokalen Depots in ein einzelnes Pack (dies könnte dazu führen, dass die Wiederherstellung verlorener Daten aus gelöschten Zweigen nicht mehr möglich ist, usw.)

[Warnung] Warnung

Nutzen Sie in der Tag-Zeichenkette keine Leerzeichen, auch wenn Werkzeuge wie gitk(1) dies ermöglichen. Andere git-Befehle könnten dadurch ins Stocken geraten.

[Achtung] Achtung

Wenn für einen lokalen Zweig, der bereits über push in das ferne Depot übergeben wurde, ein rebase oder squash durchgeführt wird, könnte ein erneuter push gewisse Risiken beinhalten und die Option --force erfordern. Dies ist für den main-Zweig ein normalerweise unerwünschter Vorgang, könnte aber für einen topic-Zweig akzeptabel sein, bevor dieser in den main-Zweig integriert wird.

[Achtung] Achtung

Der direkte Aufruf eines git-Unterbefehls mittels "git-xyz" über die Befehlszeile ist seit dem Frühjahr 2006 veraltet.

[Tipp] Tipp

Wenn eine ausführbare Datei namens git-foo in dem durch $PATH definierten Pfad existiert, wird dieser git-foo-Befehl ausgeführt, indem man "git foo" (ohne Bindestrich!) auf der Befehlszeile aufruft. Dies ist eine Funktionalität des git-Befehls.

Hier finden Sie weitere Informationen:



[4] Medien zu verwenden, die nur einmal beschrieben werden können (wie CD-R/DVD-R), schützt vor versehentlichem Überschreiben. (In Abschnitt 9.8, „Binärdaten“ lesen Sie, wie Sie von der Befehlszeile aus auf die Speichermedien schreiben können. Die grafische Oberfläche der GNOME-Arbeitsplatzumgebung bietet Ihnen auch einen einfachen Weg über das Menü: "Orte→CD/DVD-Ersteller".)

[5] Einige dieser Daten kann nicht wieder hergestellt werden, selbst wenn die exakt gleichen Eingaben erneut getätigt werden.

[6] Falls Sie "~/.vimrc" statt "~/.vim/vimrc" verwenden, passen Sie diese bitte entsprechend an.