Gentoo udev Guide Sven Vermeulen Gregorio Guidi Юрий Астахов В этом документе объясняется, что такое udev и как его использовать в зависимости от ваших потребностей. 0.21 2005-08-12 Что такое udev?
Каталог /dev

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

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

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

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

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

Разработка udev состоит из трех отдельных проектов: namedev, libsysfs и, конечно, udev.

namedev

Namedev позволяет отделить именование устройств от программы udev. Это дает возможность гибкого использования правил и схем именования, разработанныых отдельно. Подсистема именования предоставляет стандартный интерфейс, который может использоваться udev.

Сейчас, через namedev представлена только одна схема именования, предоставляемая LANANA. Она используется на большинстве Linux—систем, и поэтому хорошо подходит основной массе пользователей Linux.

В namedev для определения имени конкретного устройства используется последовательность из пяти шагов. Если на одном из шагов имя установлено, оно и используется. Вот эти шаги:

  • по метке или серийному номеру
  • по номеру устройства шины
  • по топологии шины
  • статическое имя
  • имя, назначенное в ядре

По метке или серийному номеру — проверяется, есть ли у устройства уникальный идентификатор. Например, у устройств USB есть уникальный серийный номер USB, а у устройств SCSI — уникальный UUID. Если namedev находит соответствие уникального номера и определенного конфигурационного файла, используется имя, указанное в конфигурационном файле.

По номеру устройства шины — проверяется номер устройства, подключаемого к шине. В среде, где нет возможности «горячей замены», этого шага достаточно для идентификации устройства (например, номер на шине PCI редко меняется за время существования системы). Опять же, если namedev находит соответствие номера устройства шины и определенного конфигурационного файла, используется имя, указанное в конфигурационном файле.

Подобным образом, по топологии шины — это, скорее, статический способ идентификации устройств, подходящий до тех пор, пока пользователь не начинает их переключать. Когда позиция устройства совпадает со значением, заданным пользователем, используется указанное имя.

Четвёртый шаг, статическое имя — это простая подстановка строки. Замененное имя присваивается, когда имя, назначенное в ядре (по умолчанию) совпадает с заданной строкой замены.

Последний шаг (имя, назначенное в ядре) покрывает все остальные случаи: при этом берётся имя по умолчанию, присвоенное в ядре. В большинстве случаев этого достаточно, поскольку имя соответствует принятому в современных Linux-системах.

libsysfs

udev взаимодействует с ядром через псевдофайловую систему sysfs. Проект libsysfs предлагает обобщенный интерфейс программирования для доступа к сведениям, предоставляемым файловой системой sysfs. Это даёт возможность опроса разнородных устройств без необходимости знания их типа.

udev

Каждый раз, когда ядро обнаруживает обновление структуры устройств, оно вызывает программу /sbin/hotplug. Hotplug, в свою очередь, запускает приложения, указанные в каталоге /etc/hotplug.d/default, где также находится символическая ссылка на приложение udev. Hotplug направляет сведения, данные ядром, в программу udev, которая производит необходимые действия над структурой /dev (создавая или удаляя файлы устройств).

Как использовать udev в Gentoo
Требования к системе

Файловая система udev должна использоваться вместе с ядром версии 2.6 (пакеты vanilla-sources или gentoo-sources, и профилем 2005.0). Если вы используете такое ядро, убедитесь, что у вас есть самая последняя версия sys-apps/baselayout. Вот и всё, что потребуется.

# emerge udev

udev установит пакет hotplug-base, как одну из зависимостей. Не нужно устанавливать пакет hotplug до тех пор, пока вы хотите, чтобы модули автоматически загружались при подключении устройств. hotplug также управляет автоматическим включением сетевых устройств и загрузкой встроенного ПО.

# emerge hotplug

Если хотите, чтобы загружались модули для устройств, подключаемых до загрузки, используйте пакет coldplug:

# emerge coldplug

И не забудьте добавить coldplug на загрузочный уровень запуска (boot):

# rc-update add coldplug boot

Что же касается ядра, не забудьте выбрать следующие параметры:

General setup --->
  [*] Support for hot-pluggable devices

File systems --->
  Pseudo filesystems --->
    [*] /proc file system support
    [*] Virtual memory file system support (former shm fs)

По вашему усмотрению, можете оставить поддержку файловой системы /dev file system support (OBSOLETE) активной, но обязательно убедитесь в том, что параметр «Automatically mount at boot» выключен:

File systems --->
  Pseudo Filesystems --->
    [*] /dev file system support (OBSOLETE)
      [ ]   Automatically mount at boot

Если вы используете genkernel, не забудьте запустить её с параметром --udev, для включения всех необходимых параметров конфигурации ядра. Конфигурация по умолчанию, даваемая этим обращением к genkernel, достаточна.

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

Если вы хотите использовать улучшения udev, добавленные Gentoo для более удобного использования, не читайте дальше. Gentoo будет использовать udev, сохраняя неизменной структуру /dev, так что вы никогда не потеряете специальные файлы устройств. Сценарии иницилизации Gentoo не будут запускать демон devfsd и деактивируют devfs при загрузке.

Но если вы «крепкий орешек» и хотите запустить любыми средствами систему только с udev и без улучшений, к чему и стремится разработка udev (включая сложности в отсутствии узлов устройств, потому, что udev их ещё не поддерживает), тогда читайте дальше :)

Мы деактивируем правила, которые сохраняют специальные файлы устройств: отредактируйте переменную RC_DEVICE_TARBALL в /etc/conf.d/rc и устанавите её значение на no:

RC_DEVICE_TARBALL="no"

Если вы включили поддержку devfs в вашем ядре, вы можете деактивировать её в конфигурации загрузчика: добавьте gentoo=nodevfs как параметр ядра. Если вы хотите использовать devfs и деактивировать udev, добавьте gentoo=noudev.

Известные проблемы
Остутствие специальных файлов устройств при загрузке

Если ваша машина не может успешно загрузится и выдаётся ошибка о том, что путь /dev/null не найден или отсутствует первоначальная консоль, то проблема в том, что отсутствуют некоторые файлы устройств, которые должны быть доступны до того, как /dev смонтирован и обработан udev. Это часто встречается на машинах, где Gentoo установлен со старых носителей.

Если вы используете sys-apps/baselayout-1.8.12 или более позднюю версию, эта проблема облечается, так как процесс загрузки должен управлять до полного завершения. Однако, чтобы избавится от этих раздражающих предупреждений, вам следует создать отсутствующие специальные файлы, как описано далее.

Выполните следующие команды для того, чтобы увидеть, какие специальные файлы присутствуют до обработки udev в /dev:

# mkdir test
# mount --bind / test
# cd test/dev
# ls

Устройства /dev/null и /dev/console необходимымы для успешной загрузки. Если они не были показаны в предыдущем тесте, вы должны создать их самостоятельно. Выполните следующие команды в каталоге test/dev/:

# mknod -m 660 console c 5 1
# mknod -m 660 null c 1 3

Когда закончите, не забудьте отмонтировать каталог test/:

# cd ../..
# umount test
# rmdir test
udev и nvidia

Если вы используете коммерческий драйвер от nVidia и сервер X не запускается только на файловой системе udev, убедитесь что у вас:

  • название модуля nvidia указано в файле /etc/modules.autoload.d/kernel-2.6
  • версия nvidia-kernel больше или равна media-video/nvidia-kernel-1.0.5336-r2
  • версия baselayout как минимум sys-apps/baselayout-1.8.12
Не появляются имена LVM2

Если вы используете вместе udev и Logical Volume Manager 2 (LVM—менеджер логических разделов), вы можете заметить, что созданные вами группы разделов и логические разделы исчезли. Что ж, на самом деле нет, но они, к несчастью, названы /dev/dm-#, где #—это 0,1, ... и т.д.

Чтобы это исправить, отредактируйте файл /etc/udev/rules.d/50-udev.rules и уберите комментарий со следующей строки:

KERNEL="dm-[0-9]*",     PROGRAM="/sbin/devmap_name %M %m", NAME="%k",
SYMLINK="%c"

Далее, установите пакет sys-fs/multipath-tools, который содержит программу devmap_name.

(На момент написания, пакет multipath-tools был доступен только в
тестовой ветке дерева Portage)
# echo "=sys-fs/multipath-tools-0.4.2 ~x86" >>
/etc/portage/package.keywords
# emerge multipath-tools
Отличающиеся названия в DevFS и udev

Даже если наша цель—иметь совместимую схему именований между этими динамическими системами управления устройствами, иногда случаются различия в именовании.

Сообщалось о коллизии в работе контроллера HP Smart Array 5i (более точно - модуль ядра cciss). При использовании udev, устройства именовались как /dev/cciss/cXdYpZ, где X, Y и Z - числа. При использовании devfs, устройства именовались /dev/hostX/targetY/partZ или являлись символическими ссылками на /dev/ccisss/cXdY.

Если это как раз тот случай, не забудьте обновить файл /etc/fstab и конфигурационные файлы загрузчика соответственно.

То же самое происходит со всеми символическими ссылками, которые существуют в директории /dev, такими как /dev/mouse, которые udev больше не создаёт. Обязательно проверьте настройку графического сервера X и посмотрите секцию Device, указывает ли там строка настройки на существующий файл устройства.

Другие проблемы

Если файлы устройств не создаются, когда соответствующий модуль загружается из /etc/modules.autoload.d/kernel-2.6, но появляются когда вы загружаете этот модуль вручную при помощи modprobe, тогда вам стоит произвести обновление до sys-apps/baselayout-1.8.12 или более поздней версии.

Поддержка устройств кадрового буфера (/dev/fb/*) включена в ядро с версии 2.6.6-rc2.

В ядрах старше, чем 2.6.4, вам следует явно включить поддержку для файловой системы /dev/pts.

File systems --->
  Pseudo filesystems --->
    [*] /dev/pts file system for Unix98 PTYs
Ссылки на ресурсы и благодарности

Разговор об udev начался на симпозиуме по Linux в Оттаве в 2003 году (Linux Symposium, Ottawa, Ontario Canada - 2003) Грегом Кроа-Хартманом (Greg Kroah-Hartman) из корпорации IBM, который дал ясное понимание для применения udev.

Decibel's UDEV Primer - документ о udev и Gentoo.

Написание правил для udev члена сообщества разработки Gentoo Дэниела Дрэйка (Daniel Drake) - отличный документ для того, чтобы научится управлять установкой udev.