Mit Udev Regel sh ausführen?
Für ein Projekt in meiner Arbeit sollen wir mit einem Raspi ein kleines Projekt machen. Ich habe mich nun entschieden einen automatischen USB-Stick cloner zu bauen. Sprich egal welchen usb Stick ich einstecke, er wird auf die mikro sd des raspberry übertragen.
Dafür habe ich folgende udev Regel verwendet:
ACTION==add", SUBSYSTEM=="usb", RUN+="/usr/local/bin/usb.sh"
In besagter sh. Steht:
#!/bin/bash
cp - r /media/$1/* "home/cellbe/Desktop/usbclone"
Soweit so gut ich prüfe ob die sh funktioniert - ja tut sie einwandfrei, der gesamte usb Stick wird in den "usbclone" Ordner kopiert und alles super.
Wenn ich nun aber einen USB Stick anstecke, so wird nur ein leerer Ordner mit meinem username (cellbe) erstellt auf den ich nicht mal zugreifen kann - ___-
Kann mir da vielleicht irgendjemand helfen? Kenne mich nicht wirklich in Linux aus aber dachte es wäre ein ganz cooles Projekte.
2 Antworten
ich bin mir nicht zu 100% sicher, aber könnte vielleicht daran liegen, dass die udev-Regel das Skript "usb.sh" ausführt, bevor das USB-Gerät vollständig gemountet ist. Infolgedessen ist der Pfad "/media/$1" noch nicht verfügbar. Änder die udev-Regel mal so, dass das skript erst ausgeführt wird, nachdem das USB-Gerät vollständig gemountet ist. Dazu kannst du add durch change ersetzen.
Also ACTION=="change", SUBSYSTEM=="usb", RUN+="/usr/local/bin/usb.sh".
Man kann natürlich auch add beibehalten und das skript usb.sh so ändern, dass es den pfad zum USB-Gerät selbst ermittelt, aber ich denke dass ist erstmal zu komplex für dei Vorhaben. Probier es erst mal so aus...
kurze logik erklärung;
add wird ausgeführt wenn ein neues gerät erkannt wird
change wenn sich die Eigenschaft eines bereits bekannten Gerät ändert. Vielleicht klappt es ja so, kann es aber nicht garantieren
genau. Change wird erst ausgeführt wenn alles vollständig geladen hat
Ich weiß nicht ob das mit change soweit besser geht. Besser wäre in dem Fall gar kein Automount zu verwenden sondern den mount nach dem einstecken selbst zu machen so wie hier:
https://andreafortuna.org/2019/06/26/automount-usb-devices-on-linux-using-udev-and-systemd/
Oder einfach zu warten bis der stick gemountet wurde.
Allerdings sollte die udev in beiden Fällen einen Prozess spawnen welcher das macht, damit die Udev abgeschlossen werden kann und das kopieren asynchron läuft.
ja es sollte beides gehen, wobei beides seine hacken, bzw. Vor- und Nachteile hat.
Ich meinte damit dass die Funktion add ausgeführt wird wenn du einen neuen USB Stick ansteckst. In diesem Fall ist das Gerät noch nicht vollständig gemountet und der Pfad "/media/$1" ist noch nicht verfügbar.
Die Aktion "change" wird hingegen ausgeführt, wenn du einen bereits angeschlossenen USB-Stick an- oder abstöpselst. In diesem Fall ist das Gerät bereits vollständig gemountet und der Pfad "/media/$1" ist verfügbar.
Bei Verwendung von systemd-Diensten bist du halt Rubuster und hast mehr zuverlässigkeit vor Datenverlust. Bei speraten Skripts bist du halt jenachdem wie du dein skript aufbaust definitiv flexibler und effizienter. Man muss mal alles durchtesten und schauen was geht
Also mit "change" passiert tatsächlich gar nichts mehr :/
Die Udevregel führt das Skript beim einstecken des USB Sticks aus du musst aber warten bis der Stick gemountet ist bzw den Stick selbst mounten.
Dass du auf den Ordner nicht zugreifen kannst liegt daran, dass das ganze mit Root Rechten erstellt wird.
Werde es morgen gleich mal ausprobieren 👍
Habe jetzt endlich Feierabend aber an sowas in der Art habe ich auch schon gedacht, weil dieses Fenster mit (Ordner anzeigen?) erst später kommt