Менеджер-перечислитель устройств
enum-devices опции
ЗОСРВ «Нейтрино»
aarch64, arm, armv7, e2k, mips, ppc, x86
Для запуска этого менеджера необходимо войти в систему под учетной записью root . |
Разделы описания enum-devices:
Менеджер enum-devices перечисляет устройства, имеющиеся на данном компьютере. Сначала менеджер считывает данные из конфигурационных файлов, указанных с помощью любой из опций командной строки -c.
После этого конфигурационный менеджер опрашивает различные перечислители с целью определения устройств, имеющихся в системе. Затем выполняется сопоставление этих устройств и идентификаторов устройств, указанных в конфигурационных файлах. При совпадении обнаруженного устройства с данными в конфигурационном файле enum-devices выполняет действия, указанные для этого устройства.
Фактическое выполнение программ, указанных в любых выражениях start и requires, начинается после завершения обработки, т.е. после выполнения всех строк встроенных команд. При необходимости выполнения действия вне зависимости от наличия тех или иных устройств следует использовать идентификатор устройства all. |
Поведение сопоставления, реализуемое при использовании утилиты enum-devices, основано на "количестве совпадений" в операторе устройств конфигурационного файла утилиты enum-devices. Для создания вторичного оператора устройств можно указать точку (.
) перед полем сопоставления.
Использование этого метода сопоставления устройств с записями в конфигурационном файле enum-devices иногда может приводить к возникновению "неоднозначности": если указанное устройство соответствует нескольким записям в конфигурационном файле утилиты enum-devices, выбор перечислителем предпочтительного драйвера для устройства становится невозможным.
Например, если устройство определено следующим образом:
ven=1922,dev=1234,busno=0,devno=1, rev=100,msven=fe,mscomp=MTP,mssubcomp=0
и в конфигурационном файле утилиты enum-devices содержится следующее:
device(usb, ven=1922,dev=1234) device(usb, class=08,proto=00)
то указанное устройство соответствует обеим записям в конфигурационном файле.
Возникновение неоднозначности можно предотвратить путем расширения критериев совпадения для предпочтительного драйвера:
device(usb, ven=1922,dev=1234,class=08)
или путем конфигурирования одного из совпадающих полей в качестве вторичного, т.е. путем назначения ему более низкого приоритета по отношению к другим полям:
device(usb, .class=08,proto=00)
Для поиска любых совпадений ("catch all") (поиска совпадений с любым устройством) следует просто указать тип шины устройства. Пример.
device(usb) echo("No match found for device ven=$(ven), dev=$(dev), class=$(class), busno=$(busno), devno=$(devno), cfg=$(cfg), iface=$(iface), msven=$(msven), mscomp=$(mscomp), mssubcomp=$(mssubcomp)" )
В каталоге etc/system/enum/
находятся следующие конфигурационные файлы:
etc/system/enum/devices/
, содержатся определения устройств. В число этих файлов входят: etc/system/enum/devices/usb/
находятся следующие конфигурационные файлы: etc/system/enum/include/
, содержатся определения макросов. В число этих файлов входят:
Порядок старшинства конфигурационных файлов утилиты enum-devices определяется одним или обоими следующими критериями:
Если файлы добавляются в каталог перечислителя устройств после запуска утилиты перечислителя устройств, то перечислитель выбирает эти файлы и назначает им более высокий приоритет по сравнению с существующими файлами.
Принимая во внимание сложность, связанную с добавлением и удалением файлов и каталогов во время обработки, при работе в среде ЗОСРВ «Нейтрино» рекомендуется
Для конфигурационного файла утилиты enum-devices обычно используется следующий формат:
/enum common /devices default net mass char /include usb-class /overrides mass
Любые данные, указанные после символа решетки (#
) до конца строки, рассматриваются как комментарий.
Для всех операторов используется следующий формат:
идентификатор_устройства... выражение_действия ...
Идентификатор_устройства может быть представлен ключевым словом all или любым количеством идентификаторов в следующем формате:
device(тип_шины[, параметры]...)
Типы шин могут быть представлены, по крайней мере, следующими значениями:
Каждое выражение представляет собой ключевое слово, за которым могут следовать любые необходимые аргументы.
Запустить команду. Для выражения start используется следующий формат:
start[/wait] (системная_команда [, системные_аргументы] )
Это выражение выполняет команду системная_команда с использованием заданных аргументов. Если указана опция /wait, то работа перечислителя приостанавливается до завершения команды.
Если указаны системные_аргументы, то менеджер выполняет поиск выражения start с командой системная_команда, идентичной данной команде, и добавляет системные_аргументы в командную строку. Этот способ целесообразно использовать при необходимости запуска только одного экземпляра команды с определением аргументов, требующихся для всех обнаруженных устройств.
Например, выражение
start(spooler -d$(path), -P$(pnpstr))
запускает spooler -d $(path). При этом для утилиты enum-devices указывается, что если данная команда уже встречалась ранее, то к ней просто следует добавить аргумент -P $(pnpstr). (Формат $(...) используется для макрорасширения; см. приведенное ниже описание выражения set.)
Запустить команду, если она еще не выполняется. Для выражения requires предусмотрена возможность использования одного из двух форматов:
Если указаны системные_аргументы, разделителем между системная_команда и системные_аргументы является запятая. Если запятая не указана, утилита enum-devices не выполняет проверку наличия в системе уже выполняемой команды, что может привести к ее многократному выполнению. |
/etc/system/enum/devices/net
содержится следующая строка для сетевых устройств, для которых требуется io-pkt-*:
Если в любом из форматов указана опция /wait, то работа перечислителя приостанавливается до завершения команды.
Запустить команду в качестве отдельного драйвера, если устройство может быть отключено. Для выражения driver используется следующий формат:
driver[/wait] (системная_команда [, системные_аргументы] )
Формат аналогичен формату выражения start. Но в данном случае, если процесс перечислителя шины передает данные о том, что устройство может быть отключено, утилита enum-devices запускает для устройства отдельный процесс драйвера (вместо добавления аргументов системные_аргументы к драйверу, ранее указанному для этого устройства). Если процесс перечислителя шины передает данные о том, что устройство отключено, то в процесс драйвера передается сигнал SIGTERM
.
Если указана опция /wait, то работа перечислителя приостанавливается до завершения команды.
Запустить утилиту mount с указанными аргументами. Для выражения mount используется следующий формат:
mount (аргументы_монтирования [, аргументы_демонтирования] )
Это выражение порождает команду mount с аргументами аргументы_монтирования. Если указаны какие-либо аргументы_демонтирования, то они передаются в команду umount в случае отключения устройства.
Запустить новый перечислитель шины. Для выражения enumerator используется следующий формат:
enumerator (тип_перечислителя)
Это выражение запускает новый перечислитель, указанный в переменной тип_перечислителя.
Установить макрос. Для выражения set используется следующий формат:
set (имя_макроса, макроопределение)
Это выражение определяет значение имя_макроса как макроопределение. Каждый раз, когда утилита enum-devices находит $(имя_макроса) в любом из конфигурационных файлов, подставляется макроопределение. Пример:
set(DEVB_OPTIONS, cam quiet blk auto=partition)
Предусмотрена возможность рекурсивного вложения макросов так же, как при работе с утилитой make.
Добавить к макроопределению. Для выражения append используется следующий формат:
append (имя_макроса, макроопределение)
Это выражение добавляет макроопределение к определению имя_макроса.
Установить макрос в значение, зависящее от того, найдена строка во внутренней базе данных или нет. Для выражения uniq используется следующий формат:
uniq (имя_макроса, уникальное_имя [, начальное_значение] )
Это выражение инициирует поиск утилитой enum-devices строки уникальное_имя во внутренней базе данных:
uniq(sernum, devc-ser, 1) driver(devc-ser8250 $(SER_OPTIONS), "-u$(sernum) $(ioport),$(irq)")
Ждать появления указанного путевого имени. Для выражения waitfor используется следующий формат:
waitfor (путевое_имя [, таймаут] )
Это выражение определяет таймаут, задаваемый в десятых долях секунды, ожидания появления пути путевое_имя. Значение параметра таймаут по-умолчанию - 10 секунд.
Вывести строку в файл. Для выражения echo используется следующий формат:
echo (строка [, выходной_файл] )
строка выводится в указанный выходной_файл. Если это первое вхождение echo для этого вызова конфигурационного менеджера, утилита enum-devices стирает выходной_файл перед выводом данных. В дальнейшем утилита enum-devices дополняет файл данными. Если выходной_файл не указан, выходные данные передаются в стандартный поток вывода.
Присвоить имя блоку выражений действия. Для выражения tag используется следующий формат:
tag (строка_тегов)
Это выражение присваивает имя (строка_тегов) последующему блоку выражений действия. Это выражение следует использовать для определения команд, подлежащих выполнению при использовании второго формата выражения requires.
Загрузить дополнительные конфигурационные файлы или каталоги. Для выражения config используется следующий формат:
config (путь)
Это выражение инициирует загрузку дополнительного конфигурационного файла или каталога утилитой enum-devices в соответствии со значением параметра путь. Обработка этого выражения осуществляется аналогично опции командной строки -c, за исключением того, что указанное путевое имя относится к конфигурационному файлу, содержащему выражение.
Объединить макроопределения. Для выражения use используется следующий формат:
use (список_устройств)
При обнаружении этого выражения утилита enum-devices выполняет следующие действия:
Доступны к использованию несколько специальных макросов. Значение этих макросов зависит от шины, на которой находится устройство.
Макросы для устройств PCI:
Для обработки аспектов распознавания устройств на шине утилита enum-devices порождает отдельные программы-перечислители шины. Стандартный поток вывода этих программ подключается к каналу данных, из которого утилита enum-devices считывает данные. Поскольку перечислитель шины выполняет сканирование соответствующей ему шины, строки с описанием обнаруженных параметров записываются в стандартный поток вывода. Запись каждой строки в канал должна осуществляться атомарно. В начале каждой строки указывается односимвольный код (определенный в файле в формате ENUMER_CODE_*
), за которым сразу следует идентификатор процесса перечислителя шины.
Для каждого макроопределения на языке C допускается запись следующих строк:
#define ENUMER_SYM_BUSTYPE "bus"#define ENUMER_SYM_VENDOR "ven"#define ENUMER_SYM_SUBVENDOR "dev"#define ENUMER_SYM_CLASS "class"#define ENUMER_SYM_SUBCLASS "subclass"
ENUMER_CODE_DEV_PERM
, за исключением того, что в данном случае можно удалить устройство во время работы системы: #define ENUMER_SYM_REMOVAL_ID "removal_id"
Значение макроса должно быть простым целым числом.
ENUMER_CODE_DEV_PERM
, за исключением того, что указанное устройство уже работает в системе: ENUMER_SYM_REMOVAL_ID
. В качестве значения следует задать целое число равное значению, указанному при передаче информации об устройстве в первый раз. Программа enum-devices использует его для определения процессов драйверов, подлежащих уничтожению, или путевых имен, подлежащих демонтированию. ENUMER_CODE_DEV_PERM
. ENUMER_CODE_BUS
вызов действий производится незамедлительно). Если возможность добавления/удаления каких-либо устройств на шине отсутствует, перечислитель шины после записи этой строки должен завершить работу. При наличии временных устройств перечислитель шины должен продолжать работу и записать события ENUMER_CODE_DEV_TEMP
и/или ENUMER_CODE_DEV_REMOVED
, за которыми записывается еще одна строка ENUMER_CODE_SCAN_DONE
при добавлении или удалении устройств. Ниже приведен пример конфигурационного файла:
# prefixing generic commands all # so we can say "pci($(ATI), ....) for readability set( ATI, 0x1234 ) echo( "starting configuration" ) # Start a hard disk driver device(pci,1234,5678) start( devb-ncr8 ncr8 pci=$(index) ) # Start a network driver (currently) device(pci,0x1234,0x5678) start( io-pkt-v4, -d speedo pci=$(index) ) # Start a network driver (with mount support) device(cardbus,1234,5678) requires( io-pkt-v4 ) start( mount, -T none -o pci=$(index) ne2000 /dev/if0 ) # Start a graphics driver (sorta :-) device(pci,1234,5678) echo( $(ven) $(dev) $(bus) $(device) $(function), /etc/devg.$(hostname) ) # postfixing generic commands all echo( "Completed configuration" )
|
Базовые подсистемы ЗОСРВ «Нейтрино»
Предыдущий раздел: Сервисы