UDEV-Regel: Daten von USB-Stick kopieren

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Hallo zusammen!


    Ich freue mich über jede Hilfe bei folgendem Problem:


    Eine udev-Regel (angelegt in /etc/udev/rules.d) soll das Einstecken eines USB-Sticks automatisch erkennen und dann ein Script ausführen. Dabei sollen unterschiedliche USB-Sticks erkannt werden, solange der Name der zu extrahierenden Datei spezifisch ist.


    udev-Regel:

    Code
    KERNEL!="sd[a-z]*", GOTO="script_end"
    ACTION=="add", PROGRAM!="/sbin/blkid %N", GOTO="script_end"
    ACTION=="add", RUN+="/etc/udev/scripts/start-move-usb-data.sh"
    LABEL="script_end"



    Script "start-move-usb-data.sh" bereitet den USB-Stick und das Verzeichnis vor:

    Bash
    #!/bin/bash
    echo $0: $ID_FS_LABEL>>/tmp/script.log
    if [ -z "$ID_FS_LABEL" ]
    then
    exit 0
    fi 
    mkdir -p /media/pi/$ID_FS_LABEL
    echo mount /dev/disk/by-label/$ID_FS_LABEL /media/pi/$ID_FS_LABEL
    echo mount /dev/disk/by-label/$ID_FS_LABEL /media/pi/$ID_FS_LABEL | at now
    echo /home/pi/data/move-usb-data.sh $ID_FS_LABEL | at now

    In der Log-Datei wird $ID_FS_LABEL nicht geschrieben!



    Script "move-usb-data.sh" führt das Extrahieren der ZIP-Datei durch:


    Wenn ich ich in diesem Script "$1" in den tatsächlichen Verzeichnisnamen des USB-Sticks ändere, kann ich das Script erfolgreich manuell starten.


    Es scheint, dass der Pfad des USB-Sticks Probleme macht. Das Mounten des USB-Sticks gelingt aber automatisch unter sda1.


    Danke für eure Tipps!


    Viele Grüße

  • Probier's mal so:


    Code
    ACTION=="add", RUN+="/etc/udev/scripts/start-move-usb-data.sh '%E{ID_FS_LABEL}'"

    “Don’t comment bad code - rewrite it.”

    Brian Kernighan

  • Das bringt leider keine Änderung.


    Verwundert bin ich darüber, dass ich zwei Fehlermeldungen erhalte, wenn ich die rules mit sudo manuell starte:

    • Line 1: KERNEL!=sd[a-z]", : command not found
    • Line 2: PROGRAM!=/sbin/blkid %N, : No such file or directory

    Die blkid liegt aber in dem Ordner vor. Fehlende Rechte?


    Beim manuellen Starten der start-move-usb-data.sh passiert nichts, außer dass in der log-Datei der Pfad geschrieben wird, wo die Datei liegt ("$0").

  • KERNEL!="sd[a-z]*", GOTO="script_end"

    Ich nehme mal an, dass zwischen KERNEL und dem ! eine Leertaste eingefügt werden muss und genauso in Zeile 2 nach PROGRAM

  • Ich habe es mit sudo bash /etc/... versucht, bin mir aber selbst unsicher, ob das überhaupt funktioniert. Es ergab auf jeden Fall die beiden Fehlermeldungen.

  • habe es mit sudo bash /etc/... versucht, bin mir aber selbst unsicher, ob das überhaupt funktioniert. Es ergab auf jeden Fall die beiden Fehlermeldungen.

    Logisch, dass da Fehler kommen. udev-rules sind keine Shellscripte, es sind eben udev-spezifische Anweisungen.

    Wenn du nichts zu sagen hast, sag einfach nichts.

  • Nun habe ich folgendes versucht:


    In "start-move-usb-data.sh" habe ich $ID_FS_LABEL durch die tatsächliche ID des USB-Sticks ersetzt.

    In "move-usb-data.sh" habe ich $1 durch die tatsächliche ID des USB-Sticks ersetzt.


    Wenn ich die Datei manuell starte (sudo bash...), läuft der export korrekt ab.


    Zum testen habe ich nun eine weitere udev-Regel angelegt, um zu sehen, ob das Script ausgeführt wird, wenn der Stick eingesteckt wird:

    KERNEL=="sda1", ACTION=="add", RUN+="/etc/udev/scripts/..."


    Dennoch wird das Script nicht ausgeführt, wenn ich den Stick einstecke.

  • ein Link zum ArchWiki udev und

    zum UbuntuUsers udev

    Danke. Die Seiten hatte ich schon durch, konnten mir aber nicht weiterhelfen. Meistens wird hier der vorgang beschrieben, wenn ein konkretes Gerät mittels uuid oder IdVendor identifiziert und eingebunden werden soll. Ich benötige eine Lösung, die jeden USB-Stick erkennt.
    Dennoch stellt sich zunächst das Problem, dass die udev-Regel das Script gar nicht erst auslöst. Wieso nicht?

  • Dennoch stellt sich zunächst das Problem, dass die udev-Regel das Script gar nicht erst auslöst. Wieso nicht?


    Es ist schwierig dir zu helfen, wenn du nicht die genauen Befehle hier hinschreibst und die korrespondieren (Fehler-)Meldungen, sondern immer ein "bash /etc/irgendwas/..."


    Udev ist nicht so designed dass du einfach irgendeinen Pfad zu einem Script hinwirfst in der Hoffnung es würde dann schon ausgeführt. In dem Artikel steht beschrieben wie man udev-debugging aktiviert, damit du in der Logging-Facility deiner Wahl (vermutlich journalctl -f) prüfen kannst, was udev auf deinem System macht. Dort siehst du alle Regeln die udev lädt, was passiert wenn du neue Blockgeräte ein- und aussteckst, ob udev irgendwelche Fehler meldet.


    Daher nochmal die Frage(n):


    In separatem Fenster log prüfen:


    Code
    sudo journalctl -f

    Was passiert wenn du:


    Code
    sudo udevadm control --reload
    sudo udevadm trigger


    eingibst?


    Wie ist die Ausgabe von:


    Code
    ls -lart /etc/udev/rules.d/


    Welchen Kernel verwendest du?

    Code
    uname -r


    Welche systemd-Version?

    Code
    systemctl --version



    Wenn alle Stricke reißen kannst du auch eine systemd-unit schreiben die mittels udev getriggert wird.

    “Don’t comment bad code - rewrite it.”

    Brian Kernighan

  • Habe gefühlt alle Manuals und Foren durchsucht. Die Anleitungen und Beschreibungen sind ja in der Regel ähnlich oder gleich. Keine der udev-Regeln, die ich aus den Beispielen und Anleitungen nachbaue, funktioniert; selbst die einfachsten nicht. Habe ich eine Konfiguration des Raspberries übersehen?

  • Kernel 5.15.76-v7l+

    systemd-Version 247 (247.3-7+rpi1+deb11u1)

  • Und dein Skript?


    Code
    ls -lart /etc/udev/scripts/


    Dann noch udev_log anpassen, die Datei findet sich unter /etc/udev/udev.conf:


    Code
    udev_log=debug
    #children_max=
    #exec_delay=
    #event_timeout=180
    #timeout_signal=SIGKILL
    #resolve_names=early


    Hier die Zeile "udev_log" auskommentieren und am besten auf debug setzen, anschließend udev neustarten und ins log schauen, es wird dann mehr ausgegeben.

    “Don’t comment bad code - rewrite it.”

    Brian Kernighan

  • Hier etwas Interessantes:

    Lasse ich jornalctl -f laufen und stecke den USB-Stick ein, gibt die Konsole aus:

    sda1: Spawned process '/etc/.../start-move-usb-data.sh' [2522] is taking longer than 59s to complete

    Das Script wird also doch automatisch ausgeführt, bleibt aber stecken. Wieso? Das Script funktioniert doch!