Лекция №30 - Подсистема udev

На предыдущих лекциях мы иногда упоминали о подсистеме udev. Вы уже должны понимать в общих чертах, что такое udev и зачем она нужна. Проще всего пояснить назначение подсистемы udev на основе шины USB и подключаемых к ней устройств. Когда к компьютеру подключается USB-устройство, ядро на уровне обслуживания шины USB, фиксирует событие присоединения нового устройства. Перечень таких событий можно посмотреть выполнив команду dmesg. Вот пример событий, которые регистрирует ядро при подключении флеш-накопителя:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[962726.528540] usb 2-2: new high speed USB device using ehci_hcd and address 8
[962726.663367] usb 2-2: configuration #1 chosen from 1 choice
[962726.665095] scsi9 : SCSI emulation for USB Mass Storage devices
[962726.665328] usb-storage: device found at 8
[962726.665335] usb-storage: waiting for device to settle before scanning
[962731.664264] usb-storage: device scan complete
[962731.664971] scsi 9:0:0:0: Direct-Access     OCZ      RALLY2           8.07 PQ: 0 ANSI: 2
[962731.665787] sd 9:0:0:0: Attached scsi generic sg5 type 0
[962731.670693] sd 9:0:0:0: [sde] 7843840 512-byte logical blocks: (4.01 GB/3.74 GiB)
[962731.671175] sd 9:0:0:0: [sde] Write Protect is off
[962731.671182] sd 9:0:0:0: [sde] Mode Sense: 03 00 00 00
[962731.671188] sd 9:0:0:0: [sde] Assuming drive cache: write through
[962731.677810] sd 9:0:0:0: [sde] Assuming drive cache: write through
[962731.677826]  sde: sde1
[962732.148443] sd 9:0:0:0: [sde] Assuming drive cache: write through
[962732.148456] sd 9:0:0:0: [sde] Attached SCSI removable disk

До появления udev необходимо было вручную находить подключаемые устройства и настраивать их работу в системе. Теперь эту работу на себя берет udev. Когда вы подключаете флеш-накопитель к компьютеру с современным Linux-дистрибутивом, то вся настройка и монтирование файловой системы происходит автоматически.

Очень тесно с udev связана файловая система sysfs, которая монтируется в каталог /sys. Каталог /sys отображает и предоставляет доступ к аппаратной конфигурации компьютера. Другими словами /sys - это отображение аппаратной конфигурации компьютера. Содержимое каталога /sys динамически меняется при изменении аппаратной конфигурации.

Если остановить демон udev, то при подключении флеш-накопителя, ядро будет регистрировать события, каталог /sys будет меняться, но файловая система флеш-накопителя не будет смонтирована. Более того в каталоге /dev вы также не увидите нового устройства, так как именно udev создает там блочное устройство являющееся флеш-накопителем.

Итак, подведем маленький итог. Задача ядра определять изменения в аппаратной конфигурации системы, регистрировать эти изменения, и вносить изменения в каталог /sys. Задача подсистемы udev выполнить дальнейшую интеграцию и настройку устройства в системе (отобразить его в каталоге /dev), и предоставить пользователю уже готовое к работе устройство.

Подсистема udev настраивает устройства в соответствии с заданными правилами. Правила содержаться в файлах каталога /etc/udev/rules.d/. Также файлы с правилами могут содержаться и в каталоге /etc/udev/. Все файлы правил просматриваются в алфавитном порядке.

Рассмотрим строку с правилом из файла правил и познакомимся с основными принципами построения правил:

1
SUBSYSTEMS=="scsi", KERNEL=="sr[0-9]*", NAME="scd%n", SYMLINK+="sr%n"

В строке видим 4 пары выражений разделенных запятой. Первые две пары являются так называемыми фильтрами, которые позволяют идентифицировать устройство. В примере SUBSYSTEMS==”scsi” указывает на то, что устройство должно быть SCSI-устройством, а пара KERNEL==”sr[0-9]*” идентифицирует устройство по имени которое оно (устройство) получило от ядра системы. То есть это правило будет применяться к SCSI-устройству с именем sr0 или sr1 и т.д.

Далее идут пары-действия которые будут выполняться с устройствами которые соответствуют фильтру. NAME=”scd%n” - эта запись говорит о том, что для устройства будет создан файл-устройство в каталоге /dev с именем scd0 или scd1 и т.д. Цифра будет зависеть от цифры в имени устройства. Вместо %n и будет подставлена цифра из имени. Если имя устройства будет sr0, то scd%n преобразуется в scd0. Также очень часто используется подстановка %k. %k - это полное имя устройства. То есть вместо %k будет подставлено sr0. Если одного имени файла-устройства (/dev/scd0) недостаточно, то можно создать символические линки - SYMLINK+=”sr%n”. Это выражение создаст в каталоге /dev символический линк с именем sr0 на файл устройство /dev/scd0. Обратите внимание, что используется оператор +=.

Для каждого подключаемого устройства ядро создает соответствующие записи в каталоге /sys. Устройство кроме принадлежности к какой-либо подсистеме и имени, также имеет множество атрибутов, таких как название, модель, серийный номер и другие. Идентифицировать устройства можно и по именам атрибутов. Для этого используется выражение ATTRIB{наименование атрибута}==значение атрибута.

Выполним следующее практическое задание. Напишем правило, которое создаст в каталоге /dev символический линк на подключаемый флеш-накопитель. Флеш-накопитель идентифицируем по серийному номеру. Подключаем флеш-накопитель и с помощью команды dmesg смотрим имя которое было присвоено ядром для этого накопителя:

1
2
3
4
...
[962731.665787] sd 9:0:0:0: Attached scsi generic sg5 type 0
[962731.670693] sd 9:0:0:0: [sde] 7843840 512-byte logical blocks: (4.01 GB/3.74 GiB)
...

Имя накопителя - sde. Далее воспользуемся командой udevinfo. Команда udevinfo - предназначена для просмотра базы данных udev, а также для получения информации об устройствах из каталога /sys. Подробнее о команде в man udevinfo, сейчас рассмотрим только частный случай использования. Следующая команда выдаст информацию об устройстве:

1
2
3
4
5
6
7
8
9
10
11
12
udevinfo -q all -n sde

P: /devices/pci0000:00/0000:00:13.2/usb2/2-2/2-2:1.0/host8/target8:0:0/8:0:0:0/block/sde
N: sde
W: 85
S: block/8:64
S: disk/by-id/usb-OCZ_RALLY2_ST1A9BFE-0:0
...
...
E: DKD_PARTITION_TABLE_SCHEME=mbr
E: DKD_PRESENTATION_NOPOLICY=0
E: DEVLINKS=/dev/block/8:64 /dev/disk/by-id/usb-OCZ_RALLY2_ST1A9BFE-0:0

Нас интересует самая первая строка которая содержит путь к остальной информации об устройстве записанной в каталоге /sys. Чтобы получить эту информацию нужно выполнить команду udevinfo -a -p путь. Чтобы не набирать такой длинный путь можно записать такую команду:

1
udevinfo -a -p $(udevinfo -q path -n sde)

В результате получим длинный перечень атрибутов и значений в виде готовом для использования в правилах udev. Ниже небольшой фрагмент результатов:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="80"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{urbnum}=="4811"
    ATTRS{idVendor}=="058f"
    ATTRS{idProduct}=="6387"
    ATTRS{bcdDevice}=="0100"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="2"
    ATTRS{devnum}=="4"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{authorized}=="1"
    ATTRS{serial}=="ST1A9BFE"
...

Теперь можно составить правило. Например, так:

1
SUBSYSTEMS=="usb", ATTRS{serial}=="ST1A9BFE", SYMLINK+="MyFlashRally"

Это правило будет применено ко всем устройствам подсистемы USB у которых серийный номер равен ST1A9BFE. В результате должен быть создан символический линк на такое устройство в каталоге /dev.

Создаем файл /etc/udev/rules.d/10-myudev.rules, вставляем в него наше правило. Отключаем флеш-накопитель, перегружаем демон udev и снова подключаем флеш-накопитель. Выполним команду ls -l /dev | grep MyFlash:

1
2
$ ls -l /dev/ | grep MyFlash
lrwxrwxrwx  1 root root             3 2010-03-19 21:19 MyFlashRally -> sde

Видим, что подсистема udev выполнила наше правило и создала символический линк на файл-устройство sde.

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

Читать другие лекции по курсу Администратор ПК с Linux

Статьи и новости схожей тематики:

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

  1. IgorKa - Информационный ресурс » Знакомство с udev в ubuntu:

    [...] материал конспекта Лекция №30 - Подсистема udev не буду, остановлюсь только на отличиях, которые нашел [...]

  2. ASLok:

    Здорово! Интересно, почему в КДЕ4 не работает автомонтирование ntfs? Отлично монтирует другие носители, если в fstab добавить запись то и ntfs вручную монтируется без проблем. Может тоже юдев виноват?

    [aslok@3r]22.04.2010-16:06:24:~$ cat /etc/fstab | grep sdf
    /dev/sdf1 /media/Bsi_3 ntfs-3g defaults,locale=ru_UA.UTF-8,user,noauto 0 0

    Ответить

  3. linuxmaster:

    Виноват прежде всего ты, так как некорректно вышел с диска ntfs. Форсируй монтирование через опцию -o force, этим ты сбросишь журнал проверки диска. И вообще копируй оттуда данные и удаляй ntfs. Он не нужен.

    Ответить

Оставьте свой отзыв