Udev/ru

udev это менеджер устройств для ядра Linux. Он управляет файлами устройств в каталоге и обрабатывает все действия из пользовательского пространства при добавлении или удалении устройств. Читателям этой статьи следует также посмотреть на eudev форк udev.

Каталог /dev
Когда пользователи Linux разговаривают о начинке своих систем среди людей, полагающих, что Linux — это какой-то вид вируса или марка кофе, пользуясь оборотами вроде «слэш дев слэш что—нибудь» (/dev/foo), на них наверняка смотрят косо. Но для счастливчиков (естественно, включая читающих эту статью), — просто быстрый способ сослаться на первый раздел диска SATA на первичном канале. Это довольно легко, не так ли?

Большинство пользователей Linux знают, что такое файл устройства. Некоторые даже знают, почему рядом с ними видны специальные числа. Внимательно посмотрите на список устройств запустив  в каталоге. Но примем за данность, что первичный ведущий диск IDE называется. У некоторых может быть и не так, но это всего лишь пример.

Представим себе устройства «горячей замены» вроде USB, IEEE1394, PCI с возможностью горячей замены и т.д. Какое из них является первым по счету? Надолго ли? Как изменятся названия других устройств, если первое отключить? Как это повлияет на текущие операции? Было бы забавно, если бы задание печати вдруг переключалось с вашего супер навороченного лазерного принтера на старый полудохлый матричный из-за того, что мама решила выдернуть разъем лазерного принтера, а тот, по счастью, оказался первым в списке, не так ли?

Перейдем к udev. Цели проекта udev как занимательны, так и актуальны. Udev:


 * работа в режиме пользователя;
 * динамическое создание и удаление файлов устройств;
 * согласованное назначение имен устройств;
 * предоставление (API) для режима пользователя.

Каждая раз, когда в структуре устройств появляется изменение, ядро генерирует uevent, который ловится udev. Затем udev следует правилам, определенным в каталогах, и. На основании информации в uevent, он находит правило или правила, которые он должен выполнить, и выполняет необходимые действия. Эти действия могут заключаться в создании или удалении файлов устройств, но могут и загружать нужные файлы прошивки в память ядра.

Ядро
Для udev требуется включить следующие параметры ядра:

Программное обеспечение
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 дает возможность создавать правила, которые проверяют uevents (события, посланные ядром) и задают свойства найденного устройства. Совпадающее правило, возможно, даст устройству имя, создаст файл устройства, и запустит программу конфигурации, чтобы настроить устройство.

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.

Выражения проверяются на совпадение на основании следующей информации:


 * Поле SUBSYSTEM uevent (для какого типа устройства был uevent)
 * Действие (поле ACTION), которое было предпринято (добавление, удаление, либо изменение устройства)
 * Один или более атрибутов (через поля ATTR or ATTRS), например, класс устройства, производитель, либо другая информация об устройстве
 * Имя, данное ядром (через поле KERNEL), например, sd* (для дисков SCSI/SATA), либо input* (для устройств ввода, таких, как мыши и клавиатуры)
 * Одна или более настройка окружения (через поле ENV), используемая для информации, которая может использоваться несколькими правилами сразу.

На основании этой информации, правило может сделать следующее:


 * 1) определить информацию, которую необходимо будет передать более поздним событиям (через переменные окружения)
 * 2) создать ссылки в
 * 3) выполнить команды

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 enables 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:

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

Будет создан файл логов, однако никакие сообщения в него не будут записываться. Самые новые версии udev будут отправлять все сообщения в 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 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: