Reguła Udev pasująca do dowolnego urządzenia pamięci USB


10

Jak mogę wdrożyć udevreguły dla dowolnego podłączonego urządzenia pamięci masowej USB, a nie tylko dla konkretnego? Co należy zmienić w idVendori idProduct?

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

Odpowiedzi:


7

Urządzenie pamięci masowej znajduje się w blockpodsystemie, więc SUBSYSTEM=="block"w regule będzie potrzebne :

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

Jeśli używasz systemd, możesz uruchomić systemdurządzenie za każdym razem, gdy dodawane jest urządzenie pamięci USB. Utwórz plik jednostki, np . /etc/systemd/system/my-usb-rule.service:

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

i reguła, np . /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"

Teraz udevuruchomi się my-usb-rule.service(co z kolei wykona skrypt) na dowolnym zdarzeniu dodania urządzenia pamięci masowej USB .


Nie zapomnij ponownie załadować konfiguracji po edycji zasad / jednostek:

udevadm control --reload
systemctl daemon-reload

Kiedy dodam pamięć masową USB, chciałbym działać na zawartej w niej partycji. Na poziomie udev widzę zdarzenia z 4 podsystemów: usb, scsi, bdi i block (w tej kolejności). Pierwsze 3 z nich są bezużyteczne, ponieważ partycja nie jest jeszcze znana. Zdarzenie blokowe ma ID_BUS = scsi, a nie USB jak w twoim przykładzie kodu. Nie widzę żadnego odpowiedniego atrybutu w zdarzeniu blokowym, który powiedziałby mi, czy jest to pamięć masowa USB, czy nie. (Badanie przeprowadzono przy użyciu monitora udevadm i informacji udevadm). Chyba że mogłem ufać, że ID_BUS = scsi nie może być niczym innym jak pamięcią masową USB.
Uwe Geuder

@UweGeuder - nic nie stoi na przeszkodzie, abyś użył nazwy urządzenia jako argumentu do swojego programu i na podstawie tego aktu na partycjach ...
don_crissti

Cóż, w przypadku zdarzeń USB nazwa urządzenia to coś w rodzaju / dev / bus / usb / 002/040. Nie jestem pewien, co z tym zrobić w moim programie. W zdarzeniach Block nazwa urządzenia to coś w rodzaju / dev / sdb lub / dev / sdb1. Właśnie tego chcę, ale teraz wracam do problemu, że ID_BUS = scsi. Posunęłem się trochę dalej: istnieje plik reguł 80-udisk2, który dodaje właściwość ID_DRIVE_THUMB. Nie jestem pewien, jak solidny jest, wydaje się, że na liście jest niewielu dostawców. Mój plik reguł nazywał się 70- *, więc zgodnie z oczekiwaniami mój / dev / sdb nie pasował. Dziwnie dość, że / dev / sdb1 pasowało, chociaż moja reguła działa pierwsza.
Uwe Geuder,

1
Ach, zauważam, że pierwotne pytanie dotyczyło dowolnego napędu pamięci masowej USB. To powinno działać z regułą SUBSYSTEM=="block", SUBSYSTEMS=="usb"(zauważ różnicę z S ). Wątpię, aby zawsze działało ENV{ID_BUS}=="usb"w oryginalnej odpowiedzi, ponieważ widzę tutaj wartość scsi. Ale pracuję nad nieco innym problemem niż pierwotnie pytano, chcę mieć pamięć USB (pendrive), ale żadnych dysków zewnętrznych.
Uwe Geuder,

1
W rzeczywistości paskudna prawda jest taka, że ENV{ID_BUS}wartość nie jest taka sama we wszystkich systemach. Wczoraj pracowałem na starszym systemie z udev 210 (chyba. Nie mogę teraz sprawdzić, ponieważ maszyna nie jest w Internecie), tam była wartość scsi . Teraz jestem na nowszej maszynie z udev 228, a wartość to usb . W przypadku tej samej pamięci USB noszę ją ze sobą. (nie jestem pewien, czy odpowiednia jest tutaj wersja udev, może to być także jądro lub inny pakiet instalujący reguły udev, np. udisks2). Nadal SUBSYSTEM=="block", SUBSYSTEMS=="usb"(uwaga S ) może być przenośny i bezpieczny.
Uwe Geuder
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.