Как kerneld определяет, какой
модуль загружать?
Несмотря на то, что kerneld содержит в себе встроенную информацию о
наиболее распространенных типах модулей, иногда возникает ситуация
когда kerneld не будет знать, как обработать запрос ядра. Это бывает
в том случае, когда запрос идет к устройствам типа CD-ROM или сетевых
плат, и существует несколько модулей, которые можно загрузить.
Запрос, который kerneld получает от ядра, приходит при обращении к
одному из следующих пунктов:
к драйверу блочного устройства
к драйверу символьного устройства
к формату кода программы (binary format)
к протоколу tty-линии
к файловой системе
к сетевому устройству
к сетевому сервису (например, rarp)
к сетевому протоколу (например, IPX)
kerneld определяет, какой модуль должен быть загружен, просматривая
файл /etc/conf.modules
Существует два вида строк в этом файле: пути
(где находятся файлы модулей), и алиасы (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, будет следующая
строка:
Если нужно передать какие-либо параметры драйверу - например,
передать модулю, какое прерывание (IRQ) использует сетевая плата,
добавьте строку опций ("options"):
В результате этого kerneld загрузит драйвер платы NE2000 при помощи
команды
Конечно, в любом случае, набор возможных опций зависит от
конкретного модуля, который вы загружаете.
Формат кода программы (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:
Смотрите также ниже раздел Общие проблемы для
информации о том, как можно избежать некоторых надоедливых
сообщений во время загрузки системы, связанных с неопределенным
семейством протоколов
Файловые системы
Запросы kerneld, требующие файловую систему, представляют собой
простое название типа файловой системы. Наиболее часто это
используется для загрузки модуля isofs для файловых систем
CD-ROM-ов, например, файловых систем типа "iso9660":
Примечания