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 tips
10.2.3.1. GUI backup
10.2.3.2. Mount event triggered backup
10.2.3.3. Timer event triggered backup
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:902, I:999 3077 .tar tar(1) Standard-Archivierungs-Programm (De-Facto-Standard)
cpio V:440, I:998 1199 .cpio cpio(1) Unix-Archivier-Programm im System-V-Stil, zu verwenden mit find(1)
binutils V:172, I:629 144 .ar ar(1) Archivier-Programm zur Erstellung von statischen Bibliotheken
fastjar V:1, I:13 183 .jar fastjar(1) Archivier-Programm für Java (zip-artig)
pax V:8, I:14 170 .pax pax(1) neues POSIX-Archivier-Programm, Kompromiss zwischen tar und cpio
gzip V:876, I:999 252 .gz gzip(1), zcat(1), … GNU LZ77-Kompressionswerkzeug (De-Facto-Standard)
bzip2 V:166, I:970 112 .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:1, I:16 149 .lzma lzma(1) LZMA-Kompressionswerkzeug mit höherem Kompressionsverhältnis als gzip(1) (überholt)
xz-utils V:360, I:980 1203 .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:193, I:481 2158 .zstd zstd(1), zstdcat(1), … Zstandard: schnelles verlustfreies Kompressionswerkzeug
p7zip V:20, I:463 8 .7z 7zr(1), p7zip(1) 7-Zip-Dateiarchivier-Programm mit hohem Kompressionsverhältnis (LZMA-Kompression)
p7zip-full V:110, I:480 12 .7z 7z(1), 7za(1) 7-Zip-Dateiarchivier-Programm mit hohem Kompressionsverhältnis (LZMA- und andere Kompressionsalgorithmen)
lzop V:15, I:142 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:380 616 .zip zip(1) InfoZIP: DOS-Archivierungs- und Kompressionswerkzeug
unzip V:105, I:771 379 .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:8, I:10 2305 Bacula: Datensicherung, -wiederherstellung und -verifizierung über das Netzwerk - gemeinsame Hilfsdateien
bacula-client V:0, I:2 178 Bacula: Datensicherung, -wiederherstellung und -verifizierung über das Netzwerk - Client-Metapaket
bacula-console V:0, I:3 112 Bacula: Datensicherung, -wiederherstellung und -verifizierung über das Netzwerk - Textkonsole
bacula-server I:0 178 Bacula: Datensicherung, -wiederherstellung und -verifizierung über das Netzwerk - Server-Metapaket
amanda-common V:0, I:2 9897 Amanda: Advanced Maryland Automatic Network Disk Archiver (Netzwerk-Backup-System - Bibliotheken)
amanda-client V:0, I:2 1092 Amanda: Advanced Maryland Automatic Network Disk Archiver (Netzwerk-Backup-System - Client)
amanda-server V:0, I:0 1077 Amanda: Advanced Maryland Automatic Network Disk Archiver (Netzwerk-Backup-System - Server)
backuppc V:2, I:2 3178 BackupPC ist ein leistungsfähiges System der Enterprise-Klasse zur Datensicherung von PCs (festplatten-basiert)
duplicity V:30, I:50 1973 Inkrementelles Backup (auch von fern)
deja-dup V:28, I:44 4992 GUI frontend for duplicity
borgbackup V:11, I:20 3301 (remote) deduplicating backup
borgmatic V:2, I:3 509 borgbackup helper
rdiff-backup V:4, I:10 1203 Inkrementelles Backup (auch von fern)
restic V:2, I:6 21385 Inkrementelles Backup (auch von fern)
backupninja V:2, I:3 360 ressourcenschonendes, erweiterbares Meta-Backup-System
flexbackup V:0, I:0 243 Inkrementelles Backup (auch von fern)
slbackup V:0, I:0 151 Inkrementelles Backup (auch von fern)
backup-manager V:0, I:1 566 befehlszeilen-basiertes Datensicherungs-Werkzeug
backup2l V:0, I:0 115 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, and Borg are simpler backup utilities for typical workstations.

For a personal workstation, full featured backup suite utilities designed for the server environment may not serve well. At the same time, existing backup utilities for workstations may have some shortcomings.

Here are some tips to make backup easier with minimal user efforts. These techniques may be used with any backup utilities.

For demonstration purpose, let's assume the primary user and group name to be penguin and create a backup and snapshot script example "/usr/local/bin/bkss.sh" as:

#!/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!"

Here, only the basic tool rsync(1) is used to facilitate system backup and the storage space is efficiently used by Btrfs.

[Tipp] Tipp

FYI: This author uses his own similar shell script "bss: Btrfs Subvolume Snapshot Utility" for his workstation.

Here is an example to setup the single GUI click backup.

For each GUI click, your data is backed up from "~/Documents" to a USB storage device and a read-only snapshot is created.

Here is an example to setup for the automatic backup triggered by the mount event.

  • Prepare a USB storage device to be used for backup as in Abschnitt 10.2.3.1, „GUI backup“.

  • Create a systemd service unit file "~/.config/systemd/user/back-BKUP.service" as:

    [Unit]
    Description=USB Disk backup
    Requires=media-%u-BKUP.mount
    After=media-%u-BKUP.mount
    
    [Service]
    ExecStart=/usr/local/bin/bkss.sh %h/Documents /media/%u/BKUP Documents
    StandardOutput=append:%h/.cache/systemd-snap.log
    StandardError=append:%h/.cache/systemd-snap.log
    
    [Install]
    WantedBy=media-%u-BKUP.mount
    
  • Enable this systemd unit configuration with the following:

     $ systemctl --user enable bkup-BKUP.service
    

For each mount event, your data is backed up from "~/Documents" to a USB storage device and a read-only snapshot is created.

Here, names of systemd mount units that systemd currently has in memory can be asked to the service manager of the calling user with "systemctl --user list-units --type=mount".

Here is an example to setup for the automatic backup triggered by the timer event.

  • Prepare a USB storage device to be used for backup as in Abschnitt 10.2.3.1, „GUI backup“.

  • Create a systemd timer unit file "~/.config/systemd/user/snap-Documents.timer" as:

    [Unit]
    Description=Run btrfs subvolume snapshot on timer
    Documentation=man:btrfs(1)
    
    [Timer]
    OnStartupSec=30
    OnUnitInactiveSec=900
    
    [Install]
    WantedBy=timers.target
    
  • Create a systemd service unit file "~/.config/systemd/user/snap-Documents.service" as:

    [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
    
  • Enable this systemd unit configuration with the following:

     $ systemctl --user enable snap-Documents.timer
    

For each timer event, your data is backed up from "~/Documents" to a USB storage device and a read-only snapshot is created.

Here, names of systemd timer user units that systemd currently has in memory can be asked to the service manager of the calling user with "systemctl --user list-units --type=timer".

For the modern desktop system, this systemd approach can offer more fine grained control than the traditional Unix ones using at(1), cron(8), or 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:97, I:700 248 patch(1) eine diff-Datei auf ein Original anwenden
vim V:95, I:369 3743 vimdiff(1) zwei Dateien nebeneinander in vim vergleichen
imediff V:0, I:0 200 imediff(1) interaktives Werkzeug für Zwei-/Dreiwege-Zusammenführung mit Vollbildschirmmodus
meld V:7, I:30 3536 meld(1) vergleichen und zusammenführen von Dateien (GTK)
wiggle V:0, I:0 175 wiggle(1) zurückgewiesene Patches anwenden
diffutils V:862, I:996 1735 diff(1) Dateien Zeile für Zeile vergleichen
diffutils V:862, I:996 1735 diff3(1) drei Dateien Zeile für Zeile vergleichen und zusammenführen
quilt V:2, I:22 871 quilt(1) Serien von Patches verwalten
wdiff V:7, I:51 648 wdiff(1) Wort-für-Wort-Unterschiede zwischen Textdateien anzeigen
diffstat V:13, I:121 74 diffstat(1) eine Grafik der Veränderungen für eine diff-Datei erstellen
patchutils V:16, I:119 232 combinediff(1) einen kumulativen Patch aus zwei inkrementellen Patches erzeugen
patchutils V:16, I:119 232 dehtmldiff(1) ein Diff aus einer HTML-Seite extrahieren
patchutils V:16, I:119 232 filterdiff(1) Diffs aus einer Diff-Datei extrahieren oder entfernen
patchutils V:16, I:119 232 fixcvsdiff(1) von CVS erstellte Diff-Dateien, die patch(1) falsch interpretiert, reparieren
patchutils V:16, I:119 232 flipdiff(1) die Reihenfolge zweier Patches ändern
patchutils V:16, I:119 232 grepdiff(1) anzeigen, welche Dateien von einem Patch entsprechend einem regulären Ausdruck modifiziert werden
patchutils V:16, I:119 232 interdiff(1) Unterschiede zwischen zwei Unified-Diff-Dateien anzeigen
patchutils V:16, I:119 232 lsdiff(1) zeigen, welche Dateien von einem Patch verändert werden
patchutils V:16, I:119 232 recountdiff(1) Zähler und Offsets in vereinheitlichten Context-Diffs neu berechnen
patchutils V:16, I:119 232 rediff(1) Offsets und Zähler eines hand-editierten Diffs bereinigen
patchutils V:16, I:119 232 splitdiff(1) inkrementelle Patches aussortieren
patchutils V:16, I:119 232 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 553 docdiff(1) zwei Dateien Wort-für-Wort / Buchstabe-für-Buchstabe vergleichen
makepatch V:0, I:0 100 makepatch(1) erweiterte Patch-Dateien erzeugen
makepatch V:0, I:0 100 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:

  • The working tree which holds user facing files and to which you make changes.

    • Ä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 fetch updates of all remote branches in the upstream repository
git fetch upstream foo:upstream-foo create a local (possibly orphan) upstream-foo branch as a copy of foo branch in the upstream repository
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.