Управление аппаратными средствами в Linux с помощью udev

()

В былые времена администраторы Linux имели статический каталог /dev. Это было очень не гибко, 99% того что там содержалось было не верным. Но мы любили этот путь. Мы не возражали против использования makedev с различным ключами прежде чем начать использование устройства. Мы в ручную удаляли удаляли тысячи не нужных записей, потому что настоящие администраторы любят всё делать сами. Поскольку только такой путь позволяет нам лучше понимать систему. Проходили годы и мы копили бесчисленные байты знаний, чтобы потом говорить новичкам - "РТФМ, Лузер!".

Потом появилась devfs, которая пыталась заменить эту громоздкую систему чем-то более лёгким и простым. Создатель devfs Ричард Гуч имел радикальную идею: в /dev должны содержаться только имеющиеся в системе устройства, а управление должно быть максимально простым и эффективным.

через некоторое время с гор спустился ещё один безбородый пророк - Грэг Кроа-Хартман. Он дал ещё одну /dev-систему, названную udev. Начиная с ядра 2.6.13 devfs больше не включён в основную ветвь ядра.

До сих пор не прекращаются дебаты "devfs против udev", о которых вы можете читать на самых разных ресурсах. Вы всё ещё имеете /etc/devfs в своей системе, и устройства, зависящие от этого. Например - драйвера NVIDIA. Так что когда вы видите devfs - не думайте что сможете легко от него избавиться.

udev также решает задачу обнаружения устройств (совместно с hal и hotplug) и создания нодов для них в /dev. На самом деле все устройства, даже жёсткие диски и PCI-карты, рассматриваются как съёмные устройства. "О нет", скажете вы, "это не хорошо, потому что тогда устройства при каждой загрузке получают новые имена".

Это не проблема. udev позволяет вам назначать статические имена устройствам, на подобие того, как вы прописываете строки в /etc/fstab. Наверняка ваш дистрибутив Linux идёт с уже готовой конфигурацией, которая назначает статические имена определённым устройствам, таким как жёсткие диски, сетевые карты и проч.

udev очень красивая и гибкая система, и когда он сконфигурирована правильно (например поставщиком вашего дистрибутива) - ваша жизнь - сплошное удовольствие.

Сожалею, Дэйв, однако я не могу позволить тебе сделать это

Обратная сторона этой медали - молодость всего проекта. Если вы что-то хотите сделать то может не оказаться документации, и вам придётся искать человека, который уже решал эту задачу. Но давайте не будем о грустном, а лучше рассмотрим udev подробнее.

Итак. Мы всё ещё имеет каталог /dev, однако больше не является статическим. Он заполняется нодами при загрузке. Причём ноды генерируются в соответствии с соответствующими правилами udev.

Правила udev хранятся в файлах конфигурации, расположенных в /etc/udev.d. Различные дистрибутивы могут изменять это местоположение. Например в Fedora и Ubuntu есть файл /etc/udev/udev.conf, который содержит основные опции программы, а все правила лежат в /etc/udev/rules.d.

Каталог /sys - двоюрдный брат каталога /proc. Только он хорошо организован, а не превращён в кашу. Туда экспортируется информация от ядра в читабельном для человека виде. Для /proc используется файловая система /proc, а для /sys - sysfs. Вы можете увидеть это в выводе команды mount:

# mount
proc on /proc type proc (rw)
/sys on /sys type sysfs (rw)
udev on /dev type tmpfs (rw)

Обратите внимание на то что для /dev используется tmpfs. Что приводит к потере всей информации оттуда при перезагрузке.

Как вы можете заметить (find /sys -type l), /sys наполнена симлинками. Вы можете просматривать /sys как и любую другую папку, поймёте ли вы её содержимое - другой вопрос. Но попытаться понять конечно не помешает.

Поскольку sysfs, так же как и /proc - виртуальная файловая система - она не занимает физического пространства. Konqueror на моей системе говорит что она занимает 129.4, но du говорит совсем другое:

$ du -sh /sys
0    /sys

Написание правил udev

Текущие версии udev идут с man-страницами и несколькими полезными командами. В системах на основе Debian содержимое пакета udev можно просмотреть командой:

$ dpkg -L udev

В системах на основе RedHat (например Fedora) используйте команду:

$ rpm -ql udev

Набор команд будет зависеть от дистрибутива, однако есть команды, одинаковые для всех дистрибутивов.

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

$ udevinfo -e

Вы можете также запросить информацию об отдельных устройствах, если знаете путь к ним. Например для разделов SATA:

$ udevinfo -a -p /block/sda/sda1

Как узнать путь к устройству? Используя udevinfo. Вы же знаете название некоторых устройств? Вот оттуда вы и сможете получить путь:

$ udevinfo -q all -n sda

Обе эти команды дают море информации. Вы ради развлечения можете выполнить lspci посмотреть совпадут ли значения disk/by-path/pci полученные при помощи udevinfo:

0000:00:0f.0 RAID bus controller: VIA Technologies, Inc.
  VIA VT6420 SATA RAID Controller (rev 80)

S: disk/by-path/pci-0000:00:0f.0-scsi-0:0:0:0-part1

Вывод udevinfo порой бывает очень странным, поэтому его следует сравнивать с выводом других команд. Для USB-устройств это будет lsusb, а для устройств SCSI это будет lsscsi

Оригинал

Ключевые слова: udev, udevinfo.

Комментарии:

dr_cod 2006-10-07 11:32:32 (#)

В начале какая-то хрень, dev это конечно хорошо, но блин, в свое время, когда не было такой массы съемных девайсов. Не знаю как кто, но я в течении дня наверно раз 20 подключаю отключаю флеху, usb-винт. Если б не udev, то наверно вместо работы я бы только прописывал ноды. ИМХО udev - отличная система, и вполне логичная.

MooSE 2006-10-07 17:17:41 (#)

На самом деле в ядре 2.4 udev не было, но проблем не было тоже Например нод sda1 при подключенной флэхе указывал на первую партицию на ней, а при отключенной был просто пустым. И при попытке монтирования выдавалась ошибка...
Новый комментарий



© 2006-2016 Вадим Калинников aka MooSE