udev — dynamiczne zarządzanie urządzeniami
udev dynamicznie tworzy katalog urządzeń złożony tylko z plików
urządzeń rzeczywiście istniejących.
Tworzy lub usuwa węzły urządzeń w katalogu
/dev
lub zmienia nazwy interfejsów sieciowych.
Na ogół udev działa jako udevd(8) i otrzymuje zdarzenia UEVENT prosto od jądra, jeśli urządzenie zostało dodane lub usunięte z systemu.
Jeśli udev otrzyma zdarzenie urządzenia, to dla zidentyfikowania go dopasowuje jego reguły (określone w plikach konfiguracyjnych) do dostępnych atrybutów urządzenia dostarczonych przez sysfs. Reguły te mogą dostarczać dodatkowych informacji o urządzeniu, określać nazwę jego węzła lub nakazać demonowi udev uruchomienie dodatkowych poleceń jako część obsługi zdarzenia.
Pliki konfiguracyjne udev umieszczone są
w /etc/udev/
oraz /lib/udev/.
Puste ich linie oraz linie
zaczynające się od '#' są ignorowane.
udev szuka swojej głównej konfiguracji w pliku
/etc/udev/udev.conf.
Zawiera on zestaw zmiennych pozwalających użytkownikowi
nadpisywać domyślne wartości udev.
Następujące zmienne mogą być ustawione:
udev_root
Określa, gdzie umieścić węzły urządzeń
w systemie plików.
Domyślną wartością jest /dev.
udev_log
Poziom logowania. Prawidłowymi wartościami są
liczbowe wartości poziomów logowania syslog oraz
ich tekstowe odpowiedniki:
err,
info
oraz
debug.
Reguły udev czytane są z plików umieszczonych
w domyślnym katalogu reguł
/lib/udev/rules.d/,
systemowym katalogu reguł
/etc/udev/rules.d/
oraz tymczasowym /dev/.udev/rules.d/.
Wszystkie reguły są sortowane i przetwarzana w porządku alfabetycznym,
bez względu na to, z którego katalogu pochodzą.
Nazwy plików reguł powinny mieć niepowtarzalne nazwy,
w przeciwnym razie duplikaty są ignorowane.
Pliki z katalogu /etc/udev/rules.d/
mają przewagę nad plikami o tej samej nazwie
z katalogu /lib/udev/rules.d/.
Można to wykorzystać do zignorowania w razie potrzeby domyślnych reguł.
Każda linia w pliku reguł składa się z co najmniej jednej pary "klucz-wartość". Istnieją dwa rodzaje kluczy: dopasowujące oraz przypisujące. Jeśli w momencie otrzymania zdarzenia wszystkie podane dopasowujące klucze pasują do zdefiniowanych tam wartości, reguła zostaje zastosowana oraz wykonywane są przypisania z kluczy przypisujących.
Reguła dopasowująca może określać nazwę węzła urządzenia, dodać dowiązanie wskazujące na węzeł lub uruchomić wybrany program jako część obsługi zdarzenia. Jeśli nie znaleziono żadnej pasującej reguły, tworzony jest domyślny węzeł urządzenia.
Reguły mogą składać się z list jednej lub więcej lub więcej par "klucz-wartość" oddzielonych przecinkami. Każdy klucz opisuje dokładnie jedną operację, zależną od użytego operatora. Prawidłowymi wartościami są:
==
Sprawdzanie równości.
!=
Sprawdzanie różności.
=
Przypisanie wartości do klucza. Klucz reprezentujący listę wartości zostaje zredukowany do jednej określonej w tym przypisaniu.
+=
Poszerzenie istniejącej listy wartości klucza o zadaną.
:=
Ostateczne przypisanie wartości do klucza. Nie pozwala ono na późniejsze zmiany. Pozwala to zapobiegać dokonywaniu zmian przez późniejsze reguły.
Niżej zostaną podane nazwy kluczy mogące być użyte dla dopasowania właściwości urządzeń. Niektóre z kluczy mogą także dopasowywać właściwości urządzeń nadrzędnych w sysfs, a nie tylko urządzenia które wygenerowało zdarzenie. Jeśli w pojedynczej regule określonych jest wiele kluczy pasujących do nadrzędnego urządzenia, to urządzenie to musi być wskazane jednoznacznie (nie wolno dopasowywać do dwóch różnych nadrzędnych).
ACTION
Dopasowuje nazwę akcji zdarzenia.
DEVPATH
Dopasowuje ścieżkę urządzenia, którego zdarzenie zostało wyzwolone.
KERNEL
Dopasowuje nazwę urządzenia, którego zdarzenie zostało wyzwolone.
NAME
Dopasowuje nazwę węzła lub interfejs sieciowy. Można tego użyć, kiedy klucz NAME został ustawiony w jednej z poprzedzających reguł.
SUBSYSTEM
Dopasowuje podsystem urządzenia, którego zdarzenie zostało wyzwolone.
DRIVER
Dopasowuje nazwę sterownika urządzenia, którego zdarzenie zostało wyzwolone. Ustawiane tylko dla urządzeń powiązanych ze sterownikiem w momencie wyzwolenia zdarzenia.
ATTR{
nazwa_pliku
}
Dopasowuje wartości atrybutów sysfs urządzenia,
którego zdarzenie zostało wyzwolone.
Maksymalnie w jednej regule użyte może być
pięć kluczy ATTR.
Końcowy biały znak we wzorcu wartości atrybutu jest ignorowany,
jeśli nie występował na końcu dopasowywanej wartości.
Zależnie od typu operatora, klucz ten
jest także używany do ustawienia wartości atrybutu sysfs.
KERNELS
Przeszukuje w górę ścieżkę urządzenia dla dopasowania nazwy podanego lub nadrzędnego urządzenia.
SUBSYSTEMS
Przeszukuje w górę ścieżkę urządzenia dla dopasowania nazwy podanego lub nadrzędnego podsystemu.
DRIVERS
Przeszukuje w górę ścieżkę urządzenia dla dopasowania nazwy jego pasującej nazwy sterownika.
ATTRS{
nazwa_pliku
}
Przeszukuje w górę ścieżkę urządzenia dla
dopasowania nazwy jego pasującego atrybutu sysfs.
Na jedną regułę może przypadać
maksymalnie pięć kluczy ATTRS.
Końcowy biały znak we wzorcu wartości atrybutu jest ignorowany, jeśli
nie występował na końcu dopasowywanej wartości
(od tłum: warto zweryfikować tłumaczenie tego zdania lub oryginał).
ENV{
klucz
}
Dopasowuje wartość zmiennej środowiskowej.
Na jedną regułę może przypadać maksymalnie
pięć kluczy ENV.
Zależnie od operatora, klucz ten może
posłużyć również do wyeksportowania zmiennej do środowiska.
TEST{
maska ósemkowa
}
Sprawdza istnienie pliku. W razie potrzeby, można podać maskę w notacji ósemkowej.
PROGRAM
Wykonuje zewnętrzny program. Klucz ten jest prawdziwy, jeśli program zwrócił zerowy kod wyjścia. Dla wykonywanego programu udostępnione jest całe środowisko zdarzenia. Standardowe wyjście programu jest dostępne za pomocą klucza RESULT.
RESULT
Dopasowuje otrzymane wyjście programu wywołanego kluczem PROGRAM. Można to wykorzystać w tej samej regule po wywołaniu klucza PROGRAM lub w dowolnej późniejszej.
Większość pól obsługuje powłokowe wzorce dopasowania. Wspierane są następujące:
*
Dopasowuje dowolną liczbę znaków (także zerową).
?
Dopasowuje dowolny pojedynczy znak.
[]
Dopasowuje dowolny pojedynczy znak określony pomiędzy nawiasami. Przykładowo, wzorzec 'tty[SR]' dopasowuje 'ttyS' oraz 'ttyR'. Dopuszczalne jest podanie zakresu za pomocą znaku '-', np. [0-9] dla zakresu wszystkich liczb. Jeśli znakiem następującym po '[' jest '!', to pasować będzie każdy znak nie ujęty w nawiasie.
Wartości można przypisywać następującym regułom:
NAME
Nazwa węzła lub interfejsu sieciowego do stworzenia, która może być ustawiona. Co najwyżej jedna pasująca reguła z przypisaniem 'NAME=' jest skuteczna, następne takie są ignorowane.
SYMLINK
Nazwa dowiązania symbolicznego wskazującego na węzeł. Każda pasująca reguła może dodać taką wartość do listy dowiązań symbolicznych tego węzła. W jednym kluczu można określić wiele linków naraz, rozdzielając je spacją.
OWNER, GROUP, MODE
Uprawnienia węzła urządzenia. Każda określona tu wartość nadpisuje wkompilowane domyślne wartości.
ATTR{
klucz
}
Wartość, która powinna być zapisana jako atrybut sysfs w urządzeniu wywołującym zdarzenie. Przy odpowiednim operatorze klucz ten może być używany do dopasowania zadanej wartości.
ENV{
klucz
}
Eksportuje zmienną do środowiska. Przy odpowiednim operatorze klucz ten może być używany do dopasowania zadanej wartości zmiennej środowiskowej.
RUN
Dodaj program do listy programów mających być wykonanymi dla określonego urządzenia. Można tego używać dla bardzo krótkich zadań. Uruchomienie obsługi zdarzenia na długi czas może blokować obsługę dalszych zdarzeń dla tego lub zależnego urządzenia. Długo pracujące zadania potrzebują być natychmiast odłączone od obsługi zdarzenia (od tłum. zapewne to zdanie wymaga lepszej polskiej wersji i bez testów się nie obędzie ;)).
Jeśli podana wartość zaczyna się od
socket:
,
wszystkie bieżące wartości zdarzenia
zostaną przekazane do wskazanego gniazda
jako komunikat w takim formacie,
w jakim jądro wysyła zdarzenia UEVENT.
Jeśli pierwszym znakiem określonej ścieżki
jest '@', zostanie użyte gniazdo
z abstrakcyjnej przestrzeni nazw
zamiast istniejącego pliku gniazda.
ścieżka
LABEL
Etykieta, do której można skoczyć za pomocą
GOTO
.
GOTO
Skacze do najbliższej następnej etykiety LABEL o pasującej nazwie.
IMPORT{
typ
}
Importuje do środowiska zdarzenia zestaw zmiennych
zależnie od
typu
:
program
Wykonuje zewnętrzny program określony w przypisanej wartości i importuje jego wyjście, które musi być w formacie klucza przypisania zmiennej środowiskowej.
file
Importuje treść z określonego w wartości pliku tekstowego Treść musi być podana w formacie klucza przypisania zmiennej środowiskowej.
parent
Importuje przez odczyt bazy danych zgromadzone klucze
z nadrzędnego urządzenia.
Wartości przypisane do klucza IMPORT{parent}
użyte są jako filtr nazw kluczy do zaimportowania.
Filtr ten jest takim samym wzorcem dopasowania
jak przy porównaniach.
Jeśli nie podano żadnej z powyższych opcji,
udev dokona wyboru między
program a file
na podstawie bitu wykonywalności w prawach dostępu.
WAIT_FOR
Czekaj aż plik stanie się dostępny.
OPCJE
Opcje reguł i urządzeń:
last_rule
Zapobiega wykonaniu dalszych reguł spełniających to samo dopasowanie. Żadna z takich dalszych reguł nie odniesie rezultatu.
ignore_device
Zupełnie zignoruj to zdarzenie.
ignore_remove
Nie usuwaj węzła tego urządzenia w momencie zdarzenia usunięcia samego urządzenia. Może to być przydatnym obejściem problemów z nieprawidłowo działającymi sterownikami.
link_priority=
wartość
Określ priorytet tworzenia dowiązań. Urządzenia z określonym wyższym priorytetem nadpiszą istniejące dowiązania do węzłów innych urządzeń. Domyślną wartością jest 0.
all_partitions
Utwórz węzły urządzeń dla wszystkich dostępnych partycji urządzenia blokowego. Można tego użyć dla wymiennych nośników, kiedy zmiana nośnika nie jest wykryta.
event_timeout=
Liczba sekund, w których zdarzenie UDEV będzie czekało na zakończenie zadania, nim dokona samolikwidacji.
string_escape=
none|replace
Na ogół kontrolne lub potencjalne niebezpieczne znaki zastępowane są znakami używanymi w nazewnictwie urządzeń. W tej opcji można określić tryb zastępowania.
Pola
NAME,
SYMLINK,
PROGRAM,
OWNER,
GROUP,
MODE oraz
RUN
obsługują podstawienia łańcuchów w stylu printf.
Znaki formatujące pola
RUN
zastosowane są dopiero
po przetworzeniu wszystkich reguł
i bezpośrednio przed wykonaniem programu.
Pozwala to wykorzystać kompletne środowisko
za sprawą wcześniejszego dopasowania reguł.
W przypadku innych pól, podstawienia wykonywane są
w momencie przetwarzania pojedynczej reguły.
(od. tłum.: tłumaczenie zdań o momencie korzystania
z podstawień wymaga koniecznie
porównania z oryginalną wersją i rzeczywistym działaniem).
Dostępnymi podstawieniami są:
$kernel, %k
Nazwa urządzenia dana przez jądro.
$number, %n
Numer urządzenia dany przez jądro. Przykładowo, numerem 'sda3' jest '3'.
$devpath, %p
Ścieżka urządzenia.
$id, %b
Nazwa urządzenia dopasowanego podczas
szukania w górę ścieżki urządzenia dla opcji
SUBSYSTEMS, KERNELS, DRIVERS oraz ATTRS.
$driver
Nazwa sterownika urządzenia dopasowanego podczas
szukania w górę ścieżki urządzenia dla opcji
SUBSYSTEMS,
KERNELS,
DRIVERS oraz
ATTRS.
$attr{
file
}
,
%s{
file
}
Wartość atrybutu sysfs dla urządzenia, gdzie wszystkie klucze reguły zostały dopasowane. Jeśli dopasowane urządzenie nie posiada takiego atrybutu, następuje szukanie w górę łańcucha nadrzędnych urządzeń i użyty jest pierwszy dopasowany atrybut. Jeśli atrybutem jest dowiązanie (symlink), zwracany jest ostatni element z celu dowiązania.
$env{
key
}
,
%E{
key
}
Wartość zmiennej środowiskowej.
$major
,
%M
Numer główny urządzenia dany przez jądro.
$minor
,
%m
Numer podrzędny urządzenia dany przez jądro.
$result
,
%c
Łańcuch zwracany przez zewnętrzny program
wywołany kluczem PROGRAM.
Spacje w nim zawarte wyznaczają pola,
do których można odnosić się liczbowo.
N-te pole zwracane jest przez
%c{N}.
Jeśli po liczbie N następuje znak '+'
(%c{N}),
zwracany jest łańcuch zaczynający się polem o tym numerze i
zawierającym wszystkie następne pola.
$parent
,
%P
Nazwa węzła nadrzędnego urządzenia.
$name
Bieżąca nazwa węzła urządzenia. Jeśli nie została zmieniona przez którąś z reguł, jest to nazwa dana przez jądro.
$links
Bieżąca lista dowiązań oddzielonych spacją. Wartość ta jest ustawiona tylko, gdy wcześniejsza reguła przypisała wartość lub w momencie usuwania urządzenia.
$root
,
%r
Wartość zmiennej udev_root.
$sys
,
%S
Punkt montowania sysfs.
$tempnode
,
%N
Nazwa stworzonego tymczasowego węzła urządzenia umożliwiającego dostęp do urządzenia za pomocą zewnętrznego programu zanim zostanie stworzony docelowy węzeł.
%%
Dosłowny znak '%'.
$$
Dosłowny znak '$'.
Liczbę znaków do podstawienia można ograniczyć formatem długości. Dla przykładu, '%3s{file}' wstawi tylko pierwsze trzy znaki atrybutu sysfs.
Greg Kroah-Hartman
<greg@kroah.com>
i Kay Sievers
<kay.sievers@vrfy.org>
.
Sporo pomogli Dan Stekloff i wielu innych.
26.09.2008, Tomasz Nowiński
<
arctgx [at] tlen.pl
>
na podstawie podręcznika udev dla wersji 128.
Kilka zdań wymaga jeszcze solidnego sprawdzenia:
nie tylko zestawienia z oryginałem,
ale i zrobienia dobrych testów.