Okt 2014: Automatische Synchronisation von USB-Sticks

USB-Speicher, egal ob Sticks oder Platten, unterliegen einer deutlich höheren Wahrscheinlichkeit für Datenverlust. Gleichzeitig sind diese Speicher, da sie sehr unregelmäßig an einem Gerät angeschlossen sind, sehr schwer in automatische Backupsysteme zu integrieren. Eine Möglichkeit besteht darin die Daten vom USB-Speicher bei jeder Verwendung automatisch auf die lokale Festplatte zu synchronisieren. Die Daten auf der lokalen Platte können dann wie gehabt vom Backup erfasst werden (z.B. mit Bareos).

Unter Linux sind ein paar Schritte notwendig um dies zu erreichen. Dabei werden die Daten von USB-Sticks mit einem Verzeichnis auf der lokalen Platte synchronisiert (hier ein Verzeichnis im Home-Verzeichnis) sobald das Geräte eingebunden wird (gemountet). 

Die hier gezeigte Variante synchronisiert in beide Richtungen. So kann man sogar lokal arbeiten und die Daten zum Stick werden mit dem nächsten mount automatisch abgeglichen.

Auch wenn es meist klar ist möchte ich es doch nochmal erwähnen: Die Synchronisation ersetzt immer noch kein Backup. Denn sollten Fehler auftreten (egal ob auf dem USB-Speicher oder der lokalen Platte) werden diese auch synchronisiert. D.h. im Störfall werden die noch brauchbaren Dateien ggf. durch die Defekten überschrieben.

Folgende Schritte müssen für die automatische Synchronisation vorgenommen werden:

  1. Unison installieren

  2. /etc/udev/rules.d/99-usb-drive-sync.rules
    KERNEL=="sd?1", SUBSYSTEMS=="usb", ACTION=="add", \ ENV{SYSTEMD_WANTS}+="usbsync@%k.service"

    Häufig findet man Vorschläge über RUN (z.B.: RUN+="sync-backup-drive-wrapper.sh %k"). Dies funktioniert allerdings nicht, da das Skript nach wenigen Sekunden abgebrochen wird. Auch der Ansatz über einen wrapper bei dem über nohup ein weiteres Skript aufgerufen wird ist keine Lösung.

    Das += ist kein Fehler.
    Über @%k wird der Name des Gerätes an den Service übermittelt

  3. Regel neu laden: udevadm control --reload-rules

  4. Service Regel anlegen: /etc/systemd/system/usbsync@.service
    Wichtig, das @muss bleiben, dadurch kann der Name des Gerätes übernommen werden.

    [Unit]
    Description=Sync between usb stick and local folder

    [Service]
    Type=oneshot
    ExecStart=/usr/local/bin/sync-usb-drives.sh %I

    [Install]
    WantedBy=multi-user.target

  5. Service aktivieren
    systemctl enable usbsync@

  6. Das eigentliche Bash-Skript anlegen: /usr/local/bin/sync-usb-drives.sh
    hier ist das vollständige Skript.
    Skript ausführbar machen: chmod 744 /usr/local/bin/sync-usb-drives.sh

  7. Nutzer die diesen Dienst nutzen möchten legen in ihrem Home-Verzeichnis die Datei .usb-sync an. In dieser Konfigurationsdatei legen die das Verzeichnis fest in welches die Daten der USB-Platten synchronisiert werden sollen. Der Parameter lautet sync_target_folder und der Inhalt der Datei könnte so aussehen.

    sync_target_folder="ownCloud/USBBackup"

    Das Verzeichnis muss innerhalb des Heimat-Verzeichnisses liegen. In meinem Fall liegt der Ordner unterhalb des ownCloud-Odners, so dass das USBBackup-Verzeichnis auf allen Rechnern verfügbar ist auf denen ich OwnCloud verwende.

Sollte im Homeverzeichnis des Nutzers welcher den USB-Speicher einbindet kein Verzeichnis USBBackup exisiteren, wird keine Synchronisation ausgeführt.
Für jeden USB-Speicher wird im Verzeichnis ~/USBBackup ein eigenes Verzeichnis angelegt. Der Name des Verzeichnisses setzt sich aus der UUID des Speichers und dem Partitionsnamen zusammen.

Einschränkungen:

  1. Die Daten werden nur im Moment des Mountens abgeglichen. Änderungen die danach an den Dateien vorgenommen wird werden erst beim erneuten mounten abgeglichen.
  2. Fehler (z.B. falsche Systemzeit) könnten zu Datenverlust führen.