Лекция
Сразу хочу сказать, что здесь никакой воды про подсистема udev, и только нужная информация. Для того чтобы лучше понимать что такое подсистема udev, udev , настоятельно рекомендую прочитать все из категории Операционная система LINUX.
На предыдущих лекциях мы иногда упоминали о подсистеме 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 настраивает устройства в соответствии с заданными правилами. Об этом говорит сайт https://intellect.icu . Правила содержаться в файлах каталога /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.
Пожалуйста, пиши комментарии, если ты обнаружил что-то неправильное или если ты желаешь поделиться дополнительной информацией про подсистема udev Надеюсь, что теперь ты понял что такое подсистема udev, udev и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Операционная система LINUX
Комментарии
Оставить комментарий
Операционная система LINUX
Термины: Операционная система LINUX