Automatische Datensicherung bei Einstecken eines USB-Sticks

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Ich nutze einen RasPi mit owncloud in einer DMZ. Daher kann ich für ein Backup nicht auf mein Netzwerk zugreifen. Nun kam mir die Idee, ein gelegentliches Backup auf einen USB-Stick oder eine USB-Festplatte zu machen. Um das manuelle Anstoßen des Backups zu umgehen, möchte ich eine Lösung einrichten, die beim Anstecken eines USB-Sticks automatisch ein bestimmtes Verzeichnis in ein bestimmtes Verzeichnis dieses Sticks kopiert.

    Der Stick soll nicht dauerhaft am RasPi angeschlossen sein. Über die Suche habe ich keinen passenden Beitrag gefunden und die große Suchmaschine bietet nur Windows-Lösungen.

    Hat das schon mal jemand so umgesetzt, oder kennt ein Projekt, bei dem das so gelöst wurde? Oder kann mir jemand erklären, ob und wie so etwas zu realisieren ist?

  • Automatische Datensicherung bei Einstecken eines USB-Sticks? Schau mal ob du hier fündig wirst!

  • Hallo Neueinsteiger,

    ich habe im Rahmen eines kommerziellen Produktes etwas Vergleichbares schon einmal programmiert.

    Du wirst sicherlich Verständnis dafür haben, dass ich da keinen Quellcode posten kann. Der Kunde hat schließlich dafür gezahlt.

    Aber Du kannst folgendermaßen vorgehen:

    1. Wenn Du einen USB-Stick einsteckst, dann kannst Du dies über folgende Befehle erkennen:

    Code
    lsusb
    df
    mount

    Der Befehl

    Code
    man ...

    gibt Dir eine Übersicht der Kommandozeilenparameter. Einige davon wirst Du für angebracht halten, für Dein Projekt einzusetzen.

    2. Du schreibst ein Programm das die in 1. aufgeführten Befehle im Abstand von einem festgelegten Zeitraum abfragt. Das Programm läuft im Hintergrund und erfordert praktisch kaum Ressourcen.

    3. Sobald ein USB-Speichermedium (kann auch eine Festplatte sein) erkannt wird, ruft Dein Programm das Kopierkommando von Linux auf.

    Code
    cp

    Auch hier hilft Dir

    Code
    man cp

    weiter, um die angebrachten Kommandozeilenparameter zu ermitteln.

    4. Dann musst Du Dir Gedanken machen, wie Du den Abschluss des Kopiervorgangs erkennen kannst. Irgendwas muss piepsen, leuchten etc.

    5. Damit ist es noch nicht getan. Du brauchst ein Kommando, das die im Puffer befindlichen Daten auf das Speichermedium bringt. Ansonsten steigt die Wahrscheinlichkeit, das das Dateisystem korrupt ist, wenn Du den USB-Stick unmittelbar danach entnimmst

    6. Und bevor Du das USB-Medium entnimmst, muss es mit

    Code
    umount


    aus dem System abgemeldet werden. Auch hier muss das System irgendwie zurückmelden.


    Für das Kernprogramm habe ich damals 30 Minuten gebraucht. Zum Schluss kam ein Programm heraus, mit dem LEDs den Status angezeigt haben, Vergleichs-Routinen beim Einstecken von zwei USB-Sticks an BESTIMMTE USB-Ports.

    Unabhängig von meiner Vorgehensweise kannst Du Dich auch mit dem Linux-Kommando udev beschäftigen. Dieses sollte Dich auch auf den richtigen Weg bringen.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (22. Januar 2015 um 09:45)

    • Offizieller Beitrag

    UDEV wäre mein Ansatz für dieses Problem. Befrage mal die Forensuche, wir hatten diesen Fall schon mal, wenn ich nicht recht erinnere.

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

  • Ich habe mehrere Raspberry Pi in Betrieb, die ich teilweise ohne Maus und Tastatur und auch ohne SSH betreibe. Als Steuerung setze ich einen USB-Stick ein.

    Wenn ich den Stick einstecke, erkennt das ein laufendes Programm und startet daraufhin die auf dem Stick gespeicherten batch-Dateien. Auf diese Weise kann ich mit dem jeweiligen Raspberry Pi Daten austauschen, Programme starten usw. Auf dem gleichen Wege wäre auch das Anstoßen einer Datensicherung möglich.

  • FAQ --> Nützliche Links / Linksammlung --> Laufwerk/Gerät immer der selben Gerätedateien zuweisen (udev)

    Da findest du auch direkt ein Beispiel, sowie 4 Links zu weiteren konkreten Anwendungen - da du nicht der erste bist der hier nach sowas fragt.

  • Ich empfehle folgendes Vorgehen:

    1. Es werden zunächst feste Dateinamen für Batch-Dateien vereinbart, je nachdem, wieviele Dateien bei einem USB-Stick-Aktion voraussichtlich ausgeführt werden sollen.

    2. Im Hauptprogramm werden diese Dateinamen in einem Feld - zusammen mit jeweils einer kleinen numerischen Variablen (ein Bit oder ein Byte (oder char) genügt) - gespeichert. Diese Variable soll zukünftig festhalten, ob die zugehörige Batch-Datei seit Einstecken des USB-Stick bereits ausgeführt wurde. Am Anfang der Programmabarbeitung werden diese Variablen auf Null gesetzt.

    3. Dann beginnt der Zyklus. Im Zyklus wird zunächst festgestellt, ob eine der im Feld gespeicherten Dateien auf dem Stick vorhanden ist. - Wenn keine der festgelegten Dateien vorhanden ist, kann davon ausgegangen werden, dass der Stick nicht eingesteckt ist, und sämtliche Variable werden auf Null gesetzt.

    Wenn eine der festgelegten Dateien auf dem Stick vorhanden ist und die zugehörige Variable auf Null steht (!), wird die Datei ausgeführt, und die zugehörige Variable wird auf Eins gesetzt (damit die Datei beim nächsten Zyklus-Durchlauf nicht wieder ausgeführt wird).

    Wenn auf diese Weise alle Dateien geprüft (und eventuell ausgeführt) sind, kann man dem Gerät einen Schlaf gönnen (je nach Belieben), damit die anderen laufenden Programme auch zu ihrem Recht kommen, und dann geht der Zyklus wieder von vorn los.

    Dateien, die einmal ausgeführt wurden, werden nicht ein zweites Mal ausgeführt, weil die genannte Variable, die dann auf Eins steht, das verhindert (s. 2. Absatz in Punkt 3).

    Wenn allerdings der Stick herausgezogen wird, wird in einem Zyklus-Durchlauf festgestellt, dass überhaupt keine der festgelegten Dateien vorhanden ist, und sämtliche genannten Variablen werden auf Null gesetzt. Danach werden bei erneutem Einstecken des Sticks die vorhandenen Dateien wieder ausgeführt.

    Programmtechnisch scheint mir das Problem nicht sehr kompliziert. Ich habe es in C programmiert, aber auch Python oder C++ sind geeignet.

    Bei Bedarf bin ich gern bereit zu helfen.

  • Das ist glaub ich etwas zu kompliziert ;)

    In der von mir genannten Anleitung ist genau beschrieben wie was wo passiert wenn man einen USB-Stick einsteckt, auch das dann ein Script automatisch ausgeführt wird. Anschließend würde es mehr Sinn machen einfach rsync zu verwenden, das Programm prüft dann ob die Quelldatei (auf dem PI) bereits auf dem Ziel (USB-Stick) vorhanden ist, ob diese ggf neuer ist und kopiert es dann.. Man brauch also eigentlich nichts von wegen Variable auf 0 setzen oder sowas :fies:

    Man sollte auch nicht das Ziel von Neueinsteiger aus den Augen verlieren:

    beim Anstecken eines USB-Sticks automatisch ein bestimmtes Verzeichnis in ein bestimmtes Verzeichnis dieses Sticks kopiert.

    Der Stick soll nicht dauerhaft am RasPi angeschlossen sein.

    Klick dich wie gesagt mal durch die Links, die am Ende der Anleitung stehen (von wegen: > hier < und > hier < etc...)

    Kombiniert mit den Beiträgen bezüglich Backup erstellen wie zum Beispiel: Automatisches Erstellen eines Backups (Pi sichert sich selbst)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!