Scroll to navigation

UDEV(7) udev UDEV(7)

NAZWA

udev - dynamiczne zarządzanie urządzeniami

OPIS

udev udostępnia oprogramowaniu systemowemu zdarzenia urządzeń, zarządza uprawnieniami węzłów urządzeń i może tworzyć dodatkowe dowiązania symboliczne w katalogu /dev/ lub zmieniać nazwy interfejsów sieciowych. Jądro zwykle nadaje nieprzewidywalne nazwy urządzeń w kolejności ich wykrycia. Znaczące dowiązania symboliczne lub nazwy urządzeń sieciowych zapewniają stały sposób identyfikacji urządzeń na podstawie ich właściwości lub aktualnej konfiguracji.

Demon udev, systemd-udevd.service(8), otrzymuje zdarzenia urządzeń (uevent) bezpośrednio z jądra, gdy tylko z systemu dodawane lub usuwane jest urządzenie, albo zmianie ulega jego status. Gdy udev otrzyma zdarzenie urządzenia, dopasowuje swój skonfigurowany zestaw reguł do różnych atrybutów urządzenia, aby go zidentyfikować. Reguły mogą zapewniać dodatkowe informacje o urządzeniu, służące do przechowania w bazie danych udev lub do tworzenia znaczących nazw dowiązań symbolicznych.

Wszelkie przetwarzane przez udev informacje o urządzeniach są przechowywane w bazie danych udev i wysyłane do potencjalnych subskrybentów zdarzeń. Dostęp do wszelkich przechowywanych danych i źródeł zdarzeń zapewnia biblioteka libudev.

PLIKI REGUŁ

Reguły udev są odczytywane z plików położonych w systemowych katalogach reguł /lib/udev/rules.d i /local/lib/udev/rules.d, ulotnych katalogów uruchomieniowych /run/udev/rules.d oraz lokalnego katalogu administracyjnego /etc/udev/rules.d. Wszystkie pliki reguł są sortowane i przetwarzane w kolejności leksykograficznej, bez względu na katalog, z którego pochodzą. Jednak pliki o identycznych nazwach zastępują się. Pliki z /etc/ mają najwyższy priorytet, pliki w /run/ mają pierwszeństwo nad plikami o tej samej nazwie w /usr/. Można w ten sposób przesłonić dostarczane przez system pliki reguł plikiem lokalnym, jeśli będzie taka potrzeba; dowiązanie symboliczne w /etc/ o tej samej nazwie jak plik reguł w /usr/lib/, wskazujące na /dev/null, zupełnie wyłączy dany plik reguł. Pliki reguł muszą kończyć się rozszerzeniem .rules; inne rozszerzenia są ignorowane.

Każdy wiersz w pliku reguł zawiera co najmniej jedną parę klucz-wartość. Wyjątkiem są puste wiersze i wiersze zaczynające się od znaku „#”, które są ignorowane. Występują dwa typy kluczy: dopasowujące i przypisujące. Jeśli wszystkie klucze dopasowujące pasują do swych wartości, reguła jest stosowana, a klucze przypisujące przypisują dane wartości.

Reguła dopasowująca może zmienić nazwę interfejsu sieciowego, dodać dowiązanie symboliczne wskazujące na węzeł urządzenia lub uruchomić podany program, w ramach obsługi zdarzenia.

Reguła składa się z listy jednego lub więcej wyrażeń klucz-operator-wartość, rozdzielonych przecinkiem. Każde wyrażenie daje różny efekt, w zależności od użytego klucza i operatora.

Operatory

"=="

Sprawdza równość (podany klucz ma określoną wartość).

"!="

Sprawdza nierówność (podany klucz nie ma określonej wartości lub podany klucz jest nieobecny).

"="

Przypisuje wartość do klucza. Klucze reprezentujące listę są resetowane i przypisywana jest tylko ta pojedyncza wartość.

"+="

Dodaje wartość do klucza utrzymującego listę wpisów.

"-="

Usuwa wartość z klucza utrzymującego listę wpisów.

":="

Nieodwołanie przypisuje wartość do klucza; późniejsze zmiany będą niemożliwe.

Wartości

Wartości są zapisywane jako łańcuchy ograniczone cudzysłowami ("łańcuch"). Aby w wartości umieścić cudzysłów (") należy go poprzedzić odwrotnym ukośnikiem (\"). Wszystkie inne wystąpienia ukośników, po których następują dowolne znaki, nie stanowią sekwencji specjalnych. Oznacza to, że "\t\n" jest traktowane jako cztery znaki: odwrotny ukośnik, małe t, odwrotny ukośnik, małe n.

Łańcuch można poprzedzić małą literą e (e"łańcuch\n"), aby oznaczyć go jako korzystający z sekwencji języka C, zob. Sekwencje specjalne w języku C[1]. Na przykład e"łańcuch\n" jest przetwarzany jako 8 znaków: 7 małych liter i znak nowego wiersza. Można w ten sposób zapisać znaki specjalne tam, gdzie wymaga ich sterownik jądra.

Proszę zauważyć, że w żadnym wariancie łańcucha, znak NUL nie jest dozwolony.

Klucze

Do dopasowania właściwości urządzenia można posłużyć się następującymi kluczami. Niektóre dopasują również właściwości urządzenia nadrzędnego w sysfs, a nie tylko urządzenia, które wygenerowało zdarzenie. Jeśli w pojedynczej regule poda się wiele kluczy, które dopasują urządzenie nadrzędne, wszystkie te klucze muszą dopasować jedno i to samo urządzenie nadrzędne.

ACTION

Dopasowuje nazwę akcji ze zdarzenia.

DEVPATH

Dopasowuje ścieżkę (devpath) urządzenia ze zdarzenia.

KERNEL

Dopasowuje nazwę urządzenia ze zdarzenia.

KERNELS

Wyszukuje ścieżkę (devpath) w górę, aby dopasować nazwę urządzenia.

NAME

Dopasowuje nazwę interfejsu sieciowego. Można go stosować po ustawieniu klucza NAME w jednej z wcześniejszych reguł.

SYMLINK

Dopasowuje nazwę dowiązania symbolicznego wskazującego na węzeł. Można go stosować po ustawieniu klucza SYMLINK w jednej z wcześniejszych reguł. Może występować wiele dowiązań; wystarczy dopasowanie jednego. Jeśli operatorem jest „!=”, token zwraca prawdę tylko, jeśli żadne dowiązanie nie będzie dopasowane.

SUBSYSTEM

Dopasowuje podsystem urządzenia ze zdarzenia.

SUBSYSTEMS

Wyszukuje ścieżkę (devpath) w górę, aby dopasować nazwę podsystemu urządzenia.

DRIVER

Dopasowuje nazwę sterownika urządzenia ze zdarzenia. Klucz ten należy ustawiać tylko w przypadku urządzeń, które są przypisane do sterownika w momencie wygenerowania zdarzenia.

DRIVERS

Wyszukuje ścieżkę (devpath) w górę, aby dopasować nazwę sterownika urządzenia.

ATTR{nazwa-pliku}

Dopasowuje wartość atrybutu sysfs urządzenia ze zdarzenia.

Końcowe odstępy w wartościach atrybutu są ignorowane, chyba że podana wartość dopasowania sama zawiera końcowe odstępy.

ATTRS{nazwa-pliku}

Wyszukuje ścieżkę (devpath) w górę, aby dopasować wartości atrybutu sysfs. Jeśli poda się wiele dopasowań ATTRS, wszystkie z nich muszą być dopasowane do tego samego urządzenia.

Końcowe odstępy w wartościach atrybutu są ignorowane, chyba że podana wartość dopasowania sama zawiera końcowe odstępy.

SYSCTL{parametr jądra}

Dopasowuje wartość parametru jądra.

ENV{klucz}

Dopasowuje wobec wartości właściwości urządzenia.

CONST{klucz}

Dopasowuje wobec stałej systemowej. Obsługiwane są następujące klucze:

"arch"

Architektura systemowa. Opis ConditionArchitecture= w podręczniku systemd.unit(5) zawiera możliwe wartości.

"virt"

Systemowe środowisko wirtualizacji. Możliwe wartości opisano w podręczniku systemd-detect-virt(1).

"cvm"

Systemowa technologia zabezpieczonej wirtualizacji (ang. confidential virtualization technology). Możliwe wartości opisano w podręczniku systemd-detect-virt(1).

Nieznane klucze nie będą dopasowane.

TAG

Dopasowuje wobec jednego ze znaczników urządzenia. Można go stosować po ustawieniu klucza TAG w jednej z wcześniejszych reguł. Może występować wiele znaczników; wystarczy dopasowanie jednego. Jeśli operatorem jest „!=”, token zwraca prawdę tylko, jeśli żaden znacznik nie będzie dopasowany.

TAGS

Wyszukuje ścieżkę (devpath) w górę, aby dopasować urządzenie z odpowiednim znacznikiem. Jeśli operatorem jest „!=”, token zwraca prawdę tylko, jeśli żaden znacznik nie będzie dopasowany.

TEST{ósemkowa maska trybu}

Sprawdza istnienie pliku. Jeśli to potrzebne, można podać ósemkową maskę pliku.

PROGRAM

Wykonuje program, aby określić czy istnieje dopasowanie; klucz jest prawdziwy, jeśli program powrócił z sukcesem. Właściwości urządzenia są udostępniane wykonywanemu programowi w środowisku. Standardowe wyjście programu jest dostępne w kluczu RESULT.

Można w ten sposób korzystać tylko z bardzo szybko wykonywanych zadań pierwszego planu. Więcej szczegółów w opisie RUN.

Proszę zauważyć, że w jednej regule można podać wiele kluczy PROGRAM, a „=”, „:=” i „+=” mają takie samo znaczenie jak „==”.

RESULT

Dopasowuje zwrócony łańcuch ostatniego wywołania PROGRAM. Klucz ten można zastosować w tej samej lub późniejszej regule, po wywołaniu PROGRAM.

Większość wzorców obsługuje dopasowanie wzorcami wieloznacznikowymi powłoki (glob) oraz wzorce alternatywne. Obsługiwane są następujące znaki specjalne:

"*"

Dopasowuje jeden lub więcej znaków.

"?"

Dopasowuje dowolny pojedynczy znak.

"[]"

Dopasowuje dowolny pojedynczy znak podany w nawiasach kwadratowych. Na przykład wzorzec "tty[SR]" dopasuje "ttyS" lub "ttyR". Za pomocą znaku „-” obsługiwane są również przedziały. Na przykład, aby dopasować przedział wszystkich cyfr, można użyć wzorca "[0-9]". Jeśli pierwszym znakiem za „[” będzie „!”, to dopasowane zostaną wszystkie znaki poza tymi, podanymi w nawiasach kwadratowych.

"|"

Rozdziela wzorce alternatywne. Na przykład wzorzec "abc|x*" dopasuje "abc" lub "x*".

Można przypisać następujące wartości kluczy:

NAME

Nazwa do użycia przez interfejs sieciowy. W podręczniku systemd.link(5) opisano mechanizm wyższego poziomu do ustawiania nazw interfejsów. Nazwa węzła urządzenia nie może być zmienione przez udev, można tworzyć jedynie dodatkowe dowiązania symboliczne.

SYMLINK

Nazwa dowiązania symbolicznego wskazującego na węzeł. Każda pasująca reguła dodaje tę wartość do listy dowiązań symbolicznych do utworzenia.

Zestaw znaków jakie mogą posłużyć do nazwania dowiązania symbolicznego jest ograniczony. Dozwolone znaki to „0-9A-Za-z#+-.:=@_/”, prawidłowe sekwencje znaku UTF-8 oraz kodowanie szesnastkowe „\x00”. Wszystkie pozostałe znaki są zastępowane znakiem „_”.

Można utworzyć wiele dowiązań symbolicznych, rozdzielając nazwy spacją. W przypadku, gdy wiele urządzeń rości sobie prawo do tej samej nazwy, dowiązanie zawsze wskazuje na urządzeń o najwyższym link_priority. Jeśli bieżące urządzenie zniknie, dowiązania są rozwiązywane ponownie i urządzenie z następnym najwyższym link_priority staje się właścicielem dowiązania. Jeśli nie poda się link_priority, kolejność urządzeń (oraz to, które z nich pozyska dowiązanie) jest niezdefiniowana.

Nazwy dowiązań nigdy nie mogą być w konflikcie z domyślnymi nazwami węzłów urządzeń jądra, ponieważ to doprowadziłoby to nieprzewidywalnego zachowania.

OWNER, GROUP, MODE

Uprawnienia węzła urządzenia. Każda podana wartość przesłania wkompilowaną wartość domyślną.

SECLABEL{moduł}

Stosuje podaną etykietę Linux Security Module do węzła urządzenia.

ATTR{klucz}

Wartość powinna być zapisana do atrybutu sysfs urządzenia ze zdarzenia.

SYSCTL{parametr jądra}

Wartość, jaka powinna być zapisana do parametru jądra.

ENV{klucz}

Ustawia wartość właściwości urządzenia. Nazwy właściwości zaczynające się od „.” nie są przechowywane w bazie danych ani nie są eksportowane do zdarzeń lub narzędzi zewnętrznych (uruchomionych na przykład przez pasujący klucz PROGRAM).

TAG

Dodaje znacznik do urządzenia. Służy do filtrowania zdarzeń dla użytkowników korzystających z funkcji monitorowania libudev lub do wyliczenia grupy urządzeń ze znacznikami. Implementacja może działać wydajnie tylko, jeśli do urządzenia dodano niewiele znaczników. Ma to być używane tylko w kontekście koniecznego filtrowania konkretnego urządzenia, a nie jako opcja do ogólnego zastosowania. Zbyt szerokie stosowanie może doprowadzić do nieefektywnej obsługi zdarzeń.

RUN{typ}

Określa program, jaki będzie wykonany po przetworzeniu wszystkich reguł dla zdarzenia. Przy „+=”, to przywołanie jest dodawane do listy, a z „=” lub „:=” zastępuje wcześniejszą zawartość listy. Proszę zauważyć, że opisane niżej typy „program” i „builtin” dzielą wspólną listę, zatem usunięcie listy za pomocą „:=” lub „=” wpływa na oba typy.

typem może być:

"program"

Wykonuje zewnętrzny program określony przypisaną wartością. Jeśli nie poda się ścieżki absolutnej, oczekuje się, że program będzie występował w /lib/udev; w innym przypadku konieczne jest podanie absolutnej ścieżki.

Jest to wartość domyślna, jeśli nie poda się typu.

"builtin"

Jak program, lecz korzysta z jednego z wbudowanych programów, zamiast z zewnętrznego.

Nazwa programu i kolejne argumenty są rozdzielone spację. Aby podać argumenty zawierające spacje, należy je ująć w pojedyncze cudzysłowy.

Można w ten sposób uruchamiać tylko bardzo szybkie zadania pierwszego planu. Uruchamianie procesu zdarzeń na dłuższy czas może zablokować wszelkie kolejne zdarzenia dla danego lub zależnego od niego urządzenia.

Proszę zauważyć, że uruchamianie programów, które uzyskują dostęp do sieci lub montują/odmontowują systemy plików nie jest dozwolone wewnątrz reguł udev, z powodu domyślnej piaskowicy, która jest wymuszona na systemd-udevd.service.

Uruchamianie demonów lub innych dłużej działających procesów nie jest dozwolone; procesy rozgałęzione, niezależnie od tego czy są oddzielone, są bezwarunkowo zabijane po zakończeniu obsługi zdarzenia. Aby aktywować dłużej działające procesy z poziomu reguł udev, należy zapewnić jednostkę usługi i wciągnąć ją z urządzenia udev za pomocą właściwości urządzenia SYSTEMD_WANTS. Więcej szczegółów w podręczniku systemd.device(5).

LABEL

Nazwa etykiety, do której może przeskoczyć GOTO.

GOTO

Przeskakuje do następnej etykiety LABEL z pasującą nazwą.

IMPORT{typ}

Importuje zbiór zmiennych jako właściwości urządzenia, w zależności od typu:

"program"

Wykonuje zewnętrzny program określony jako przypisana wartość i jeśli powróci on poprawnie, importuje jego wyjście, które musi być w formacie kluczy środowiska. Określenie ścieżki, rozdzielenie polecenia/argumentów i cytowania działa tak samo jak w RUN.

"builtin"

Podobnie do „program”, lecz korzysta z jednego z wbudowanych programów, zamiast z zewnętrznego.

"file"

Importuje plik tekstowy podany jako przypisana wartość, którego zawartość musi występować w formacie kluczy środowiska.

"db"

Importuje pojedynczą właściwość określoną jako przypisana wartość z bieżącej bazy danych urządzeń. Działa to tylko, jeśli baza danych została już wypełniona przez wcześniejsze zdarzenie.

"cmdline"

Importuje pojedynczą właściwość z wiersza poleceń jądra. W przypadku prostych flag, wartość właściwości jest ustawiana na „1”.

"parent"

Importuje przechowywane klucze z urządzenia nadrzędnego, odczytując wpis z bazy danych dla urządzenia nadrzędnego. Wartość przypisywana do IMPORT{parent} służy jako filtr nazw kluczy do zaimportowania (z tym samym dopasowywaniem wzorcem wieloznacznikowym - glob, jaki jest używany do porównań).

Można w ten sposób korzystać tylko z bardzo szybko wykonywanych zadań pierwszego planu. Więcej szczegółów w opisie RUN.

Proszę zauważyć, że w jednej regule można podać wiele kluczy IMPORT{}, a „=”, „:=” i „+=” mają takie samo działanie jak „==”. Klucz jest prawdziwy, jeśli import powiedzie się, chyba że jako operator zastosowane jest „!=”, co spowoduje, że klucz będzie prawdziwy, jeśli import zawiedzie.

OPTIONS

Opcje reguł i urządzeń:

link_priority=wartość

Określa priorytet tworzonych dowiązań symbolicznych. Urządzenia z wyższymi priorytami nadpisują istniejące dowiązania symboliczne innych urządzeń. Wartość domyślna to 0.

string_escape=none|replace

Przy wartości „replace”, następuje zastąpienie potencjalnie niebezpiecznych znaków w łańcuchach przypisywanych do NAME, SYMLINK i ENV{klucz}. Przy wartości „none”, zastępowanie nie jest przeprowadzane. Gdy wartość nie jest ustawiona, zastępowanie jest przeprowadzane dla NAME, SYMLINK, lecz nie dla ENV{key}. Domyślnie wartość nie jest ustawiona.

static_node=

Stosuje uprawnienia określone w tej regule do statycznych węzłów urządzeń o podanej nazwie. Dodatkowo, w przypadku każdego znacznika określonego w tej regule, tworzy dowiązanie symboliczne w katalogu /run/udev/static_node-tags/znacznik wskazujące na statyczny węzeł urządzenia o podanej nazwie. Tworzenie statycznych węzłów urządzeń jest przeprowadzane przez systemd-tmpfiles, przed uruchomieniem systemd-udevd. Węzły statyczne mogą nie posiadać odpowiadającego urządzenia jądra; służą do wyzwolenia automatycznego ładowania modułów jądra, gdy uzyskiwany jest do nich dostęp.

watch

Obserwuje węzeł urządzenia za pomocą inotify; gdy węzeł jest zamykany po jego otwarciu do zapisu, tworzony jest uevent zmiany.

nowatch

Wyłącza obserwowanie węzła urządzenia za pomocą inotify.

db_persist

Ustawia flagę (bit lepkości) na wpisie bazy danych urządzenia ze zdarzenia. Właściwości urządzeń są następnie przechowywane w bazie danych nawet, gdy wywołano udevadm info --cleanup-db. Opcja może być przydatna w określonych przypadkach (np. urządzenia Device Mapper) aby uzyskać trwały stan urządzenia przy przejściu z initrd.

log_level=poziom

Pobiera nazwę poziomu dziennika taką jak „debug” lub „info” albo specjalną wartość „reset”. Przy podaniu nazwy poziomu dziennika, maksymalny poziom dziennika jest zmieniany na ten poziom. Gdy ustawi się „reset”, to poprzednio podany poziom dziennika jest odwoływany. Domyślnie przyjmuje poziom dziennika od głównego procesu systemd-udevd.

Może być to przydatne przy debugowaniu zdarzeń dla określonych urządzeń. Proszę zauważyć, że dany poziom dziennika jest stosowany w momencie, gdy przetwarzany jest wiersz zawierający tę regułę. Zatem przy debugowaniu zaleca się podanie go we wcześniejszym miejscu np. w pierwszym wierszu 00-debug.rules.

Przykład debugowania przetwarzania uevent dla interfejsów sieciowych:

# /etc/udev/rules.d/00-debug-net.rules
SUBSYSTEM=="net", OPTIONS="log_level=debug"

Pola ENV, GROUP, MODE, NAME, OWNER, PROGRAM, RUN, SECLABEL i SYMLINK obsługują proste podstawianie łańcuchów. Podstawiania RUN są przeprowadzane po przetworzeniu wszystkich reguł, zaraz przed wykonaniem programu, pozwalając na korzystanie z właściwości urządzenia ustawionych przez wcześniejsze dopasowane reguły. We wszystkich innych polach, podstawiania są przeprowadzane, gdy przetwarzana jest dana pojedyncza reguła. Dostępne podstawiania to:

$kernel, %k

Nadana przez jądro nazwa tego urządzenia.

$number, %n

Nadany przez jądro numer tego urządzenia. Na przykład „sda3” ma numer jądra 3.

$devpath, %p

Ścieżka (devpath) urządzenia.

$id, %b

Nazwa urządzenia dopasowanego przy szukaniu w górę ścieżki (devpath) przy SUBSYSTEMS, KERNELS, DRIVERS i ATTRS.

$driver

Nazwa sterownika dopasowanego przy szukaniu w górę ścieżki (devpath) przy SUBSYSTEMS, KERNELS, DRIVERS i ATTRS.

$attr{plik}, %s{plik}

Wartość atrybutu sysfs odnalezionego na urządzeniu, dla którego dopasowano wszystkie klucze reguł. Jeśli pasujące urządzenie nie ma takiego atrybutu, a wcześniejsze testy KERNELS, SUBSYSTEMS, DRIVERS lub ATTRS wybrały urządzenie nadrzędne, to stosowany jest atrybut z tego urządzenia nadrzędnego.

Jeśli atrybutem jest dowiązanie symboliczne, jako wartość zwracany jest ostatni element celu dowiązania symbolicznego.

$env{klucz}, %E{klucz}

Wartość właściwości urządzenia.

$major, %M

Główny numer urządzenia jądra dla tego urządzenia.

$minor, %m

Poboczny numer urządzenia jądra dla tego urządzenia.

$result, %c

Łańcuch zwracany przez program zewnętrzny zażądany za pomocą PROGRAM. Można wybrać pojedynczą część łańcucha, rozdzieloną spacją, podając numer tej części jako atrybut „%c{N}”. Jeśli po liczbie wystąpi znak „+”, to dołączana jest ta część wraz z wszystkimi kolejnymi częściami łańcucha: "%c{N+}".

$parent, %P

Nazwa węzła urządzenia nadrzędnego.

$name

Bieżąca nazwa urządzenia. Jeśli nie została zmieniona regułą, jest to nazwa nadana przez jądro.

$links

Rozdzielona spacją lista bieżących dowiązań symbolicznych. Wartość jest ustawiana tylko przy zdarzeniu usunięcia lub gdy wcześniejsza reguła przypisała wartość.

$root, %r

Wartość udev_root.

$sys, %S

Punkt montowania sysfs.

$devnode, %N

Nazwa węzła urządzenia.

%%

Sam znak „%”.

$$

Sam znak „$”.

ZOBACZ TAKŻE

systemd-udevd.service(8), udevadm(8), systemd.link(5)

UWAGI

1.
Sekwencje specjalne języka C

TŁUMACZENIE

Tłumaczenie niniejszej strony podręcznika: Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.

systemd 254