Udev-Regel für jedes USB-Speichergerät


10

Wie kann ich udevRegeln für jedes angeschlossene USB-Massenspeichergerät implementieren , nicht nur für ein bestimmtes? Was sollte geändert werden in idVendorund idProduct?

 ACTION=="add", SUBSYSTEM=="usb", SYSFS{idVendor}=="0204", SYSFS{idProduct}=="6025",
     RUN+="/home/workspace/bash_script.sh"

Antworten:


7

Ein Speichergerät befindet sich im blockSubsystem, daher sollten Sie SUBSYSTEM=="block"in Ihrer Regel Folgendes festlegen:

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", \
    RUN+="/path/to/script"

Wenn Sie verwenden systemd, können Sie systemdjedes Mal ein Gerät ausführen , wenn ein USB-Speichergerät hinzugefügt wird. Erstellen Sie die Einheitendatei, z /etc/systemd/system/my-usb-rule.service.

[Service]
Type=oneshot
ExecStart=/path/to/script

und die Regel, zB /etc/udev/rules.d/85-my-usb-rule.rules:

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", \
    ENV{SYSTEMD_WANTS}="my-usb-rule.service"

Jetzt udevwird my-usb-rule.serviceauf jedem USB-Speichergerät ein Add- Ereignis ausgelöst (das wiederum Ihr Skript ausführt) .


Vergessen Sie nicht, die Konfiguration neu zu laden, nachdem Sie die Regeln / Einheiten bearbeitet haben:

udevadm control --reload
systemctl daemon-reload

Wenn ich einen USB-Massenspeicher hinzufüge, möchte ich auf die darin enthaltenen Partitionen reagieren. Auf udev-Ebene kann ich Ereignisse von 4 Subsystemen sehen: usb, scsi, bdi und block (in dieser Reihenfolge). Die ersten drei sind unbrauchbar, da die Partition noch nicht bekannt ist. Das Blockereignis hat ID_BUS = scsi, nicht usb wie in Ihrem Codebeispiel. Ich sehe kein geeignetes Attribut im Blockereignis, das mir sagen würde, ob es sich um einen USB-Massenspeicher handelt oder nicht. (Untersuchung mit udevadm-Monitor und udevadm-Informationen). Es sei denn, ich könnte darauf vertrauen, dass ID_BUS = scsi vernünftigerweise nichts anderes als USB-Massenspeicher sein könnte.
Uwe Geuder

@UweGeuder - nichts hindert Sie daran, den Gerätenamen als Argument für Ihr Programm zu verwenden und basierend auf diesem Akt auf den Partitionen ...
don_crissti

Nun, in den USB-Ereignissen ist der Gerätename so etwas wie / dev / bus / usb / 002/040. Ich bin mir nicht sicher, was ich damit in meinem Programm anfangen soll. In den Block-Ereignissen lautet der Gerätename etwa / dev / sdb oder / dev / sdb1. Das ist was ich will, aber jetzt bin ich zurück zu dem Problem, dass ID_BUS = scsi. Ich bin noch ein bisschen weiter gekommen: Es gibt eine Regeldatei 80-udisk2, die eine Eigenschaft ID_DRIVE_THUMB hinzufügt. Nicht sicher, wie robust es ist, scheinen nur sehr wenige Anbieter aufgeführt zu sein. Meine Regeldatei hieß 70- *, daher stimmte meine / dev / sdb erwartungsgemäß nicht überein. Seltsamerweise stimmte / dev / sdb1 überein, obwohl meine Regel zuerst ausgeführt wird.
Uwe Geuder

1
Ah, ich stelle nur fest, dass die ursprüngliche Frage ein USB-Massenspeicherlaufwerk war. Das sollte mit der Regel funktionieren SUBSYSTEM=="block", SUBSYSTEMS=="usb"(beachten Sie den Unterschied zum S ). Ich bezweifle, dass es ENV{ID_BUS}=="usb"in der ursprünglichen Antwort immer funktionieren kann , da ich hier den Wert scsi sehe. Aber ich arbeite an einem etwas anderen Problem als ursprünglich gefragt, ich möchte einen USB-Stick (Pendrive), aber keine externen Laufwerke.
Uwe Geuder

1
Tatsächlich ist die böse Wahrheit, dass der ENV{ID_BUS}Wert nicht auf allen Systemen gleich ist. Gestern habe ich an einem älteren System mit udev 210 gearbeitet (glaube ich. Kann jetzt nicht überprüfen, da die Maschine nicht im Internet ist). Dort war der Wert scsi . Jetzt bin ich auf einer neueren Maschine mit udev 228 und der Wert ist usb . Für den gleichen USB-Stick trage ich ihn bei mir. (nicht sicher, ob die udev-Version hier der relevante Faktor ist, könnte auch der Kernel oder ein anderes Paket sein, das udev-Regeln installiert, z. B. udisks2) Dennoch SUBSYSTEM=="block", SUBSYSTEMS=="usb"(Anmerkung S ) ist möglicherweise portabel und sicher.
Uwe Geuder
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.