UDEV-Regel: Daten von USB-Stick kopieren

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • 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

    3 Mal editiert, zuletzt von Gismor1212 (15. Dezember 2022 um 10:28)

  • 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").

    2 Mal editiert, zuletzt von Gismor1212 (15. Dezember 2022 um 13:16)

  • 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

    Meine Pis

    Pi B Rev 2 24/7 - DHCP-Server im Heimnetz
    Pi 2B Rev 1.1 Home-Infocenter (Domoticz) - Kamera auf Garten
    Pi 2B Rev 1.1 Testgerät mit USV, Musikplayer, Kodi,
    Pi 3B Rev 1.2 Videos aus Netzwerk (an Rückseite des TV moniert)
    Pi 3B+ Rev 1.3 mit 3.5-TouchDisplay, Peppy-Web-Radio
    Pi 4B - 4GB Rev 1.1 Testgerät - Argon-ONE-Gehäuse

    Pi Zero Testgerät

    Pi Zero W Rev 1.1 Motion-Eye auf Garten

  • 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?

  • Code
    sudo udevadm control --reload
    sudo udevadm trigger

    ergibt:

    Code
    sudo[2425]: pi  :  TTY=pts/0 ; PWD=/home/pi  ;  USER=root  ; COMMAND=/usr/bin/udevadm control trigger
    sudo[2278]: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=1000)
    sudo[2278]: pam_unix(sudo:session): session closed for user root


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

    da kommt:

    Code
    total 16
    -rw-r--r-- 1 root root 1883 Feb 24  2022 99-com rules
    drwxr-xr-x 5 root root 4096 Dec   5 11:07 . .
    -rw-r--r 1 root root  180 Dec 15 13:31 11-usb-un-script.rules
    drwxr-xr-x 2 root root 4096 Dec 15  17:41  .

    Kernel 5.15.76-v7l+

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

    Einmal editiert, zuletzt von Gismor1212 (16. Dezember 2022 um 09:34)

  • 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!

Jetzt mitmachen!

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