ubuntuusers.de

USB-Backup mit UDEV+rdiff-backup => Script!

Status: Ungelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

Wolle69

Anmeldungsdatum:
2. August 2007

Beiträge: 176

Hallo zusammen!

Schon seit einiger Zeit sichere ich ganz bestimmte Daten auf meinem USB-Stick. Bei jedem Einstecken des Sticks im heimischen Rechner wird per UDEV ein Script getriggert, welches das Backup übernimmt. Konkret geht es dabei um ein Desktop-Wiki, was auf meinem Stick lebt. Das war jedenfalls der Anfang, nun möchte ich auch alle anderen Daten auf dem Stick automatisiert sichern. Da mein Script sozusagen "historisch gewachsen" ist, ist es sehr unflexibel, alles hart kodiert... ich möchte nun umstellen auf eine Konfigurationsdatei zum Script.

Hier mal zur Veranschaulichung ein Beispiel für eine Ordner-/Dateistruktur auf dem USB-Stick:

./portableapps           <= Verzeichnis, immer da, soll gesichert werden
./Desktopwiki            <= Verzeichnis, immer da, soll gesichert werden
./Desktopwiki/cache      <= Verzeichnis, immer da, soll NICHT gesichert werden
./Bilder                 <= Verzeichnis, nicht immer da, soll ggf. gesichert werden
./Bilder/Urlaub          <= Verzeichnis, zufällig da, soll gesichert werden
./Dokumente              <= Verzeichnis, nicht immer da, soll ggf. gesichert werden
./temp                   <= Verzeichnis, nicht immer da, soll NICHT gesichert werden
./text.txt               <= unsortierte Datei, nicht immer da, soll gesichert werden
./ebook.pdf              <= unsortierte Datei, nicht immer da, soll gesichert werden

Charakterisieren könnte man das wie folgt:

  • Mischung aus Dateien und Verzeichnissen, nennen wir sie "Objekte"

  • Objekte sind entweder:

    • bekannt, standardmäßig vorhanden ⇒ Sicherung an vorbestimmten Ort

    • bekannt und vorhanden ⇒ Sicherung an vorbestimmten Ort oder auch nicht

    • bekannt und nicht vorhanden ⇒ tu nix

    • unbekannt ⇒ Sicherung an vorbestimmten Ort

Sowohl auf die bekannten, wie auch auf die unbekannten Daten müsste man also einzeln eingehen. Ich stelle mir eine Konfigurationsdatei folgendermaßen vor:

i	portableapps		/home/user/backup/portableapps		5
i	Desktopwiki		/home/user/backup/Desktopwiki		60
e	Desktopwiki/cache
i	Bilder			/home/user/Bilder			10
i	Dokumente		/home/user/Dokumente			10
e	temp

"Zu lesen" wäre das vom Script spaltenweise:

  • i/e: include oder exclude

  • Quelle

  • wenn "i": Ziel

  • wenn "i": Anzahl der zu behaltenden Backups

Arbeiten möchte ich mit rdiff-backup, da habe ich ein bisschen Erfahrung. Das Script soll ein Shell-Script sein, eigene Erfahrungen habe ich sonst nur mit Assembler (nicht der Rede wert), Pascal/Delphi (konnte ich mal ganz gut), C (ein bisschen), HTML... neue Sprachen (perl, ruby, keine Ahnung, was es noch so gibt) möchte ich eigentlich nicht lernen. Außerdem spricht für ein Shell-Script, dass das auch mit einem Minimalsystem (also im Notfall, wenn man eben ein Backup wirklich braucht) funktioniert.

Die Funktionsweise des Scriptes, wie ich es mir vorstelle:

  1. Lies eine Zeile.

  2. Wenn 1. Spalte = "i", dann

    1. Parameter ermitteln

      1. include-String = 2. Spalte

      2. exclude-String = Summe aller 2. Spalten der Konfigurationsdatei außer der gerade bearbeiteten

      3. ziel-String = 3. Spalte

      4. Vorhalteparameter = 4. Spalte

    2. Backup-Befehl zusammensetzen: "rdiff-backup %include-String %exclude-string %ziel-string %vorhalteparameter

    3. Backup-Befehl ausführen und Log-Datei schreiben

  3. wenn 1. Spalte = "e", dann tu nix

  4. Wiederhole die Schleife, bis alle Zeilen der Konfigurationsdatei abgearbeitet sind

  5. Zum Schluss noch den "unbekannten Rest" sichern:

    1. Parameter ermitteln

      1. include-String = *

      2. exclude-String = Summe aller 2. Spalten der Konfigurationsdatei

      3. ziel-String = Ziel-Ordner für den Rest (hart kodiert)

      4. Vorhalteparameter = Fixwert (hart kodiert)

    2. Backup-Befehl zusammensetzen: "rdiff-backup %include-String %exclude-string %ziel-string %vorhalteparameter

    3. Backup-Befehl ausführen und Log-Datei schreiben

So. Ich denke, damit müsste ich eigentlich alles abgedeckt haben. Was ich nicht sichern will, wird ausgeschlossen (auch beim "Reste sichern"), was ich sichern will wird differenziert nach Zielorten und Vorhaltezeit abgelegt. Um den Rest wird sich auch gekümmert. Bis hierhin finde ich das ganz gut, habe ich was vergessen?

Nun das Problem: Wie verarbeite ich so eine Konfigurationsdatei in einem Shell-Script? In einer Hochsprache (Pascal, ...) würde ich ein Array (4 Spalten, x Zeilen) vollschreiben und das sinnvoll durchlaufen. Zweidimensionale Arrays und Bash sind ein Graus. Ich habe mal angefangen da zu recherchieren, aber das ist dann auch der Punkt, an dem ich meine Ambitionen immer abbreche. Zweidimensionale Arrays in einem Shell-Script zu verarbeiten ist ein ewiger Krampf und wenn ich so recht drüber nachdenke: Selbstzweck? Die Konfiguratiosdatei IST ja eigentlich schon das Array! Nur... wie durchlaufe ich die? Mit sed/awk? Da brauche ich Hilfe. Das ist zwar gutes Werkzeug, aber für mich recht kompliziert zu bedienen. Und: Wie gehe ich mit Leerzeichen, Sonderzeichen etc. um? Was nutze ich als Feldtrenner... Tabulator (ggf. mehrere!) wäre mir am liebsten, alles andere (bspw. Leerzeichen) könnte ja u.U. in den Daten vorkommen, davor ist man nie gefeit...

Über eine Hilfestellung, insbesondere zum Verarbeiten/Auseinandernehmen der Konfigurationsdatei würde ich mich sehr freuen.

Ciao

Wolle

P.S.: Die Backup-Scripte im Wiki habe ich studiert. Ist aber nicht das, was ich machen möchte. Grafische Programme oder überhaupt komplexere Programme sind nicht so meins, ich möchte das Ganze gerne selbst in der Hand haben, kontrollieren können und das auch im Notfall (Datenträgerausfall, ggf. kein vollständiges System mehr verfügbar) - sonst isses witzlos.

Wolle69

(Themenstarter)

Anmeldungsdatum:
2. August 2007

Beiträge: 176

Hallo zusammen!

Während ich mir mein eigenes Script bastele, habe ich das hier gefunden: http://www.mad-hacking.net/documentation/linux/reliability/backup/using-rdiff-backup-local.xml

Das geht schon STARK in die richtige Richtung. Problem: Was ist, wenn ich Verzeichnisse, Unterverzeichnisse und wiederum Unterunterverzeichnisse unterschiedlich handhaben möchte?

Nehme ich die jeweiligen Verzeichnisse als QUELLE mit zugehörigem ZIEL (entsprechend Konfigurationsdatei) und schließe alles andere mittels --exlude aus?

ODER

Nehme ich immer die Wurzel des zu sichernden Gerätes als QUELLE, schließe das jeweilige VERZEICHNIS (entsprechend Konfigurationsdatei) mittels --include ein, alles andere mittels --exclude aus, ZIEL wiederum entsprechend Konfigurationsdatei?

EDIT:

Momentan habe ich sowas in der Art:

while read CURRENT_LINE; do
  DO_OR_DONT="$(cut -f1 $CURRENT_LINE)" 
  # Include the directory?
  if [ "$DO_OR_DONT" = "i" ]; then
    # Source, destination and age of oldest backup to keep...
    CURRENT_SOURCE=$(cut -f2 "$CURRENT_LINE")
    CURRENT_DESTINATION=$(cut -f3 "$CURRENT_LINE")
    CURRENT_TIME=$(cut -f4 "$CURRENT_LINE")
    CURRENT_EXCLUSION=""
    while read EXCLUDE_LINE; do
      MATCH_OR_NOT="$(cut -f2 $EXCLUDE_LINE)"
      if [ "$MATCH_OR_NOT" != "$CURRENT_SOURCE" ]; then
        CURRENT_EXCLUSION=$CURRENT_EXCLUSION+" --exclude "+$MATCH_OR_NOT
      fi
    done < "$CONFIGDIR_FILE"
    # Backup! (+Logging!)
    #/usr/bin/rdiff-backup $RDIFF_OPTS $CURRENT_EXCLUSION ${DEVICE_DIR}/${CURRENT_SOURCE} ${PREFIX}\${CURRENT_DESTINATION}
    #/usr/bin/rdiff-backup $RDIFF_OPTS --include $CURRENT_SOURCE $CURRENT_EXCLUSION $DEVICE_DIR ${PREFIX}\${CURRENT_DESTINATION}
    # Clean up old backups! (+Logging!)
    #/usr/bin/rdiff-backup -v3 --remove-older-than ${CURRENT_TIME}D ${PREFIX}\${CURRENT_DESTINATION}
  fi
done < "$CONFIGDIR_FILE"

Interessant sind die beiden markierten Zeilen.

Ciao

Wolle

Antworten |