Udev/ru

udev is the device manager for the Linux kernel. It manages device nodes in and handles all user space actions when adding or removing devices. Readers of this article should also look at eudev, a fork of udev.

Каталог /dev
When Linux users talk about the hardware on their system in the vicinity of people who believe Linux is some sort of virus or brand of coffee, the use of "slash dev slash foo" will return strange looks for sure. But for the fortunate user (and that includes the reader of this article) using is just a fast way of referring to the primary master SATA, first partition. That's pretty easy, right?

Most Linux users know what a device file is. Some even know why device files have special numbers. Take a close look at device list when ls -l is issued in the folder. What users take for granted is that the primary SATA disk is referred to as Some users might not see it this way, but this is a flaw by design.

Think about hotpluggable devices like USB, IEEE1394, hot-swappable PCI, etc. What is the first device? And for how long? What will the other devices be named when the first one disappears? How will that affect ongoing transactions? Wouldn't it be fun that a printing job is suddenly moved from a super-new laser printer to an almost-dead matrix printer because someone's mom decided to pull the plug of the laser printer which just so happened to be the first printer?

Enter udev. The goals of the udev project are both interesting and needed. Udev:


 * Runs in userspace;
 * Dynamically creates and removes device files;
 * Provides consistent naming;
 * Provides a userspace application program interface (API).

Every time a change happens within the device structure, the kernel emits a uevent which gets picked up by udev. udev then follows the rules as declared in the, and  directories. Based on the information contained within the uevent, it finds the rule or rules it needs to trigger and performs the required actions. These actions can be creating or deleting device files, but can also trigger the loading of particular firmware files into kernel memory.

Ядро
udev requires the following kernel options:

Программное обеспечение
Portage knows the global USE flag  for enabling support for udev in other packages. Enabling this USE flag (default in all Linux profiles) will pull in automatically:

After setting this update the system so the changes take effect:

Запуск как сервис
To start udev at boot time, add it to the sysinit runlevel. This can be done by issuing the following command with root privileges:

Правила
udev provides a set of rules that match against exported values of uevents (events sent by the kernel) and properties of the discovered device. A matching rule will possibly name and create a device node and run configured programs to setup and configure the device.

The rule definitions are stored in two locations:


 * 1)  - Rules in this directory are installed by certain packages, they generally should not be changed by users;
 * 2)  - This folder is for end-user specified rules. Any new rules should be added in this directory;

In these directories, multiple rule files (with suffix ) are traversed in alphanumerical order. Inside the rules files, udev will find expressions that might match a uevent together with the state to match (is the uevent because a device is added or removed) and the command to execute.

The event matching is based on information such as:


 * The SUBSYSTEM of the uevent (for which type of device is the uevent fired);
 * The ACTION that is taken (add, change or remove);
 * One or more attributes (through ATTR or ATTRS), such as the device class, vendor or other device information;
 * The kernel-provided name (through KERNEL), such as sd* (for SCSI/SATA disks) or input* (for input devices such as mice and keyboards);
 * One or more environment settings (through ENV), used to send information between multiple rules.

Based on this information, the rule can then state if:


 * 1) Some information needs to be shared with later events (through environment variables)
 * 2) Links need to be created in
 * 3) Commands need to be executed

Udev does this for every rule that matches (it does not stop after the first match) to allow a flexible device management approach.

Постоянные имена устройств
Ядро определяет устройства асинхронно, а udev зеркалирует файловую систему sysfs ядра так, чтобы устройствам были даны названия и номера в порядке их определения. Так что, по умолчанию udev не дает постоянных имен устройств. Однако существуют механизмы для того, чтобы этого добиться (для некоторых классов устройств).


 * Udev creates for storage devices additional symlinks based on the device's ID, label, UUID and path. See the directory. So instead of using e.g. the device file  use the file.


 * То же самое для устройств ввода в каталоге.


 * Using custom rules enablers users to create their own device files.

Использование
Некоторые полезные команды следующие:


 * Показать все сообщения о заданном файле устройства:


 * Мониторинг активности udev:

Смотри man страницу udevadm для более детальной информации.

Логгинг сообщений монитора
To log all message when udevadm monitor is ran modify the following configuration file:

It will create the new log file located at

Режим отладки
Enabling debug mode will output more log messages:

Установите приоритет логгинга

The log file will be created but no messages will be logged to it. The most recent versions of udev will log all messages to dmesg.

Отсутствующие файлы устройств и
Some udev versions need the and  files in order to work properly, but can not create them on their own. To manually create these files for udev run the following commands with root privileges:

Сетевая карта определена как eth0, но изменилась на eth1
Those having dual network cards on their motherboards may run into a situation where ifconfig may show no eth0 or eth1. dmesg</tt> may show their NIC detected as eth0, and later moved to eth1. Performing a ifconfig -a</tt> will also show the NIC as eth1. This is caused by using the kernel assigned names in the first place. Users should write custom rules like to use free names like lan0 or wireless0 or use predictable interface names (which have been enabled by default since udev version 197).

Также, помните, что нужно удалить старые файлы, оставшиеся от старых версий udev:

External resources

 * udev source code