Udev

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Udev and the translation is 76% complete.
Outdated translations are marked like this.


Не следует путать с eudev.

udev (user /dev) — это менеджер устройств из systemd для ядра Linux. Он управляет файлами устройств в каталоге /dev и обрабатывает все действия из пользовательского пространства при добавлении или удалении устройств.

udev from the sys-apps/systemd-utils package is used as the default device manager for Gentoo systems using the OpenRC init system, independently of systemd.

Что такое udev?

Каталог /dev

Большинство пользователей Linux знают, что /dev/sda1 это простой способ сослаться на первый раздел на первом, обнаруженным ядром, диске. Это довольно просто, не так ли?

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

Обзор диспетчера устройств. Современный диспетчер устройств должен уметь:

  • Запускаться в пользовательском пространстве.
  • Динамически создавать и удалять файлы устройств.
  • Предоставлять согласованное назначение имен устройств.
  • Предоставлять интерфейс (API) для программ, работающих в пространстве пользователя.

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


Установка

Важно
При обновлении проверьте руководство по обновлению udev. Там есть информация, которая не позволит сделать систему не загружаемой.

Ядро

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

ЯДРО
General setup  --->
    [*] Configure standard kernel features (expert users)  --->
        [ ] Enable deprecated sysfs features to support old userspace tools
        [*] Enable signalfd() system call
Enable the block layer  --->
    [*] Block layer SG support v4
Networking support  --->
    Networking options  --->
        <*> Unix domain sockets
Device Drivers  --->
    Generic Driver Options  --->
        ()  path to uevent helper
        [*] Maintain a devtmpfs filesystem to mount at /dev
    < > ATA/ATAPI/MFM/RLL support (DEPRECATED)  --->
File systems  --->
    [*] Inotify support for userspace
    Pseudo filesystems --->
        [*] /proc file system support
        [*] sysfs file system support

USE-флаги

Portage знает о глобальном USE-флаге udev для включения поддержки udev в остальных пакетах. Добавьте этот USE-флаг в список USE-флагов (он включен по умолчанию для всех Linux профилях) приведет к тому, что пакет virtual/udev автоматически установится:

ФАЙЛ /etc/portage/make.conf
USE="udev"

USE flags for sys-apps/systemd-utils Utilities split out from systemd for OpenRC users

+acl Add support for Access Control Lists
+kmod Enable kernel module loading via sys-apps/kmod
+tmpfiles Enable systemd-tmpfiles
+udev Enable systemd-udev (userspace device manager)
boot Enable systemd-boot (UEFI boot manager)
kernel-install Enable kernel-install
secureboot Automatically sign efi executables using user specified key
selinux !!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur
split-usr Enable behavior to support maintaining /bin, /lib*, /sbin and /usr/sbin separately from /usr/bin and /usr/lib*
sysusers Enable systemd-sysusers
test Enable dependencies and/or preparations necessary to run tests (usually controlled by FEATURES=test but can be toggled independently)
ukify Enable systemd-ukify

Установка

После настройки USE-флагов обновите систему, чтобы изменения вступили в силу:

root #emerge --ask --changed-use --deep @world

Настройка

Сервис

Чтобы запустить udev при загрузке, добавьте его к уровню запуска sysinit. Это может быть сделано при помощи следующей команды, если она запущена с привилегиями root пользователя:

root #rc-update add udev sysinit

Расширенная настройка

Правила

udev дает возможность создавать правила, которые проверяют uevents (события, посланные ядром) и задают свойства найденного устройства. Совпадающее правило, возможно, даст устройству имя, создаст файл устройства, и запустит программу конфигурации, чтобы настроить устройство.

Определения правил сохраняются в двух местах:

  1. /lib/udev/rules.d - правила в этом каталоге создают некоторые установленные пакеты, они, как правило, не должны изменятся пользователями;
  2. /etc/udev/rules.d - этот каталог для пользовательских настроек. Любое новое правило должно быть добавлено в этот каталог.

В этих каталогах, несколько файлов правил (с суффиксом .rules) в буквенно-цифровом порядке имен, по возрастанию. Внутри файлов правил, udev ищет выражения, которые могут совпасть с uevent (добавляется устройство или удаляется) и команду для выполнения.

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

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

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

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

Udev делает эти действия для каждого правила, для которого находит соответствие (он не останавливается после первого совпадения), позволяя организовать гибкий подход к управлению устройствами.

Постоянные имена устройств

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

  • Udev создает дополнительные символические ссылки для устройств хранения, на основании ID, label, UUID и расположения устройства. Посмотрите в каталог /dev/disk/by-*. Так что, вместо того, чтобы использовать файл устройства /dev/sda, используйте файл /dev/disk/by-label/НЕКОТОРАЯ_МЕТКА.
  • То же самое для устройств ввода в каталоге /dev/input.
  • Используя свои правила, пользователи могут создавать собственные файлы устройств.

Predictable network interface naming

The new network interface naming convention is not the same. So the symlinks used by netifrc will need to be re-linked. Use /etc/init.d/net.lo as a link target for whatever interface names need to be added. Be sure to replace <interface_name> in the commands below with the Ethernet interface names present on the system. It is possible to discover which interfaces exist by running the ip link command:

user $ip link

Create a symbolic link for the existing interfaces in the /etc/init.d/ directory:

root #ln -s /etc/init.d/net.lo /etc/init.d/net.<interface_name>

Edit /etc/conf.d/net with any necessary configuration for all interfaces.

Add the script(s) to the default runlevel to have the interface(s) start automatically:

root #rc-update add net.<interface_name> default

Необязательно: Отключение или переопределение правил именования предсказуемых имён сетевых интерфейсов

Network device names such as eth0 or wlan0 as provided by the kernel are normally changed on system boot (see dmesg) by the /lib/udev/rules.d/80-net-setup-link.rules udev rule and the NamePolicy in /lib/systemd/network/99-default.link.

This behavior may be disabled in several ways:

  1. Symlink /etc/systemd/network/99-default.link to /dev/null: ln -s /dev/null /etc/systemd/network/99-default.link.
  2. Create a lower-numbered .link file in /etc/systemd/network which assigns a different name to the interface.
  3. Pass net.ifnames=0 on the kernel command line.

Remapping keys and buttons

udev provides a way to remap keys and buttons using hwdb:

ФАЙЛ /etc/udev/hwdb.d/keyboard-example.hwdb
evdev:name:AT Translated Set 2 keyboard:*
 KEYBOARD_KEY_db=58 # <scancode in HEX>=<keycode in DEC or keycode in HEX prefixed with 0x>

The device name can be found using app-misc/evtest:

root #evtest
/dev/input/event3:	AT Translated Set 2 keyboard

After selecting the device (evtest is an interactive tool) and pressing a key, evtest displays information about the key. In this example, the scancode of the pressed key is 0xDB and it mimics the key with keycode 58:

Event: time 1708679751.175244, type 4 (EV_MSC), code 4 (MSC_SCAN), value db

Event: time 1708679751.175244, type 1 (EV_KEY), code 58 (KEY_CAPSLOCK), value 1

The full list of keycodes is available in the Linux source code. As an example, #define KEY_CAPSLOCK 58 transforms into 58.

The keycodes of other devices are also allowed (e.g., the left click mouse button 0x110).

To perform the changes, the hardware database /etc/udev/hwdb.bin must be updated (also suitable for OpenRC):

root #systemd-hwdb update

The new configuration will take effect after a reboot.

Использование

Некоторые полезные команды:

  • Мониторинг всей активности udev:
root #udevadm monitor
  • Показать все сообщения о заданном файле устройства:
root #udevadm info --query=all --name=/dev/DEVICE_FILE
  • Show udev info about a given sys path device file (might be obtained via udevadm monitor):
root #udevadm info --attribute-walk --path=/devices/DEVICE_FILE
  • Пример правил udev — назначение постоянного имени для Ethernet-устройства:
ФАЙЛ /etc/udev/rules.d/50-ethernet.rules
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="01:23:45:67:89:ab", NAME="ethernet0"
  • After changing a rules file in /etc/udev/rules.d/, either reboot or make udev reload them with:
root #udevadm control --reload-rules
  • For already added devices (plugged USB, etc.), the reloaded rules take effect either after changing the device (replugging USB, etc.) or by making udev request kernel events again via udevadm trigger. Various event actions can be triggered. By default, the change event action is triggered:
root #udevadm trigger

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

Устранение проблем

Журналирование сообщений монитора

Чтобы начать записывать все сообщения при запущенном udevadm monitor, измените следующий конфигурационный файл:

ФАЙЛ /etc/conf.d/udev
udev_monitor="YES"

Это создаст новый файл лога /run/udev/udevmonitor.log.

Режим отладки

Включение режима отладки выведет еще больше сообщений в логах:

ФАЙЛ /etc/conf.d/udev
udev_debug="YES"

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

ФАЙЛ /etc/udev/udev.conf
udev_log="debug"

Будет создан файл логов /run/udev/debug.log, однако никакие сообщения в него не будут записываться. Самые новые версии udev будут отправлять все сообщения в dmesg.

Отсутствующие файлы устройств /dev/null и /dev/console

Некоторые версии udev нуждаются /dev/null и /dev/console файлах для корректной работы, и не могут создать их сами. Чтобы вручную создать эти файлы для Udev выполните следующие команды с привилегиями root:

root #mkdir test
root #mount --bind / test
root #cd test/dev
root #mknod -m 660 console c 5 1
root #mknod -m 660 null c 1 3
root #cd ../..
root #umount test
root #rmdir test

Сетевая карта определена как eth0, но изменилась на eth1

Те, у кого две сетевых карты на материнской плате, могут попасть в ситуацию, когда ip link не покажет eth0 или eth1. dmesg может показать, что сетевая карта определена как eth0, а затем переименована в eth1. При выполнении ip link также будет показана сетевая карта как eth1. Это из-за того, что имена, определенные ядром используются в первую очередь. Пользователи должны написать свои правила, например, в файле /etc/udev/rules.d/70-my-network.rules, и задать свои имена, вроде lan0 или wireless0, либо использовать предсказуемые имена интерфейсов (которые были включены по умолчанию начиная с udev версии 197).

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

root #rm /etc/udev/rules.d/70-persistent-net.rules /etc/udev/rules.d/80-net-setup-link.rules /etc/udev/rules.d/80-net-name-slot.rules /etc/systemd/network/99-default.link

Также убедитесь, что не передали net.ifnames=0 в командной строке ядра. Такая настройка полностью отключает функцию предсказуемых имен в udev.

См. также

Внешние ресурсы