udev

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Udev and the translation is 100% complete.

Other languages:
Deutsch • ‎English • ‎español • ‎français • ‎русский • ‎中文(中国大陆)‎ • ‎日本語 • ‎한국어

Not to be confused with eudev.

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

Что такое 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 upgrade guide. Там есть информация, которая не позволит сделать систему не загружаемой.

Ядро

Для 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 знает о глобальном udev USE-флаге для включения поддержки udev в остальных пакетах. Добавьте этот USE-флаг в список USE-флагов (он включен по умолчанию для всех Linux профилях) приведет к тому, что пакет sys-fs/udev автоматически установится:

Файл /etc/portage/make.conf
USE="udev"

USE flags for sys-fs/udev Linux dynamic and persistent device naming support (aka userspace devfs)

acl Add support for Access Control Lists
kmod Enable kernel module loading/unloading support using sys-apps/kmod
selinux !!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur
static-libs Build static versions of dynamic libraries as well

Emerge

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

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

Конфигурация

Запуск как сервис

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

root #rc-update add udev sysinit

Оставить классическое именование 'eth0'

Имена сетевых устройств, такие как eth0 или wlan0 и так далее, как предусмотрено ядром, обычно меняются во время загрузки системы (смотрите dmesg) с помощью /lib/udev/rules.d/80-net-name-slot.rules правила udev.

Чтобы сохранить классическое именование это правило может быть перезаписано пустым файлом с таким же именем в каталоге /etc/udev/rules.d:

root #touch /etc/udev/rules.d/80-net-name-slot.rules

Расширенная конфигурация

Правила

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

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

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

  • Показать все сообщения о заданном файле устройства:
root #udevadm info --query=all --name=/dev/DEVICE_FILE
  • Мониторинг активности udev:
root #udevadm monitor
  • Назначение постоянного имени для Ethernet устройства:
Файл /etc/udev/rules.d/ethernet.rules
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="01:23:45:67:89:ab", NAME="eth0"

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

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

Логгинг сообщений монитора

Чтобы начать записывать все сообщения при запущенном 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/udevdebug.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/systemd/network/99-default.link

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

Смотрите также

Ссылки

Bug 575718 - запрос на голосование относительно того, какую программу по умолчанию будет предоставлять virtual/udev - предоставляемая по умолчанию программа от virtual/udev изменена на sys-fs/eudev.