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