Udev

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Udev and the translation is 78% 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 с возможностью горячей замены и так далее. Какое из них является первым по счету? Надолго ли? Как изменятся названия других устройств, если первое отключить? Как это повлияет на текущие операции? Было бы забавно, если бы задание печати вдруг переключалось с вашего супер навороченного лазерного принтера на старый полудохлый матричный принтер из-за того, что кто-то решил выдернуть разъем лазерного принтера, который, по счастью, оказался первым принтером?

Обзор диспетчера устройств. Современный диспетчер устройств (включая udev и eudev) должен уметь:

  • запуск в пользовательском пространстве.
  • динамически создавать и удалять файлы устройств.
  • предоставлять согласованное назначение имен устройств.
  • предоставлять (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"

Cannot load package information. Is the atom sys-fs/udev correct?

Установка

После настройки 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

Optional: Disable or override predictable network interface naming

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.

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

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

  • Мониторинг всей активности 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="eth0"
  • 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

Те, у кого две сетевых карты на материнской плате, могут попасть в ситуацию, когда ifconfig не покажет eth0 или eth1. dmesg может показать, что сетевая карта определена как eth0, а затем переименована в eth1. При выполнении ifconfig -a также будет показана сетевая карта как 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.

См. также

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