Jak debugować regułę udev (w /etc/udev/rules.d/…)

15

Tworzę nową podstawową zasadę

/etc/udev/rules.d/10-myrule.rules

zawierający:

KERNEL!="sdb*", GOTO="auto_mount_end"
ACTION=="add", RUN+="/usr/bin/mount /dev/sdb1 /media"
LABEL="auto_mount_end"

Zapisałem, uruchomiłem ponownie i włożyłem kartę SD (rozpoznane przez /dev/sdb1, widzę to za pomocą dmesg), ale nic się nie dzieje. Kiedy robię to ręcznie mount /dev/sdb1 /media, działa.

Jak mogę rozwiązać problem / debugować taką udevregułę?

Uwaga: używam ArchLinux, ale powinno być tak samo w przypadku każdej dystrybucji?

Basj
źródło
1
Zmień nazwę pliku na 99-myrule.rules...
jasonwryan
@jasonwryan: to samo: nic się nie dzieje. Jak rozwiązywać problemy z zasadą udev? Czy powinienem uruchomić go ręcznie (jak w tym przypadku?)
Basj
Czy systemdzmienia coś na normalne zachowanie udev?
Basj
1
spróbuj udevadm monitor, zobacz to i to
Aquarius Power
1
AFAIK nie trzeba ponownie uruchamiać, aby udev ponownie przeczytał zasady (patrz unix.stackexchange.com/a/39371/44760 ). Przeprowadziłem debugowanie udev (co w rzeczywistości nie jest najłatwiejszym zadaniem!) udevadm testI zweryfikowałem reguły przeciwko rzeczywistości udevadm info.
zagrimsan

Odpowiedzi:

11
  • 10-jak wspomniał Jasonwryan, używaj wysokiej numeracji (dobre lata 90-te). Więc rządzisz, nie zostanie zastąpiony przez inny.
  • Używaj minimalnych kluczy tak, jak naprawdę potrzebujesz. Przykład, !=i GOTO/ LABEL, zamiast tego użyj bezpośrednio==

    ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    
  • Twój cel miał sdb1ustaloną komendę, zminimalizuj dopasowanie w ciemno za pomocąKERNEL=="sdb1"

  • Przydaje mi się tworzenie reguły debugowania cienia, nazwałem cień, ponieważ zawsze zostawiam go w tym samym pliku, więc używam go, gdy go potrzebuję.

    ACTION=="add", KERNEL=="sdb*", RUN+="/bin/sh -c 'echo == >> /home/user/Desktop/udev-env.txt; env >> /home/user/Desktop/udev-env.txt'"
    #ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    

    Uwaga: udev-env.txt tworzony jest, a następnie reguła i tak jest uruchamiana. Linia==odpowiadająca jednemu pasującemu węzłowi. ENV zarejestrowany w tym pliku może być mieszanką 2 lub więcej węzłów, utworzonych prawie w tym samym czasie, jest tostdoutproblem buforowania.

  • Zastosowanie udevadm monitor -u, udevadm test ...a udevadm trigger ... do sprawdzenia, które przepisy przetworzone zdarzenia.

  • Wewnątrz skryptów zależy od ciebie, aby tworzył dziennik debugowania i przechwytywał nieudane polecenia, zapisując ich wartość zwrotną również stdouti stderrkomunikaty.

Aktualizacja:

  • Odniesienie: udev_237 - man udev (Ubuntu_18.04)

    RUN{type}

    Note that running programs that access the network or mount/unmount filesystems is not
    allowed inside of udev rules, due to the default sandbox that is enforced on
    systemd-udevd.service.
    
user.dz
źródło
1
Bardzo przydatne. udevadm test...Wydaje się, że kilka komentarzy pokazuje tylko zmienne środowiskowe, dzięki ATTRSczemu można użyć udevadm info $DEVICEtych innych ustawień.
Att Righ
1
W udevadm infozwrotach drzewo urządzeń należy uważać, aby odróżnić ustawienia urządzenia od jego urządzeń nadrzędnych (właściwości wydają się dziedziczone, jeśli nie zostaną zastąpione). W moim przypadku podsystem był nieprawidłowy.
Att Righ,
udevadm test "This program is for debugging only, it does not run any program specified by a RUN key. It may show incorrect results, because some values may be different, or not available at a simulation run."Czy nie ma sposobu, aby po prostu prześledzić, co się właściwie dzieje?
MarcH
@MarcH, możesz użyć udevadm monitor -udo sprawdzenia zdarzeń / warunków i udevadm trigger ...przetestowania ich działań.
user.dz
@MarcH, ale wewnątrz skryptów zależy od ciebie, aby dziennik debugowania i przechwytywanie nieudanych poleceń (poprzez zapisanie ich wartości zwracanej również komunikatów stdout i stderr).
user.dz
1

Myślę, że polecenie, którego tu szukasz, to udevadm. Użyjesz parametrów triggeri test, aby uruchomić ponowne skanowanie zdarzeń udev i odpowiednio przetestować określone zdarzenie.

Nauczyłem się tego na własnej skórze, kiedy wymyśliłem nowe urządzenie sieciowe w EL 7. Powodzenia!

Paweł
źródło
1
  1. Utwórz plik reguł udev

    sudo nano /etc/udev/rules.d/99-removable-sd.rules
    
  2. Dodaj regułę, która każe udiskom automatycznie ją zamontować

    SUBSYSTEM=="block", SUBSYSTEMS=="mmc", DRIVERS=="mmcblk", ATTRS{type}=="SD", ENV{UDISKS_AUTO}="1", ENV{UDISKS_SYSTEM}="0"
    

    ATTRS{type}=="SD" może nie być wymagane, jeśli używasz różnych typów.

  3. Załaduj ponownie reguły

    sudo udevadm control -R
    
  4. Wysuń, a następnie włóż z powrotem.

Odniesienie: Archlinux Wiki: Niektóre urządzenia, które powinny być traktowane jako wymienne, nie są

user.dz
źródło
0

Miałem ten sam problem z RASPBERRY PI 3 B +, możliwe, że powyższe polecenia mogą ci pomóc. Ale to mi NIE pomogło. Próbowałem wywołać skrypt po włożeniu urządzenia pamięci USB. Reguły nie są rejestrowane w syslog, więc bardzo trudno jest zrozumieć, która reguła zadziałała, a która reguła zawiodła.

Zrobiłem więc:

(1) Mój plik reguł utworzyłem w /etc/udev/rules.d/100-myrule.rules

(2) następnie uruchomiłem polecenie sudo /etc/init.d/udev restart

potem sprawdziłem, czy działa. Informacje mogą być przydatne lub nie, ale systemy plików są odczytywane tylko dla udev, dopóki nie zostanie wykonane polecenie at (2).

MSharq
źródło