Dirvish

Aus mxlinuxusers.de

dirvish ist ein schmales, in Perl geschriebenes Backup-Programm auf der Grundlage von rsync. Es wird ausschliesslich über die Kommandozeile bedient. Die Sicherungskopien werden entweder auf einem externen Medium (USB-Festplatte) oder mittels ssh auf entfernten Rechner abgelegt. Umgekehrt kann man mittels ssh auch entfernte Rechner (z.B. vhosts) auf dem lokalen Medium sichern. Dazu müsste aber ssh von Hand nachinstalliert werden, wenn es noch nicht vorhanden ist. Die Backups werden auf dem Zielmedium in sogenannten "Schnappschuss-Verzeichnissen" gesichert. Praktischerweise kann (oder sollte) man das Zielmedium vorher schon mit LUKS verschlüsseln.

Backups lassen sich als Voll- und inkrementelle Backups anlegen. Dadurch ist es möglich, z.B. jeden Sonntag ein Vollbackup zu machen und dann an den folgenden Wochentagen nur noch die Änderungen zu sichern. Auf die unveränderten Dateien wird mit sogenannten "Hardlinks" verwiesen, so dass man ein sehr platzsparendes Backup erhält, dass es trotzdem ermöglicht, jederzeit auf alle Daten zurückzugreifen. Mit Aufbewahrungsregeln (expire-rule) wird festgelegt, wie lange ein Backup erhalten bleibt, bis es wieder überschrieben wird. Dadurch hat man die Möglichkeit, ganze Generationen von Backups anzulegen.

Durch Ausnahme-Regeln (exclude) lässt sich auch festlegen, welche Dateien und Verzeichnisse nicht gesichert werden sollen. Praktisch ist auch die Möglichkeit, Skripte festzulegen, die vor und nach dem Backup ausgeführt werden sollen. So könnte man sich z.B. nach dem Backup eine Mail zuschicken lassen, die über Erfolg oder Misserfolg des Backups berichtet. Da Backups möglichst automatisiert ablaufen sollten, bringt dirvish im Verzeichnis /etc/cron.d/ einen vorgefertigten Cronjob namens dirvish mit, der an die eigenen Bedürfnisse angepasst werden kann (und sollte). Ein weiterer Cronjob mit zugehörigem bash-Skript liegt als Datei dirvish-cronjob im Verzeichnis /etc/dirvish/

Für unterschiedliche Bedürfnisse (z.B. mehrere Rechner oder zur Trennung von Root- und normaler User-Sicherung) lassen sich verschiedene Backupprofile anlegen, in dirvish "Vault" (dt. etwa Tresor) genannt. Letztendlich sind dies Unterverzeichnisse mit dem betreffenden "Vault"-Namen im eigentlichen Backupverzeichnis (in dirvish "Bank" genannt), so dass man z.B. problemlos die gesicherten Daten der gesamten Familie in die Unterverzeichnisse "Maria", "Paul" und "Jan" sortiert bekommt, ohne durcheinander zu geraten.

Neben dem dem eigentlichen Backup-Werkzeug werden noch zwei weitere Programme installiert, die zur Verwaltung von Backups benutzt werden können:

  • dirvish-expire, zum löschen von Backups, deres Aufbewahrungszeit abgelaufen ist
  • dirvish-locate, zur Sache von Dateien innerhalb der Backups

Terminologie[Bearbeiten | Quelltext bearbeiten]

Da dirvish nicht nur in seiner man-Page spezielle Begriffe benutzt (Bank, Vault, Image) auf die man in Anleitungen immer wieder stösst ohne das sie sofort direkt verständlich sind, sei hier eine kurze Erklärung versucht:

  • Bank: dies ist der Ort für das Wurzelverzeichnis der Backups, also z.B. /mnt/backup/ Innerhalb dieser "Bank" liegen dann die "Vaults"
  • Vault: Das Prinzip von Dirvish ist es, sogenannte "Vaults" (Tresore) zu definieren, in denen die Backups (Image) gespeichert werden. Ein "Vault" ist ein Verzeichnis auf dem Backup-Medium. Neben der allgemeinen Konfigurationsdatei (/etc/dirvish/master.conf), die global gilt, besitzt jeder "Vault" auch eine spezielle Konfigurationsdatei, die sich auf dem Backupmedium befindet. Da mehrere Vaults benutzt werden können bekommt jeder Vault einen eigenen Namen. Dies könnte einfach Vault1, Vault2 usw. sein, aber praktischerweise sollte man sprechende Namen wie "PC" und "Laptop" oder "Maria" und "Klaus" benutzen.
  • Image: ein Image ist ein Verzeichnis innerhalb eine Vaults, in dem die Ergebnisse eines Backups gespeichert werden. Dies umfasst die Index-, die Log- und eine Summary-Datei, sowie ein Verzeichnis mit dem Namen "tree", in dem das eigentliche Backup liegt.

Um das alles noch mehr zu verdeutlichen nehmen wir mal folgendes Szenario an:

Bank sei /mnt/backup und es existieren zwei Vaults, foo und bar, für foo wurde erst einmal ein Backup durchgeführt (am 28.4.2021), für bar schon zweimal, zuerst am 27.4.2021 und dann am 28.4.2021. Damit ergibt sich folgende Verzeichnisstruktur:

 /mnt/backup
 ├── foo
 │   ├── 2021-04-28
 │   │   ├── index
 │   │   ├── log
 │   │   ├── summary
 │   │   └── tree
 │   └── dirvish
 │       ├── default.conf
 │       └── default.hist
 ├── bar
 │   ├── 20210427230000
 │   │   ├── index
 │   │   ├── log
 │   │   ├── summary
 │   │   └── tree
 │   ├── 20210428211144
 │   │   ├── index
 │   │   ├── log
 │   │   ├── summary
 │   │   └── tree
 │   └── dirvish
 │       ├── default.conf
 │       └── default.hist

Konfiguration[Bearbeiten | Quelltext bearbeiten]

Die Konfiguration von dirvish erfolgt in mehreren Dateien, einmal in /etc/dirvish/master.conf als globaler Konfigurationsdatei und dann noch für jedes gewünschte Backupprofil eine eigene Konfigurationsdatei. Meistens kommt man aber mit einem Backupprofil aus.

master.conf[Bearbeiten | Quelltext bearbeiten]

Eine kleine Musterdatei master.conf befindet sich im Verzeichnis /usr/share/doc/dirvish/examples/ und kann nach /etc/dirvish/ kopiert und dort angepasst werden.

Die Einträge erfolgen in dieser Form:

bank:
       /backup

es können auch mehrfache Werte angegeben werden, für jeden Wert eine neue Zeile:

exclude:
       tmp/
       proc/
       lost+found/
Liste wichtiger Einstellungen
Einstellung Bedeutung Beispiel
bank: Speicherort des Backups /media/backup/dirvish/pc
exclude: diese Verzeichnisse sollen nicht gespeichert weden
lost+found/
proc/
Runall: wann soll welche Sicherung regelmäßig ausgeführt werden pc-home 23:00
expire-default: wie lange sollen einzelne Sicherungen aufgehoben werden? möglich ist "never" (werden sofort überschrieben) oder +n days (werden nach n Tagen überschrieben) never
expire-rule: Regeln für die Aufbewahrungszeit von Sicherungen. Dazu wird das cron-Format benutzt, Details dazu s. cron Im Beispiel wird das Montags (1 = Montags) erstelle Backup 3 Monate aufgehoben
*   *     *   *         1    +3 months
pre-[*]: Skript, dass vor dem Backup ausgeführt werden soll. [*] ist entweder server oder client, je nachdem, wo das Skript ausgeführt werden soll
pre-server:
    /usr/local/sbin/vor-backup.sh
post-[*]: Skript, dass nach dem Backup ausgeführt werden soll. [*] ist entweder server oder client, je nachdem, wo das Skript ausgeführt werden soll
post-client:
   /usr/local/sbin/nach-backup.sh
speed-limit: maximale Übertragungsgeschwindigkeit der Sicherung in Megabit pro Sekunde 10

Definition Backup-Profil[Bearbeiten | Quelltext bearbeiten]

für jedes Backup-Profil (Vault) wird auf dem Backupserver eine Konfigurationsdatei angelegt. Der Aufbau ist ähnlich wie in der Datei master.conf, entweder

Option: Wert

wenn nur ein Wert angegeben wird, oder

Option:
    Wert1
    Wert2
    Wert3

für mehrfache Werte.

Liste wichtiger Optionen
Option Bedeutung Beispiel
client: Name des Clients, der gesichert werden soll. Ist Clientname = Hostname wird automatisch ein lokales Backup angelegt. Für Backups auf entfernten Rechnern mittels ssh kann es notwendig sein, den Usernamen gefolgt von @ voranzustellen (wie gewohnt bei ssh) gosian@pc
tree: Liste der zu sichernden Verzeichnisse
/home
/root
xdev: entweder 1 (die Verzeichnisse von Mountpoints werden nicht gesichert) oder 0 (sichert auch Mountpoints) 1
index: wenn vorhanden wird eine Liste (Indexfile) aller gesicheten Dateien angelegt. mögliche Werte geben an, wie dieses Indexfile gepackt werden soll (gzip oder bzip2) bzw. nicht gepackt (text) gzip
log: Format für das Logfile. Werte wie bei index: text, gzip oder bzip2 text
image: Name für das Backup-Image, dabei kann das Format von strftime benutzt werden. Diese Einstellung in der Konfigurationsdatei kann dazu führen, dass die Befehlszeilenoption außer Kraft gesetzt wird, deshalb sollte besser die Option image-default benutzt werden %Y%m%d
image-default: wie Option image: %Y-%m-%d
exclude: Liste von Verzeichnissen u. Dateien, die nicht gesichert werden sollen. Wenn vorhanden ergänzt dies die exclude-Liste von master.conf
/var/cache/
/tmp/**

Verwendung[Bearbeiten | Quelltext bearbeiten]

Als Backupverzeichnis wird hier eine externe USB-Festplatte benutzt, die nach /mnt/backup gemountet wird.

In jedem "vault" muss ein Verzeichnis dirvish existieren. In diesem Verzeichnis legt dirvish beim Backup die Logdatei an und dort muss sich auch die Konfigurationsdatei default.conf für den vault befinden. Dies könnte also z.B. mit dieser Befehlsfolge erreicht werden:

cd /mnt/backup
mkdir vaultname
cd /mnt/backup/vaultname
mkdir dirvish
cd dirvish
touch default.conf 

bzw. gleich dort mit dem Lieblingseditor die Datei default.conf mit den nötigen Werten anlegen.

Als Beispiel sei hier eine kleine default.conf mit dem Vaultnamen gosia angeführt, die also im Verzeichnis /mnt/backup/gosia/dirvish/ liegt:

client:         mexiko             # für Backups auf einer externen USB-FP sollte hier der Hostname stehen
tree:           /home/gosia/TEXTE  # sichert das Verzeichnis /home/gosia/TEXTE
exclude:        *.bak
                *~
                .*
                *.tmp
                lost+found/
# Aufbewahrungszeit 3 Tage
expire-default: +3 days
image-default: %Y-%m-%d

Vor jedem Backup sieht dirvish nach, ob "alte" Backups existieren, deren Aufbewahrungszeit (mit expire definiert) überschritten ist und löscht diese. Da beim erstmaligen Gebrauch dies noch nicht der Fall sein kann, muss dirvish für jedes vault "initialisiert" weden:

dirvish --vault vaultname --init

Damit wird u.a. das erste Backup angelegt (/mnt/backup/vaultname/DATUM/tree/) wobei DATUM ein Zeitstempel ist, dessen Format in der zugehörigen Datei default.conf mit der Option image-default definiert wird. In diesem Beispiel würde also DATUM so aussehen:

2021-04-28

Von nun an können alle weiteren Backups per Cronjob oder mit dem Kommando

dirvish-runall

angelegt werden.

weitere dirvish-Werkzeuge[Bearbeiten | Quelltext bearbeiten]

dirvish-expire[Bearbeiten | Quelltext bearbeiten]

Jedes zugehörige Konfigurationsdatei wird auf das Feld "Expire:" geprüft. Wenn dieses Feld anzeigt, dass die Aufbewahrungszeit des Backups abgelaufen ist, löscht dirvish-expire das Backup aus dem Tresor (Vault). Standardmäßig werden alle Unterverzeichnisse aller Sicherungen als Tresor/vault behandelt und alle Verzeichnisse darin außer dem Verzeichnis mit dem Namen dirvish werden geprüft. Das Entfernen eines Backup-Abbilds hat keine Auswirkungen auf andere Backups. dirvish-expire löscht ein Backup nur dann, wenn es mindestens noch ein intaktes Backup in diesem Zweig findet, das einen erfolgreichen Status hat und dessen Aufbewahrungszeit (Expire) noch nicht abgelaufen ist

dirvish-locate[Bearbeiten | Quelltext bearbeiten]

Suchen von Versionen von Dateien in einem Tresor/Vault[Bearbeiten | Quelltext bearbeiten]

Die erfolgreiche Benutzung von dirvish-locate ist nur möglich, wenn in einer Konfigurationsdatei (master.conf oder default.conf) überhaupt das Anlegen eines Index gesetzt wurde, also z.B.

index: text

Wurde die Option index nicht gesetzt, bzw. auf

index: none

so meldet dirvish-locate zwar keinen Fehler, findet aber auch nichts.

Aufruf[Bearbeiten | Quelltext bearbeiten]

dirvish-locate vault[:branch] pattern

Der Index eines jeden mit vault angegebenen Backups wird nach Pfaden durchsucht, die dem Muster entsprechen. Jeder gefundene Pfad, der mit dem Muster übereinstimmt, wird gemeldet, gefolgt von der Änderungszeit jeder Version der Datei und aller Images, die eine Verknüpfung zu ihr haben. Die optionale Angabe des Zweigs (branch) schränkt die Suche auf den angegebenen Zweig ein. Backups mit einem Fehlerstatus werden ebenso übersprungen wie solche ohne Indexdatei. Die Indexdatei kann mit gzip oder bzip2 komprimiert sein.

Das Muster ist ein regulärer Perl-Ausdruck, der auf die letzte Komponente des Pfades passt. Wenn nach einer beliebigen Teilzeichenkette des gesamten Pfades gesucht werden soll sollte man .* an das Ende des Musters angehängt werden, wenn Sie eine beliebige Teilzeichenkette des gesamten Pfades abgleichen wollen, oder $, wenn das Muster am Ende des Pfades verankert erfen soll. foo.* findet alle Pfade, die im Namen foo beinhalten, foo$ hingegen nur Pfade, die auf foo enden.

Verzeichnisse sind von der Suche ausgeschlossen, da sie ohnehin auf jede Datei darin passen würden. Symlinks sind ebenfalls vom Abgleich ausgeschlossen. Wenn das Muster auf zu viele Pfade passt, meldet dirvish-locate nur die gefundenen Pfade und nicht die Versionen. Als Sicherheitsprüfung, wenn die Anzahl der Übereinstimmungen wirklich zu hoch ist, begrenzt dirvish-locate die Anzahl der durchsuchten Backups. Zu viele Übereinstimmungen sind ein Hinweis auf ein nicht ausreichend spezifisches Muster. Verwenden Sie die resultierende Pfadliste, dann sollte man das Muster an Hand der ausgegebenen Liste spezischer zu definieren, z.B. statt foo.* besser foobar.*

Weblinks[Bearbeiten | Quelltext bearbeiten]

  • DirvishWiki Umfangreiches englischsprachiges Wiki zu dirvish, in dem eigentlich alle Aspekte zu dirvish beleuchtet werden, mitsamt Tipps, FAQ u. Emaillist und mehr
  • Backup leicht gemacht: Lokale und entfernte Sicherung mit Dirvish, Rsync und SSH genau das, was der Titel aussagt, ein ausführlicher Blogbeitrag von Markus alias apo, der an Hand eines praktischen Beispiels detailliert auf die Konfiguration und Anwendung von dirvish eingeht
  • Snapshot-Backups mit Dirvish & Rsync Vortrag von Robert Sander auf den Chemnitzer Linuxtagen 2012. Trotz seine Alters interessant vor allem wegen der Klärung der in dirvish benutzten Terminologie (Bank, Vault, Images, Branch). Geht aber auch gut auf die Konfiguration ein.
  • dirvish-Artikel aus dem Ubuntu-Wiki
  • Offsite-Backup mit DSL-Anschluss selbstbauen geht im Abschnitt "Backup mit dirvish" an Hand eines praktischen Beispiels (Backup auf einem entfernten Zweitrechner mit langsamem DSL-Anschluss und eventuell wechselnden IP-Adressen) auf die Anwendung von dirvish ein