Несмотря на то, что kerneld содержит в себе встроенную информацию о наиболее распространенных типах модулей, иногда возникает ситуация когда kerneld не будет знать, как обработать запрос ядра. Это бывает в том случае, когда запрос идет к устройствам типа CD-ROM или сетевых плат, и существует несколько модулей, которые можно загрузить.
Запрос, который kerneld получает от ядра, приходит при обращении к одному из следующих пунктов:
к драйверу блочного устройства
к драйверу символьного устройства
к формату кода программы (binary format)
к протоколу tty-линии
к файловой системе
к сетевому устройству
к сетевому сервису (например, rarp)
к сетевому протоколу (например, IPX)
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 |
Конечно, в любом случае, набор возможных опций зависит от конкретного модуля, который вы загружаете.
Форматы кода обрабатываются почти также. Когда бы вы ни пытались запустить программу, формат которой неизвестен ядру, 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 автоматически, без какой либо дополнительной настройки.
Протоколы линии запрашиваются через 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 |
Некоторые сетевые протоколы могут быть также загружены в виде модулей. Ядро запрашивает у 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 |