devd — контролируем поведением устройств

Утилита devd — это системный демон, который всё время работает в фоновом режиме. Всякий раз при добавлении или удалении устройства из дерева устройств devd выполняет действия, указанные в devd.conf(5). Например, devd может выполнить dhclient(8) при добавлении в систему Ethernet-адаптера, и завершить экземпляр dhclient(8) когда тот же адаптер удаляется. Другим примером devd может быть использование таблицы для нахождения и загрузки через kldload(8) соответствующего драйвера для неизвестного устройства, которое добавлено в систему.

Утилита devd перехватывает драйвер устройства в devctl(4). Драйвер устройства имеет точки перехвата в системной конфигурации устройства. Когда узел добавляется или удаляется из дерева, устройство доставляет devd информацию о событии. Как только devd обработает сообщение, он найдет в списке действия для этой разновидности событий и произведёт наиболее подходящее действие. Для большинства обычных применений обработка по умолчанию вполне адекватна. Однако, для более продвинутых пользователей есть возможность настраивать каждый аспект обработки событий.

Утилита devd читает /etc/devd.conf (а так же директории /etc/devd и /usr/local/etc/devd) или альтернативный файл конфигурации, указанный опцией -f и использвет этот файл для управления остальными процессами. Хотя формат этого файла описан в devd.conf(5), некоторые основы описаны здесь. В секции options одна может определять несколько каталогов для поиска конфигурационных файлов. В этих каталогах обрабатываются все файлы, имена которых совпадают с шаблоном *.conf. Предполагается, что эти файлы установлены сторонними производителями, которые хотят перехватывать события в системе devd без модификации других конфигурационных файлов пользователя.

Все сообщения принимаемые devd передаются в UNIX-сокет /var/run/devd.pipe.

А теперь от теории, к практике. Создадим файл test.conf в папке /usr/local/etc/devd такого содержания:

notify 100 {
match "system" "USB";
match "subsystem" "DEVICE";
match "type" "ATTACH";
match "vendor" "0x082d";
match "product" "0x0100";
match "release" "0x0100";
action "/usr/local/bin/coldsync -md -p /dev/$cdev -t usb";
};

где параметр notify означает приоритет (чем больше число, тем он выше; по умолчанию у всех приоритет 1), match — означает совпадение (ключ -> значение), action — действие.

Вместо notify может применяться один из следующих параметров:

attach — Указывает на действия, которые нужно выполнить, когда подключается новое устройство и подпадает под нужные критерии

detach — Указывает на действия, которые нужно выполнить, когда отключается новое устройство и подпадает под нужные критерии

nomatch — Указывает на действия, которые нужно выполнить, когда подключается новое устройство и никакой драйвер не подгружается и подпадающее под нужные критерии

notify — Указывает на действия, которые нужно выполнить, когда ядро посылает уведомление в userland и подпадающее под нужные критерии

Зарезервированы следующие переменные (на них можно ссылаться так: $param)

Переменные не переведены, что бы не потерять смысл при переводе

     bus           Device name of parent bus.
     cdev          Device node path if one is created by the devfs(5) filesys-
                   tem.
     cisproduct    CIS-product.
     cisvendor     CIS-vendor.
     class         Device class.
     device        Device ID.
     devclass      Device Class (USB)
     devsubclass   Device Sub-class (USB)
     device-name   Name of attached/detached device.
     endpoints     Endpoint count (USB)
     function      Card functions.
     interface     Interface ID (USB)
     intclass      Interface Class (USB)
     intprotocol   Interface Protocol  (USB)
     intsubclass   Interface Sub-class (USB)
     manufacturer  Manufacturer ID (pccard).
     mode          Peripheral mode (USB)
     notify        Match the value of the ``notify'' variable.
     parent        Parent device
     port          Hub port number (USB)
     product       Product ID (pccard/USB).
     release       Hardware revision (USB)
     sernum        Serial Number (USB).
     slot          Card slot.
     subvendor     Sub-vendor ID.
     subdevice     Sub-device ID.
     subsystem     Matches a subsystem of a system, see below.
     system        Matches a system type, see below.
     type          Type of notification, see below.
     vendor        Vendor ID.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *