UDEV

  • Ich möchte, das beim Anstecken eines USB Sticks gemountet wird, und zwar wenn er eine Bestimmte (serial) hat. Also nur ein bestimmter USB Stick.

    Die Udev Regel kenne ich, und unter Ubuntu funktioniert mein Vorhaben einwandfrei, nur unter Raspian nicht.

    Das Proplem scheint zu sein, das Raspbian immer nur die bestimmten Partitionen (wie sda1) mounten kann.

    Wenn ich nämlich in /rules.d eine Datei anlege xx.rules mit dem Inhalt: "ATTRS{serial}=="xxxx", SYMLINK+="stick""

    Dann wird er nicht als "/dev/stick" erkannt.

    Wenn ich allerdings "KERNEL=="sda1", SYMLINK+="stick" " anlege, dann wird er auch unter /dev/stick erkannt.

    Mache ich hier etwas falsch?

  • Hallo matze1 !


    Es können in der gesamten Computerei immer nur Partitionen, genauer, das Filesystem einer Partition, gemountet werden. Ausnahme ist eine DOS Diskette.


    Dabei muss die Partition nicht mit dem Device Descriptor (hier /dev/sda1 = 1.Partition auf /dev/sda) angegeben werden, es geht auch mit der UUID des Filesystems der Partition, oder der Partitions-UUID, oder dem Partitions-Label ("stick"). Nicht zu verwechseln mit dem Device Label + UUID des Blockdevice selbst,

    /dev/disk/ zeigt Dir die gemounteten Partitionen und Devices.


    Mit dem Befehl: List Blockdevices Info-Filesystems < lsblk -f > zeigt auch Label und UUID, soferne vorhanden, weitere Anzeigeoptionen -h.



    Servus !

    RTFM = Read The Factory Manual, oder so

  • Du kannst nicht mit allen mit < lsblk -h > ersichtlichen Platten- und Partitionsparametern eine brauchbare Udev-Regel erstellen. Üblicherweise nimmt man dazu die UUID oder das Label des Filesystems, oder die UUID der Partition.


    Mit < lsblk -o name,serial,Partuuid,uuid > werden z.B. im Device-Tree Seriennummer, Partuuid und (Filesystem-)UUID angezeigt.


    Die UDEV-Regel wird dann mit UUID=xxxx, oder PARTUUID=xxxx eingeleitet.


    Ob das auch mit SERIAL= funktioniert, weiß ich nicht.



    Servus !

    RTFM = Read The Factory Manual, oder so

  • Danke, genau das hab ich gesucht. Ich wusste nicht,dass man gleich mit UUID=xxx anfangen kann, hab im Netz darüber nichts gelesen.

    Jetzt aber noch ein Problemchen, ich kann bei "RUN" nicht mein Python Script aufrufen.

    Zurzeit sieht das so aus:

    RUN+="python /home/pi/mount.py" auch probiert hab ich RUN+="/usr/bin/python /home/pi/mount.py" und RUN+="sudo /usr/bin/python /home/pi/mount.py".


    Wenn ich es direkt mounten möchte, geht das auch nicht:

    RUN+="/bin/mount /dev/sda1 /home/pi/usb".

    Wo liegt da der Fehler?

  • Wo liegt da der Fehler?

    An der Syntax des mount Befehles. Siehe < man mount >, oder < mount -h >


    Allenfalls auch an den Dateirechten und/oder am Faktum, dass die zu mountende Partition nunmehr als /dev/sdb1, oder /dev/sdc1 angebunden wird.



    Servus !

    RTFM = Read The Factory Manual, oder so

  • OK, aber mit der UUID oder PARTUUID hab ich bisher noch keinen Erfolg.

    Ausgelesen mit blkid.

    Mein Udev Zeile sieht so aus:

    Code
    UUID=cff8e52e-96fb-43a4-98d9-a898b2869414, KERNEL=="sd?1", SYMLINK+="stick"


    Der Symlink ist aber leider nicht da.


    EDIT:

    Ich bekomme einfach nicht mein Python Script zum laufen. Das mit der ATTRS funktioniert ja jetzt gut (außer die UUID Eintragung), aber er führ einfach das Script nicht aus.

    Rechte sind auf 755.

    In der Console kann ich es ja starten mit "/usr/bin/python /home/pi/mount.py" und wird auch ausgeführt.

    Edited once, last by matze1 ().

  • Sorry, habe da was verwechselt, habe auf System V Linux erlernt.


    Wenn Du eine UDEV Regel erstellen willst, die nur von einem bestimmten Stick ein /dev/stick erstellt, musst Du die Vendor-ID und/oder Produkt-ID und/oder Seriennummer des USB-Sticks nehmen, wie sie bei < lsusb > bzw. < lsusb -v > z.B. angegeben wird. z.B.:


    KERNEL=="sd?1", SUBSYSTEMS=="usb", ATTRS(idVendor)=="0420", ATTRS(idProduct)=="1307", ATTRS(serial)=="110074973765", SYMLINK+="stick"


    Warum Du aber nicht über die fstab mit UUID mountest, weiß ich nicht.



    Servus !

    RTFM = Read The Factory Manual, oder so

  • Ja das hab ich jetzt hinbekommen wie ich oben schrieb, jetzt gehts nur noch um das "RUN", egal was ich mache, mein Script wird nicht ausgeführt (siehe mein letzten Beitrag).

    Der Symlink funktioniert, denn ich kann per /dev/stick mounten, also hängt es am "RUN".

  • Quote

    Woher weißt du das? Stürzt eventuell dein Skript ab?

    Wenn ich es per Hand starte, dann startet es ja, den gleichen Befehl hab ich ja in der "UDEV" drin.

    Oder hat das nichts zu sagen?

  • ACTION=="add" sorgt dafür, dass die Regel nur zutrifft, wenn das Gerät neu angeschlossen wird.
    RUN kann immer nur ein einzelner Befehl (mit Parametern) übergeben werden.


    Meine Glaskugel ist aber gleich ganz blind.


    Servus !

    RTFM = Read The Factory Manual, oder so

  • Wenn ich es per Hand starte, dann startet es ja, den gleichen Befehl hab ich ja in der "UDEV" drin.

    Oder hat das nichts zu sagen?

    Ja je nach Inhalt deines Pythonskriptes.

    Bsp. bei Verwendung von relativen Pfaden, oder wenn ein Modul nicht für den ausführenden Benutzer installiert ist. Da kann das z.B mit dem User Pi klappen, im Autostart/UDev Ausführung aber nicht mehr. Wie loggst du Fehlermeldungen?

    • Official Post

    Hallo,


    verpass dem Script ein Shebang und mach es ausführbar, dann kannst Du den Interpreter im RUN weglassen. Ich könnte mir vorstellen, dass es da schon Probleme gibt.


    Dem Punkt RUN kann immer nur ein einzelner Befehl (mit Parametern) übergeben werden. Allerdings lassen sich über mehrere RUN+="..."-Einträge mehrere Befehle hintereinander ausführen


    Sieh Dir am besten mal die ganze Seite an. https://wiki.ubuntuusers.de/udev/