Kto nie wie w ogóle co to udev, kiedy pojawił się w Linuksie i dlaczego zastąpił devfs, niech poczyta dokumentację systemu, Wikipedię czy inne źródło. Poniżej opiszę udev tylko w zakresie, w jakim postanowiłem go ja wykorzystać.
Od jakiegoś czasu bawię się cienkimi klientami. Teraz najczęściej U700 firmy Clientron. Brakuje mi tam możliwości podłączenia do konsoli za pomocą portu szeregowego, bo najzwyczajniej w świecie go nie ma. Jest USB i można wpiąć adapter. Niemniej uruchamiając getty przez inittab bez portu dostajemy masę śmieci na konsoli (respawning too fast: disabled for 5 minutes). Co zrobić, żeby getty uruchamiał się tylko wtedy, gdy port jest (czytaj: gdy wsadzimy adapter USB)? Z pomocą przychodzi udev.
Podczas podłączania urządzenia, demon udev przetwarza swoje reguły i postępuje zgodnie z tym co mu nakażemy. Standardowo nazywa urządzenia, ale może też wykonywać określone akcje. Decydujemy o wszystkim dzięki dopasowaniom i przypisaniom. Dla moich potrzeb stworzyłem taką regułę:
KERNEL=="ttyUSB*", SUBSYSTEM=="tty", ACTION=="add", RUN+="/sbin/agetty -L %k 38400 vt100"
Mówi ona, by dla każdego podłączanego urządzenia (ACTION=="add") urządzenia identyfikowanego przez jądro jako ttyUSB* (KERNEL=="ttyUSB*") z podsystemu tty (SUBSYSTEM=="tty") uruchomić agetty (RUN+="/sbin/agetty..."). %k w RUN wstawia tam nazwę urządzenia (np. ttyUSB0, ttyUSB1, itd.).
Uruchomić możemy dowolny program lub skrypt, pamiętając, by miał poprawny kod wyjścia, a w przypadku tego drugiego właściwy shebang.
Warto przejrzeć istniejące reguły i na nich się wzorować pisząc własne. Na początek też można pośledzić kominikaty demona (udevadm control --log-priority=info), żeby zobaczyć co w trawie piszczy i czemu nasze reguły nie działają.
Osobiście długo walczyłem z regułą operując na złym podsystemie – usb i usb-serial zamiast tty. Udało mi się to zrozumieć dzięki marrgol.
Od naszej fantazji zależy co się stanie jak podłączymy nowe urządzenie. U mnie, prócz adaptera, obsługiwana jest karta sieci bezprzewodowej (przeszukiwanie sieci w pobliżu) oraz pamięć aktualizująca moje oprogramowanie.
Zobacz także: