Файлы устройств и 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;