Как kerneld определяет, какой модуль загружать?

Несмотря на то, что kerneld содержит в себе встроенную информацию о наиболее распространенных типах модулей, иногда возникает ситуация когда kerneld не будет знать, как обработать запрос ядра. Это бывает в том случае, когда запрос идет к устройствам типа CD-ROM или сетевых плат, и существует несколько модулей, которые можно загрузить.

Запрос, который kerneld получает от ядра, приходит при обращении к одному из следующих пунктов:

kerneld определяет, какой модуль должен быть загружен, просматривая файл /etc/conf.modules [1] Существует два вида строк в этом файле: пути (где находятся файлы модулей), и алиасы (aliases) (какие модули для чего предназначены). Если у вас еще нет этого файла, его можно создать при помощи команд

  /sbin/modprobe -c | grep -v '^path' /etc/conf.modules

Если вы хотите добавить еще один путь к стандартным, вы должны также включить все стандартные пути, так как директива path в файле /etc/conf.modules заменит все известные по умолчанию пути!

Обычно нет необходимости вручную добавлять какие-либо пути, так как встроенного набора путей достаточно для "обычных" настроек (и не совсем обычных...), это точно!

С другой стороны, если же вы хотите просто добавить псевдоним или директиву options (опции), то ваши новые строчки в /etc/conf.modules будут добавлены к тому, что уже известно modprobe. Если вы хотите переопределить псевдоним или опции, ваши новые строки в /etc/conf.modules,

Блочные устройства

Если вы запустите /sbin/modprobe -c, вам будет выдан список всех модулей, которые известны kerneld, и какие запросы, какому модулю соответствуют. Например, запрос, из-за которого загружается драйвер флоппи-дисковода, направлен к блочному устройству с главным (major) номером 2:

  osiris:~ $ /sbin/modprobe -c | grep floppy
  alias block-major-2 floppy

Почему блочное устройство с главным номером 2? Потому что устройства флоппи-дисководов /dev/fd* имеют главный номер 2 и являются блочными

  osiris:~ $ ls -l /dev/fd0 /dev/fd1
  brw-rw-rw-   1 root     root       2,   0 Mar  3  1995 /dev/fd0
  brw-r--r--   1 root     root       2,   1 Mar  3  1995 /dev/fd1

Символьные устройства

Символьные устройства работают тем же образом. Например, драйвер стриммера ftape использует главный номер устройства 27:

  osiris:~ $ ls -lL /dev/ftape 
  crw-rw----   1 root     disk      27,   0 Jul 18  1994 /dev/ftape

Но, kerneld по умолчанию не знает о драйвере ftape - его не было в списке по команде /sbin/modprobe -c. Поэтому для того, чтобы kerneld загружал драйвер ftape, мне нужно добавить строку к файлу конфигурации kerneld (/etc/conf.modules):

  alias char-major-27 ftape

Сетевые устройства

Вы также можете использовать имя устройства вместо char-major-xxx / block-major-yyy. Это очень часто используется для драйверов сети. Например, для NE2000-совместимой сетевой карты, работающей под именем eth0, будет следующая строка:

  alias eth0 ne

Если нужно передать какие-либо параметры драйверу - например, передать модулю, какое прерывание (IRQ) использует сетевая плата, добавьте строку опций ("options"):

  options ne irq=5

В результате этого kerneld загрузит драйвер платы NE2000 при помощи команды

  /sbin/modprobe ne irq=5

Конечно, в любом случае, набор возможных опций зависит от конкретного модуля, который вы загружаете.

Формат кода программы (Binary formats)

Форматы кода обрабатываются почти также. Когда бы вы ни пытались запустить программу, формат которой неизвестен ядру, kerneld получает запрос на binfmt-xxx, где xxx - это номер вида кода, определенный из нескольких первых байтов кода. Таким образом, строка настройки kerneld, для поддержки загрузки модуля binfmt_aout для формата программ ZMAGIC (a.out), будет следующая:

  alias binfmt-267 binfmt_aout

так как магическое число (magic number) (см. /etc/magic) для формата ZMAGIC - 267. (Если вы внимательно рассмотрите /etc/magic, вы увидите число 0413, но числа в /etc/magic находятся в восьмеричном формате, kerneld использует десятичные, а восьмеричное 0413 = десятичному 267). На самом деле существует три слегка отличающихся варианта кода программ a.out (NMAGIC, QMAGIC и ZMAGIC), поэтому для полной поддержки модуля binfmt_aout необходимы три строки:

  alias binfmt-264 binfmt_aout  # обычная запускаемая программа (executable)(NMAGIC)
  alias binfmt-267 binfmt_aout  # запускаемая программа c подгрузкой страниц (demand-paged)(ZMAGIC)
  alias binfmt-204 binfmt_aout  # запускаемая программа c подгрузкой страниц (demand-paged)(QMAGIC)

Форматы кода a.out, Java и iBCS распознаются kerneld автоматически, без какой либо дополнительной настройки.

Протокол линии (slip, cslip и ppp)

Протоколы линии запрашиваются через tty-ldisc-x, где x обычно 1 (для SLIP) или 3 (для PPP). Оба эти варианта известны kerneld по умолчанию.

Продолжая разговор о PPP, если вы хотите, чтобы kerneld загружал модуль сжатия данных bsd_comp для PPP, то вам необходимо добавить следующие строки к файлу /etc/conf.modules:

  alias tty-ldisc-3 bsd_comp
  alias ppp0 bsd_comp

Семейства сетевых протоколов (IPX, AppleTalk, AX.25)

Некоторые сетевые протоколы могут быть также загружены в виде модулей. Ядро запрашивает у kerneld загрузку семейства протоколов (напр. IPX) при помощи запроса net-pf-X, где X это число, означающее номер необходимого семейства протоколов. Например, net-pf-3 означает AX.25, net-pf-4 - IPX и net-pf-5 - это AppleTalk. (Эти номера определяются константами AF_AX25, AF_IPX и т.п., заданными в исходных текстах ядра в файле include/linux/socket.h). Поэтому, для автозагрузки модуля IPX, вам необходимо добавить следующее в файл /etc/conf.modules:

  alias net-pf-4 ipx

Смотрите также ниже раздел Общие проблемы для информации о том, как можно избежать некоторых надоедливых сообщений во время загрузки системы, связанных с неопределенным семейством протоколов

Файловые системы

Запросы kerneld, требующие файловую систему, представляют собой простое название типа файловой системы. Наиболее часто это используется для загрузки модуля isofs для файловых систем CD-ROM-ов, например, файловых систем типа "iso9660":

  alias iso9660 isofs

Примечания

[1]

В некоторых дистрибутивах этот файл называется modules.conf