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