Udev je správce zařízení pro linuxové jádro. Udev dynamicky vytváří nebo odstraňuje soubory uzlů zařízení při spouštění v adresáři /dev pro všechny typy zařízení. Udev je nyní součástí systemd, jak můžete vidět zobrazením názvů souborů „udev“, které jsou součástí balíčku systemd RPM.
# rpm -ql systemd | grep udev /etc/udev /etc/udev/hwdb.bin /etc/udev/rules.d /etc/udev/udev.conf /usr/bin/udevadm ...
Démon Udev, systemd-udevd , přijímá ueventy zařízení přímo z jádra, kdykoli je zařízení přidáno nebo odebráno ze systému. Pro každou událost systemd-udevd provede odpovídající instrukce specifikované v pravidlech Udev.
Názvy souborů zařízení se mohou změnit, když jsou disky odebrány ze systému z důvodu selhání. Zařízení jsou například při spouštění pojmenována /dev/sda, /dev/sdb a /dev/sdc. Ale při příštím restartu /dev/sdb selže a to, co bylo dříve /dev/sdc, se jmenuje /dev/sdb. Všechny konfigurační odkazy na /dev/sdb nyní obsahují obsah, na který původně odkazoval /dev/sdc.
Řešením, jak se vyhnout tomuto typu situace, je zaručit konzistentní názvy zařízení prostřednictvím restartování. Udev můžete nakonfigurovat tak, aby vytvářel trvalá jména a používal tato jména v tabulce připojení systému souborů, /etc/fstab, nebo jako argument příkazu mount.
Soubory a adresáře pravidel Udev
Pravidla Udev určují, jak identifikovat zařízení a jak jim přiřadit název, který je trvalý po restartování nebo výměně disku. Když Udev přijme událost zařízení, porovná nakonfigurovaná pravidla s atributy zařízení v sysfs, aby identifikoval zařízení. Pravidla mohou také specifikovat další programy, které se mají spustit jako součást zpracování událostí zařízení.
Soubory pravidel Udev jsou umístěny v následujících adresářích:
- /lib/udev/rules.d/ – Výchozí adresář pravidel
- /etc/udev/rules.d/ – Adresář vlastních pravidel. Tato pravidla mají přednost.
Soubory pravidel musí mít jedinečné názvy. Soubory v adresáři vlastních pravidel přepíší soubory se stejným názvem ve výchozím adresáři pravidel. Soubory pravidel jsou tříděny a zpracovávány v lexikálním pořadí. Následuje částečný seznam souborů pravidel z výchozího a vlastního adresáře pravidel:
# ls -l /lib/udev/rules.d/ total 348 -r--r--r--. 1 root root 7266 Aug 5 2017 10-dm.rules -r--r--r--. 1 root root 2454 Aug 5 2017 11-dm-lvm.rules -rw-r--r--. 1 root root 2865 Jan 25 16:05 11-dm-mpath.rules -r--r--r--. 1 root root 1499 Aug 5 2017 13-dm-disk.rules -rw-r--r--. 1 root root 553 Aug 6 2017 39-usbmuxd.rules -rw-r--r--. 1 root root 1622 Mar 7 13:27 40-redhat.rules ...
# ls -l /etc/udev/rules.d/ total 8 -rw-r--r--. 1 root root 709 Aug 4 2017 70-persistent-ipoib.rules -rw-r--r--. 1 root root 96 Apr 21 05:09 70-persistent-net.rules lrwxrwxrwx. 1 root root 9 Sep 29 2014 80-net-name-slot.rules -> /dev/null
Vzorová pravidla Udev
Níže uvedený příklad obsahuje vybrané položky z /lib/udev/rules.d/50-udev-default.rules soubor. Tento soubor pravidel obsahuje více než 60 položek.
# cat /lib/udev/rules.d/50-udev-default.rules # do not edit this file, it will be overwritten on update SUBSYSTEM=="virtio-ports", KERNEL=="vport*", ATTR{name}=="?*", SYMLINK+="virtio-ports/$attr{name}" # select "system RTC" or just use the first one SUBSYSTEM=="rtc", ATTR{hctosys}=="1", SYMLINK+="rtc" SUBSYSTEM=="rtc", KERNEL=="rtc0", SYMLINK+="rtc", OPTIONS+="link_priority=-100" SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb" SUBSYSTEM=="input", ENV{ID_INPUT}=="", IMPORT{builtin}="input_id" ENV{MODALIAS}!="", IMPORT{builtin}="hwdb --subsystem=$env{SUBSYSTEM}" ACTION!="add", GOTO="default_permissions_end" SUBSYSTEM=="tty", KERNEL=="ptmx", GROUP="tty", MODE="0666" SUBSYSTEM=="tty", KERNEL=="tty", GROUP="tty", MODE="0666" SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0620" SUBSYSTEM=="tty", KERNEL=="sclp_line[0-9]*", GROUP="tty", MODE="0620" SUBSYSTEM=="tty", KERNEL=="ttysclp[0-9]*", GROUP="tty", MODE="0620" ....
Vybrané položky pomáhají při popisu syntaxe souborů pravidel.
1. Komentáře začínají znakem #.
2. Každý řádek bez komentáře v souboru pravidel se skládá ze seznamu jednoho nebo více párů klíč–hodnota oddělených čárkou. Existují dva typy klíčů:
- Klíče shody
- Klíče přiřazení
3. Pokud všechny klíče shody odpovídají své příslušné hodnotě, pravidlo se použije a klíčům přiřazení se přiřadí zadaná hodnota. Každý klíč má odlišnou funkci v závislosti na operátorovi. Platné operátory jsou:
- == :Porovnejte pro rovnost
- != :Porovnání pro nerovnost
- = :Přiřazení hodnoty ke klíči
- += :Přidá hodnotu k aktuálním hodnotám klíče
- := :Přiřaďte klíči konečnou hodnotu. Zakázat jakékoli pozdější změny podle jakýchkoli pozdějších pravidel.
4. V pravidlech Udev je podporováno také porovnávání vzorů ve stylu shellu (*, ?, []).
Klíče shody
Následující názvy klíčů se používají k porovnání s vlastnostmi zařízení. Některé klíče se také shodují s vlastnostmi nadřazených zařízení v sysfs, a nikoli pouze se zařízením, které událost vygenerovalo. Pokud je v jednom pravidle specifikováno více klíčů, musí se všechny tyto klíče shodovat.
- AKCE :Shodujte se s názvem akce události.
- DEVPATH :Porovnejte cestu devpath zařízení události.
- JÁDRO :Shodujte se s názvem zařízení události.
- NAME :Shoduje se s názvem síťového rozhraní. Lze jej použít, pokud byl klíč NAME nastaven v některém z předchozích pravidel.
- SYMLINK :Shodujte se s názvem symbolického odkazu, který cílí na uzel. Lze jej použít, pokud byl v některém z předchozích pravidel nastaven klíč SYMLINK. Může existovat více symbolických odkazů, ale musí se shodovat pouze jeden.
- SUBSYSTÉM :Shoduje se se subsystémem zařízení události.
- TEST{maska osmičkového režimu :Otestujte existenci souboru. Můžete zadat masku osmičkového režimu.
Mezi další klíče shody patří DRIVER, ATTR{název souboru}, JÁDRA, SUBSYSTÉMY, DRIVERS, ATTRS{název souboru}, TAGS, ENV{klíč}, TAG, PROGRAM a VÝSLEDEK.
Klíče přiřazení
Následující klíče mohou mít přiřazené hodnoty:
- NAME – Název, který se má použít pro síťové rozhraní. Název uzlu zařízení nemůže Udev změnit, lze vytvořit pouze další symbolické odkazy.
- SYMLINK – Název symbolického odkazu, který cílí na uzel
- VLASTNÍK, SKUPINA, REŽIM – Oprávnění pro uzel zařízení
- MOŽNOSTI – Možnosti pravidel a zařízení. Možnost ignore_remove použitá v příkladu znamená „Neodstraňujte uzel zařízení, když zařízení zmizí.“
Mezi další klíče přiřazení patří ATTR{klíč}, ENV{klíč}, TAG, RUN{type}, LABEL, GOTO, IMPORT{type}, WAIT_FOR a OPTIONS.
Náhrady řetězců
Klávesy NAME, SYMLINK, PROGRAM, OWNER, GROUP, MODE a RUN podporují mnoho substitucí řetězců podobných printf. Náhrady použité v příkladu jsou:
- %M – Hlavní číslo jádra zařízení
- %m – Vedlejší číslo jádra zařízení
Jsou podporovány další substituce řetězců. Všechny podporované substituce a podrobnosti o dalších klíčích shody, dalších klíčích přiřazení a dalších možnostech pravidel a zařízení najdete na manuálové stránce udev.
Nástroj udevadm
Nástroj udevadm je nástroj pro správu uživatelského prostoru pro Udev. Kromě jiných funkcí můžete použít udevadm k dotazování sysfs a získání atributů zařízení, které vám pomohou při vytváření pravidel Udev, která odpovídají zařízení. Zobrazení využití udevadm:
# udevadm --help udevadm [--help] [--version] [--debug] COMMAND [COMMAND OPTIONS] Send control commands or test the device manager. Commands: info Query sysfs or the udev database trigger Request events from the kernel settle Wait for pending udev events control Control the udev daemon monitor Listen to kernel and udev events test Test an event run test-builtin Test a built-in command
Můžete také získat použití pro každý z příkazů udevadm. Chcete-li například získat nápovědu k použití příkazu info:
# udevadm info --help udevadm info [OPTIONS] [DEVPATH|FILE] Query sysfs or the udev database. -h --help Print this message --version Print version of the program -q --query=TYPE Query device information: name Name of device node symlink Pointing to node path sysfs device path property The device properties all All values -p --path=SYSPATH sysfs device path used for query or attribute walk -n --name=NAME Node or symlink name used for query or attribute walk -r --root Prepend dev directory to path names -a --attribute-walk Print all key matches walking along the chain of parent devices -d --device-id-of-file=FILE Print major:minor of device containing this file -x --export Export key/value pairs -P --export-prefix Export the key name with a prefix -e --export-db Export the content of the udev database -c --cleanup-db Clean up the udev database
Příklad obslužného programu udevadm
Následuje několik příkladů. Chcete-li v databázi Udev zadat cestu k zařízení /dev/xvdd:
# udevadm info --query=path --name=/dev/xvdd /devices/vbd-5696/block/xvdd
Chcete-li se dotázat databáze Udev na všechny informace o zařízení pro /dev/xvda:
# udevadm info --query=all --name=/dev/xvda P: /devices/vbd-768/block/xvda N: xvda E: DEVNAME=/dev/xvda E: DEVPATH=/devices/vbd-768/block/xvda E: DEVTYPE=disk E: DM_MULTIPATH_TIMESTAMP=1524287355 E: ID_PART_TABLE_TYPE=dos E: MAJOR=202 E: MINOR=0 E: MPATH_SBIN_PATH=/sbin E: SUBSYSTEM=block E: TAGS=:systemd: E: USEC_INITIALIZED=476119
Chcete-li vytisknout všechny vlastnosti sysfs /dev/xvda, zadejte následující. Tyto vlastnosti lze použít v pravidlech Udev, aby odpovídaly zařízení. Vytiskne všechna zařízení v řetězci, až po kořen sysfs.
# udevadm info --attribute-walk --name=/dev/xvda Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device. looking at device '/devices/vbd-768/block/xvda': KERNEL=="xvda" SUBSYSTEM=="block" DRIVER=="" ATTR{ro}=="0" ATTR{size}=="41943040" ATTR{stat}==" 16775 4 686095 36372 2953 313 203104 42044 0 19603 78392" ATTR{range}=="16" ATTR{discard_alignment}=="0" ATTR{ext_range}=="16" ATTR{alignment_offset}=="0" ATTR{badblocks}=="" ATTR{inflight}==" 0 0" ATTR{removable}=="0" ATTR{capability}=="10" looking at parent device '/devices/vbd-768': KERNELS=="vbd-768" SUBSYSTEMS=="xen" DRIVERS=="vbd" ATTRS{devtype}=="vbd" ATTRS{nodename}=="device/vbd/768"
Vytvoření symbolického odkazu na uzel zařízení
Důležité je pořadí, v jakém se pravidla vyhodnocují. Při vytváření vlastních pravidel chcete, aby byla tato vyhodnocena před výchozími hodnotami. Protože se pravidla zpracovávají v lexikálním pořadí, vytvořte soubor pravidel s názvem souboru, jako je /etc/udev/rules.d/10-local.rules, aby byl zpracován jako první.
Následující pravidlo vytváří symbolický odkaz /dev/my_disk na uzel zařízení /dev/xvdd. Můžete vytvořit pravidlo Udev pro změnu názvu síťového rozhraní, ale název uzlu zařízení nemůže Udev změnit. Pro uzly zařízení lze vytvořit pouze další symbolické odkazy.
KERNEL=="xvdd", SUBSYSTEM=="block", SYMLINK="my_disk"
Spusťte udevadm trigger pro zpracování souborů pravidel:
# udevadm trigger
Symbolický odkaz nyní existuje.
# ls –l /dev/my* lrwxrwxrwx. ... /dev/my_disk -> xvdd
Odeberte soubor 10-local.rules a spusťte udevadm trigger k odstranění symbolického odkazu.