Утилита 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.