Ссылка на оригинал: http://www.gentoo.org/doc/ru/udev-guide.xml
C версии: 1.0
Каталог /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 должна использоваться вместе с ядром версии 2.6 (пакеты vanilla-sources или gentoo-sources, и профилем 2005.0). Если вы используете такое ядро, убедитесь, что у вас есть самая последняя версия sys-apps/baselayout. Вот и всё, что потребуется.
Листинг 2.1: Установка udev
# emerge udev
udev установит пакет hotplug-base, как одну из зависимостей. Не нужно устанавливать пакет hotplug до тех пор, пока вы хотите, чтобы модули автоматически загружались при подключении устройств. hotplug также управляет автоматическим включением сетевых устройств и загрузкой встроенного ПО.
Листинг 2.2: Установка дополнительных сценариев hotplug
# emerge hotplug
Если хотите, чтобы загружались модули для устройств, подключаемых до загрузки, используйте пакет coldplug:
Листинг 2.3: Установка пакета coldplug
# emerge coldplug
И не забудьте добавить coldplug на загрузочный уровень запуска (boot):
Листинг 2.4: Добавление coldplug на загрузочный уровень запуска
# rc-update add coldplug boot
Что же касается ядра, не забудьте выбрать следующие параметры:
Листинг 2.5: Требуемые параметры ядра
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» выключен:
Листинг 2.6: Автоматически не монтировать devfsd
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:
Листинг 2.7: /etc/conf.d/rc
RC_DEVICE_TARBALL="no"
Если вы включили поддержку devfs в вашем ядре, вы можете деактивировать её в конфигурации загрузчика: добавьте gentoo=nodevfs как параметр ядра. Если вы хотите использовать devfs и деактивировать udev, добавьте gentoo=noudev.
Отсутствие специальных файлов устройств при загрузке
Если ваша машина не может успешно загрузится и выдаётся ошибка о том, что путь /dev/null не найден или отсутствует первоначальная консоль, то проблема в том, что отсутствуют некоторые файлы устройств, которые должны быть доступны до того, как /dev смонтирован и обработан udev. Это часто встречается на машинах, где Gentoo установлен со старых носителей.
Если вы используете sys-apps/baselayout-1.8.12 или более позднюю версию, эта проблема облегчается, так как процесс загрузки должен управлять до полного завершения. Однако, чтобы избавится от этих раздражающих предупреждений, вам следует создать отсутствующие специальные файлы, как описано далее.
Выполните следующие команды для того, чтобы увидеть, какие специальные файлы присутствуют до обработки udev в /dev:
Листинг 3.1: Вывод списка специальных файлов устройств, доступных при загрузке
# mkdir test
# mount --bind / test
# cd test/dev
# ls
Устройства /dev/null и /dev/console необходимымы для успешной загрузки. Если они не были показаны в предыдущем тесте, вы должны создать их самостоятельно. Выполните следующие команды в каталоге test/dev/:
Листинг 3.2: Создание необходимых специальных файлов устройств
# mknod -m 660 console c 5 1
# mknod -m 660 null c 1 3
Когда закончите, не забудьте отмонтировать каталог test/:
Листинг 3.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
Если xorg-x11 отказывается запускаться, возможно, отсутствует файл устройства /dev/nvidia. В этом случае запустите /sbin/NVmakedevices.sh, чтобы его создать или пересоздать.
Не появляются имена LVM2
Если вы используете вместе udev и Logical Volume Manager 2 (LVM—менеджер логических разделов), вы можете заметить, что созданные вами группы разделов и логические разделы исчезли. Что ж, на самом деле нет, но они, к несчастью, названы /dev/dm-#, где #—это 0,1, ... и т.д.
Чтобы это исправить, отредактируйте файл /etc/udev/rules.d/50-udev.rules и уберите комментарий со следующей строки:
Листинг 3.4: Как убрать комментарий со строки из файла /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.
Листинг 3.5: Установка пакета multipath-tools
(На момент написания, пакет 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, указывает ли там строка настройки на существующий файл устройства.
Другая проблема заключается в различном именовании терминалов между devfs и udev. Если в devfs терминалы называются tty, то в udev они называются vc. Это может привести к проблемам если возможность входа root с консоли ограничивается с помощью /etc/securetty. Чтобы обеспечить возможность входа root с консоли, нужно обязательно изменить tty1 на vc/1 в /etc/securetty.
Другие проблемы
Если файлы устройств не создаются, когда соответствующий модуль загружается из /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.
Листинг 3.6: Включение поддержки файловой системы /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.