Wyszukiwanie w witrynie

Jak używać Udev do wykrywania urządzeń i zarządzania nimi w systemie Linux


Udev (przestrzeń użytkownika /dev) to podsystem Linuksa służący do dynamicznego wykrywania urządzeń i zarządzania nimi, począwszy od wersji jądra 2.6. Jest to zamiennik devfs i hotplug.

Dynamicznie tworzy lub usuwa węzły urządzeń (interfejs sterownika urządzenia, który pojawia się w systemie plików tak, jakby był zwykłym plikiem przechowywanym w katalogu /dev) podczas rozruchu lub jeśli dodasz urządzenia do systemu lub usunąć je z systemu. Następnie propaguje informacje o urządzeniu lub zmianach jego stanu do przestrzeni użytkownika.

Jego funkcją jest 1) dostarczanie aplikacjom systemowym zdarzeń dotyczących urządzeń, 2) zarządzanie uprawnieniami węzłów urządzeń oraz 3) tworzenie przydatnych dowiązań symbolicznych w katalogu /dev w celu uzyskania dostępu do urządzeń, a nawet zmiana nazw interfejsów sieciowych .

Jedną z zalet udev jest to, że może używać trwałych nazw urządzeń, aby zagwarantować spójne nazewnictwo urządzeń po ponownym uruchomieniu, niezależnie od kolejności ich wykrywania. Ta funkcja jest przydatna, ponieważ jądro po prostu przypisuje nieprzewidywalne nazwy urządzeń na podstawie kolejności wykrywania.

W tym artykule dowiemy się, jak używać Udev do wykrywania urządzeń i zarządzania nimi w systemach Linux. Pamiętaj, że większość, jeśli nie wszystkie, głównego nurtu współczesnych dystrybucji Linuksa, zawiera Udev w ramach domyślnej instalacji.

Naucz się podstaw Udev w systemie Linux

Demon udev, systemd-udevd (lub systemd-udevd.service) komunikuje się z jądrem i odbiera uevents urządzenia > bezpośrednio z niego za każdym razem, gdy dodasz, usuniesz urządzenie z systemu lub urządzenie zmieni swój stan.

Udev opiera się na regułach – jego zasady są elastyczne i bardzo potężne. Każde otrzymane zdarzenie urządzenia jest porównywane z zestawem reguł odczytanych z plików znajdujących się w /lib/udev/rules.d i /run/udev/rules.d.

Możesz zapisywać pliki reguł niestandardowych w katalogu /etc/udev/rules.d/ (pliki powinny kończyć się rozszerzeniem .rules), aby przetwarzać urządzenie. Należy pamiętać, że pliki reguł w tym katalogu mają najwyższy priorytet.

Aby utworzyć plik węzła urządzenia, udev musi zidentyfikować urządzenie na podstawie określonych atrybutów, takich jak etykieta, numer seryjny, używany numer główny i pomocniczy, numer urządzenia magistrali itp. wiele więcej. Informacje te są eksportowane przez system plików sysfs.

Za każdym razem, gdy podłączasz urządzenie do systemu, jądro je wykrywa i inicjuje, a w katalogu /sys/ tworzony jest katalog z nazwą urządzenia, w którym przechowywane są atrybuty urządzenia.

Główny plik konfiguracyjny udev to /etc/udev/udev.conf, a do kontrolowania zachowania demona udev w czasie wykonywania można użyć narzędzia udevadm.

Aby wyświetlić odebrane zdarzenia jądra (uevents) i zdarzenia udev (które udev wysyła po przetworzeniu reguły), uruchom udevadm za pomocą polecenia monitora. Następnie podłącz urządzenie do swojego systemu i obserwuj z poziomu terminala, jak obsługiwane jest zdarzenie urządzenia.

Poniższy zrzut ekranu przedstawia fragment zdarzenia ADD po podłączeniu dysku flash USB do systemu testowego:

udevadm monitor 

Aby znaleźć nazwę przypisaną do Twojego dysku USB, użyj narzędzia lsblk, które odczytuje system plików sysfs i udev db w celu zebrania informacji o przetwarzanych urządzeniach.

 
lsblk

Z wyniku poprzedniego polecenia wynika, że dysk USB ma nazwę sdb1 (ścieżka bezwzględna powinna mieć postać /dev/sdb1). Aby zapytać o atrybuty urządzenia z bazy danych udev, użyj polecenie info.

udevadm info /dev/sdb1

Jak pracować z regułami Udev w systemie Linux

W tej sekcji pokrótce omówimy, jak pisać reguły udev. Reguła składa się z rozdzielonej przecinkami listy zawierającej jedną lub więcej par klucz-wartość. Reguły umożliwiają między innymi zmianę nazwy węzła urządzenia z domyślnej, modyfikację uprawnień i własności węzła urządzenia, wyzwalanie wykonania programu lub skryptu podczas tworzenia lub usuwania węzła urządzenia.

Napiszemy prostą regułę uruchamiającą skrypt po dodaniu urządzenia USB i po jego usunięciu z działającego systemu.

Zacznijmy od utworzenia dwóch skryptów:

sudo vim /bin/device_added.sh

Dodaj następujące wiersze do skryptu device_added.sh.

#!/bin/bash
echo "USB device added at $(date)" >>/tmp/scripts.log

Otwórz drugi skrypt.

sudo vim /bin/device_removed.sh

Następnie dodaj poniższe linie do skryptu device_removed.sh.

#!/bin/bash
echo "USB device removed  at $(date)" >>/tmp/scripts.log

Zapisz pliki, zamknij i spraw, aby oba skrypty były wykonywalne.

sudo chmod +x /bin/device_added.sh
sudo chmod +x /bin/device_removed.sh

Następnie utwórzmy regułę wyzwalającą wykonanie powyższych skryptów o nazwie /etc/udev/rules.d/80-test.rules.

vim /etc/udev/rules.d/80-test.rules

Dodaj w nim te dwie następujące reguły.

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device",  RUN+="/bin/device_added.sh"
SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_removed.sh"

Gdzie :

  • "==": jest operatorem porównywania pod kątem równości.
  • "+=": to operator dodający wartość do klucza przechowującego listę wpisów.
  • SUBSYSTEM: odpowiada podsystemowi urządzenia eventowego.
  • AKCJA: odpowiada nazwie akcji zdarzenia.
  • ENV{DEVTYPE: dopasowuje wartość właściwości urządzenia, w tym przypadku typ urządzenia.
  • URUCHOM: określa program lub skrypt do wykonania w ramach obsługi zdarzenia.

Zapisz plik i zamknij go. Następnie jako root powiedz systemd-udevd, aby ponownie załadował pliki reguł (spowoduje to również ponowne załadowanie innych baz danych, takich jak indeks modułów jądra), uruchamiając.

sudo udevadm control --reload

Teraz podłącz dysk USB do swojego komputera i sprawdź, czy skrypt device_added.sh został wykonany. Przede wszystkim należy utworzyć plik scripts.log w katalogu /tmp.

ls -l /tmp/scripts.log

Następnie plik powinien zawierać wpis taki jak „Urządzenie USB usunięte o godzinie_data”, jak pokazano na zrzucie ekranu.

cat /tmp/scripts.log

Aby uzyskać więcej informacji na temat pisania reguł udev i zarządzania udev, zapoznaj się odpowiednio z wpisami podręcznika udev i udevadm, uruchamiając:

man udev
man udevadm
Streszczenie

Udev to niezwykły menedżer urządzeń, który zapewnia dynamiczny sposób konfigurowania węzłów urządzeń w katalogu /dev. Zapewnia, że urządzenia zostaną skonfigurowane natychmiast po ich podłączeniu i wykryciu. Propaguje informację o przetwarzanym urządzeniu lub zmianach jego stanu do przestrzeni użytkownika.

Jeśli masz jakieś pytania lub przemyślenia, którymi chcesz się podzielić na ten temat, skorzystaj z formularza opinii.