Файлы устройств и udev

GNU/Linux предоставляет доступ к устройствам посредством файлов уст- ройств. В главе 11 было рассказано о файлах устройств. Вы уже знаете, что они бывают двух типов: символьные и блочные. Также вам известно, что вместо размера файлов устройств команда ls -l выводит два значения: мажор и минор. Мажор — это номер драйвера для данного устройства в ядре, минор — дополнительный параметр, чаще всего нумерующий экземпляр устройства.

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

r нехватка мажоров и миноров для адресации файлов устройств;

r загромождение /dev файлами отсутствующих реально устройств (напри-

мер, в Fedora 1 в каталоге /dev имелось порядка 1800 файлов устройств);

r неудобство в работе подключаемых на лету устройств (hot-pluggable de- vices), например, USB.

Проблема нехватки мажоров и миноров решается относительно просто, но проблема загромождения /dev не так проста. Для ее решения во многих UNIX-системах используют динамически создаваемые файлы устройств с помощью файловой системы devfs. Идея такова: в ядре имеется информа- ция, какие устройства установлены в системе (при наличии соответствующих драйверов). Если в системе появляется новое устройство, для него динамиче- ски создается новый файл устройства.

Есть еще одна проблема: поскольку имена файлов устройств, создаваемых devfs, не являются жестко связанными с конкретными аппаратными средст- вами, это очень затрудняет работу множества средств автоматизации. Например, если для USB-флэш один раз создается файл устройства /dev/sdb, а другой — /dev/sdc, то как определить точку монтирования?


 

Для решения этих проблем в ядрах 2.6.13 и выше используется udev — даль- нейшее развитие devfs, предоставляющее возможность "стабилизации" име- нования динамически создаваемых файлов устройств с помощью специаль- ных правил (rules).

Ядро Linux предоставляет файловую систему sysfs, монтируемую в каталог

/sys. В этой файловой системе хранится служебная информация, с помощью которой udev создает и удаляет файлы устройств в /dev.

В udev входят:

r udevd — демон, отслеживающий сообщения ядра и передающий их udev;

r udevcontrol — программа для управления udev;

r udevinfo — программа для получения информации об устройствах (см.

пример 19.13);

r ata_id, edd_id, scsi_id и vold_id — программы для идентификации уст- ройств;

r udevmonitor — отладочная программа для отслеживания сообщений ядра;

r udevtest — симулятор udev.

Содержимое каталога /dev находится на временной файловой системе, и файлы устройств создаются там динамически. Статические файлы устройств копируются в /dev при старте системы из /lib/udev/devices (пример 19.11).

 

Пример 19.11. Статические файлы устройств в /lib/udev/devices

 

$ ls /lib/udev/devices/

console core fd kmsg lp0 net null ppp ptmx pts shm stderr stdin stdout tty tty0 tty1 zero

 

Конфигурационные файлы для udev размещаются в /etc/udev. Прежде всего это правила (rules), с помощью которых определяются имена для создавае- мых файлов устройств. Всякий раз, когда устройство добавляется или удаля- ется из системы, ядро генерирует событие uevent для информирования демо- на udevd, который в соответствии с правилами в /etc/udev/rules.d/*.rules создает или удаляет файлы устройств.

Каждому устройству сопоставляется специальный идентификатор MODALIAS. Список поддерживаемых устройств конкретным драйвером находится в со- ответствующем этому драйверу модуле ядра. Программа depmod читает эти идентификаторы и записывает их в файл modules.alias в каталоге с модулями ядра (пример 19.12).


 

Пример 19.12. Файл modules.alias

 

# modinfo –a kingsun_sir

alias: usb:v07C0p4200d*dc*dsc*dp*ic*isc*ip*

 

# grep -i kingsun /lib/modules/`uname -r`/modules.alias alias usb:v07C0p4200d*dc*dsc*dp*ic*isc*ip* kingsun_sir

 

В примере получен идентификатор модуля для IrDA-USB KingSun с по- мощью команды modinfo –a. Этот же MODALIAS имеется в файле modules.alias.

Наличие файла modules.alias обеспечивает автоматическое подключение тре- буемых модулей ядра для устройств, опознанных udev. Причем на ранних стадиях загрузки полная инициализация /dev невозможна, т. к. при этом мо- жет быть еще не готова инфраструктура udev. Поэтому после полной ини- циализации udev производит сбор информации в специальных триггерах для устройств в каталоге /sys о событиях uevent, которые были отложены для по- следующей обработки udev.

Получить информацию об устройстве, опознанном udev, можно с помощью команды udevinfo (пример 19.13).

 

Пример 19.13. Получение информации udev об устройстве

 

$ udevinfo -n /dev/sdb -q all P: /block/sdb

N: sdb

S: disk/by-id/usb-Myson_Century Inc._USB_Mass_Storage_Device_100 S: disk/by-path/usb-100:0:0:0

E: ID_VENDOR=Myson_Century,_Inc.

E: ID_MODEL=USB_Mass_Storage_Device E: ID_REVISION=b007

E: ID_SERIAL=Myson_Century,_Inc._USB_Mass_Storage_Device_100 E: ID_TYPE=floppy

E: ID_BUS=usb

E: ID_PATH=usb-100:0:0:0

 

Опция -n команды udevinfo позволяет указать требуемое устройство соот- ветствующим ему файлом, а опция –q all выводит всю доступную udev ин- формацию об устройстве. Обратите внимание на строку P: /block/sdb — это путь для поиска информации об устройстве в sysfs (пример 19.14).


 

Пример 19.14. Информация об устройстве в sysfs

 

$ find /sys -name '*block*sdb'

/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-7/1-7:1.0/host2/target2

:0:0/2:0:0:0/block:sdb

 

Найденный в примере 19.14 файл — это символическая ссылка на подкаталог в /sys, содержащий файлы с информацией об устройстве.

Можно проследить события uevent, происходящие в системе при добавлении или удалении устройства. Это делается с помощью udevadm monitor (при- мер 19.15).

 

Пример 19.15. Мониторинг событий uevent

 

# udevadm monitor --env

monitor will print the received events for:

UDEV - the event which udev sends out after rule processing KERNEL - the kernel uevent

 

KERNEL[1263115065.575286] add

/devices/pci0000:00/0000:00:1d.7/usb2/2-2 (usb) UDEV_LOG=3

ACTION=add DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb2/2-2

 

В примере 19.15 приведен фрагмент вывода информации о работе udev при подключении USB-носителя.

Если подключенное устройство не опознается системой, первое, что имеет смысл сделать — изучить сообщения ядра с помощью команды dmesg (при- мер 19.16).

 

Пример 19.16. Команда dmesg

 

# dmesg

[137937.482077] usb 2-2: new high speed USB device using ehci_hcd and address 5

...

[137939.043375] sd 8:0:0:0: [sdb] Attached SCSI removable disk

 

В примере 19.16 приведен укороченный фрагмент вывода сообщений ядра, выполненный командой dmesg при подключении USB-носителя.


 








Дата добавления: 2015-06-12; просмотров: 929;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.014 сек.