Мини-HOWTO: Linux kerneld

История изменений
Издание версия 2.022 мая 2000 года
Преобразование из HTML в DocBook SGML.

1. Об этом документе

В этом документе объясняется, как установить и использовать автоматический загрузчик модулей ядра "kerneld". Самую свежую версию этого документа можно найти в Linux Documentation Project


1.1. Благодарности

Этот документ основан на исходном HTML-варианте версии 1.7, написанном 19 июля 1997 года Henrik Storner , и был отредактирован и преобразован в DocBook DTD Gary Lawrence Murphy 20 мая 2000 года.

Я хочу выразить свою искреннюю благодарность следующим людям :

Если вы обнаружите какие-либо ошибки в этом документе, шлите свои замечания и предложения по адресу . Все замечания и предложения от читателей этого мини-HOWTO будут только приветствоваться.


1.2. Copyright

This document is Copyright by Henrik Storner, 1996, 1997.

Unless otherwise stated, Linux HOWTO documents are copyrighted by their respective authors. Linux HOWTO documents may be reproduced and distributed in whole or in part, in any medium physical or electronic, as long as this copyright notice is retained on all copies. Commercial redistribution is allowed and encouraged; however, the author would like to be notified of any such distributions.

All translations, derivative works, or aggregate works incorporating any Linux HOWTO documents must be covered under this copyright notice. That is, you may not produce a derivative work from a HOWTO and impose additional restrictions on its distribution. Exceptions to these rules may be granted under certain conditions; please contact the Linux HOWTO coordinator at the address given below.

In short, we wish to promote dissemination of this information through as many channels as possible. However, we do wish to retain copyright on the HOWTO documents, and would like to be notified of any plans to redistribute the HOWTOs.

If you have questions, please contact the Linux HOWTO coordinator, at [email protected] via email.


1.3. Авторские права

Авторские права на русский перевод этого текста принадлежат © 2000 SWSoft Pte Ltd. Все права зарезервированы.

Этот документ является частью проекта Linux HOWTO.

Авторские права на документы Linux HOWTO принадлежат их авторам, если явно не указано иное. Документы Linux HOWTO, а также их переводы, могут быть воспроизведены и распространены полностью или частично на любом носителе физическом или электронном, при условии сохранения этой заметки об авторских правах на всех копиях. Коммерческое распространение разрешается и поощряется; но так или иначе автор текста и автор перевода желали бы знать о таких дистрибутивах.

Все переводы и производные работы, выполненные по документам Linux HOWTO должны сопровождаться этой заметкой об авторских правах. Это делается в целях предотвращения случаев наложения дополнительных ограничений на распространение документов HOWTO. Исключения могут составить случаи получения специального разрешения у координатора Linux HOWTO с которым можно связаться по адресу приведенному ниже.

Мы бы хотели распространить эту информацию по всем возможным каналам. Но при этом сохранить авторские права и быть уведомленными о всех планах распространения HOWTO. Если у вас возникли вопросы, пожалуйста, обратитесь к координатору проекта Linux HOWTO по электронной почте: , или к координатору русского перевода Linux HOWTO компании SWSoft Pte Ltd. по адресу


2. Что такое kerneld?

kerneld - это демон, впервые представленный в ядрах версии 1.3 Bjorn Ekwall. Он позволяет "модулям" ядра (т.е. драйверам устройств, сети, файловым системам и т.п.) загружаться автоматически при первом запросе к ним, вместо ручного вызова их при помощи команд modprobe или insmod.

И для более интересных функций, которые не встроены (все еще?) в стандартное ядро:

  • kerneld можно настроить на вызов программы пользователя, вместо запуска стандартного гашения экрана, что позволяет использовать любую программу как заставку (screen-saver).

  • Тем же образом, как и в случае с программой-заставкой, можно изменить стандартный "сигнал (beep)" консоли в нечто совершенно другое ...

kerneld состоит из двух отдельных частей:

  • Поддержка в ядре Linux-а, для отсылки запросов на использование какого-либо модуля демону (daemon).

  • Демон на пользовательском уровне, который сможет выяснить, какие модули надо загрузить для исполнения запроса ядра.

Для полного функционирования kerneld, должны работать обе части - установки только одной из частей недостаточно.


2.1. Зачем это нужно?

Существует много причин для использования kerneld. Те, которые я упомяну - мои, другие люди могут использовать kerneld по иным причинам.

  • Если надо собрать ядра для нескольких систем, которые мало отличаются (например, сетевыми платами) - то можно собрать одно ядро и несколько модулей, вместо сборки отдельных ядер для каждой системы.

  • Для разработчиков модули более просты на стадии проверки - нет необходимости каждый раз перезагружать систему для загрузки или выгрузки драйвера. (Это относится ко всем модулям, не только загружаемым kerneld).

  • Это экономит память, используемую ядром, то есть, у вас больше памяти для приложений. Память, используемая ядром, никогда не кладется в раздел подкачки (swap), поэтому, если у вас 100 кб неиспользуемых драйверов внутри ядра, вы просто теряете оперативную память.

  • Некоторые драйвера, которые я использую - например, для стриммера ftape или iBCS - могут быть только в модулях. Но мне не приходится мучаться с их загрузкой и выгрузкой, когда бы они мне не понадобились.

  • Создатели дистрибутивов Linux-а не должны собирать 284 разных загрузочных образов (boot image) - каждый пользователь загружает драйверы для своего оборудования. В последних версиях некоторых дистрибутивов встроено автоматическое определение оборудования, которое само загружает только необходимые модули.

Конечно существуют причины, по которым вы не захотите использовать модули - вы можете предпочесть иметь одно ядро со всеми вашими драйверами, встроенными в него. В этом случае, вы читаете не тот документ.


2.2. Где найти необходимые части?

Поддержка модулей впервые была встроена в ядро версии 1.3.57. Если у вас ядро более ранней версии, и вы хотите установить kerneld, то вы должны перейти на более новое ядро. Исходные тексты ядер можно найти на всех основных Linux ftp-серверах, в том числе и на:

  • Kernel.Org

  • Metalab Linux

  • TSX-11 в MIT

Демон (daemon) входит в пакет modules. Он обычно также доступен по тем же адресам, где находятся исходные тексты ядра.

Замечание

ВНИМАНИЕ: Если вы хотите использовать загрузку модулей в последних тестовых ядрах, то вы должны использовать пакет modutils (НЕ modules). Ниже (глава Общие проблемы) приведено несколько замечаний о проблемах использования модулей в ядрах версии 2.1.


3. Как это настроить?

Сначала достаньте необходимые части: подходящее ядро и последние утилиты из пакета modules. Затем надо установить утилиты modules. Это делается очень просто - распакуйте исходные тексты и запустите make install. Эта команда скомпилирует и установит следующие программы в каталог /sbin: genksysm, insmod, lsmod, modprobe, depmod и kerneld. Я рекомендую добавить несколько строк в загрузочные скрипты (для проведения некоторых настроек при загрузке Linux). Добавьте следующие строки в файл /etc/rc.d/rc.S (если у вас Slackware), или в /etc/rc.d/rc.sysinit (если у вас установлен SysVinit, т.е. Debian, RedHat, Caldera):

        # Запускаем kerneld, это должно произойти почти сразу
        # в процессе загрузки, обязательно ДО запуска fsck на файловых системах,
        # это может быть необходимо для автозагрузки драйверов дисков
        if [ -x /sbin/kerneld ]
        then
                /sbin/kerneld
        fi

        # Далее следуют стандартные команды fsck
        # А также команда для монтирования (mount) вашей корневой файловой системы в режиме чтение/запись

        # Обновление файла зависимостей модулей ядра
        # Ваша корневая файловая система ДОЛЖНА быть подключена в режиме чтение/запись на этот момент
        if [ -x /sbin/depmod ]
        then
                /sbin/depmod -a
        fi

Эти команды могут уже присутствовать в ваших SysV init скриптах. Первая часть запускает собственно kerneld. Вторая часть запускает depmod -a в момент загрузки системы. Программа depmod строит список всех доступных модулей и анализирует их взаимосвязи, чтобы знать, в каком случае один модуль предварительно требует загрузки другого перед своей загрузкой.

Замечание

Последние версии kerneld в качестве опции используют библиотеку GNU dbm, libgdbm. Если вы включите эту опцию при сборке утилит пакета modules, то kerneld не запустится, так как библиотека libgdbm недоступна. Это может вызвать проблемы. Например, если у вас каталог /usr находится на отдельном разделе, а kerneld запускается до подключения раздела с каталогом /usr. Рекомендуемое решение - перенести libgdbm из каталога /usr/lib в /lib, или собрать kerneld со статическими библиотеками.

Затем, распакуйте исходные тексты ядра, и по своему желанию настройте и соберите ядро. Если вы этого никогда не делали, вам необходимо прочитать файл README в каталоге исходных текстов ядра Linux. Когда вы запустите make config, для настройки параметров сборки ядра, вы должны обратить внимание на вопросы, которые задаются вначале:

  Enable loadable module support (CONFIG_MODULES) [Y/n/?] Y
  (Разрешить поддержку загружаемых модулей (CONFIG_MODULES) [Д/н/?] Д)

Вам надо выбрать поддержку загружаемых модулей, иначе для kerneld просто не будет работы! Просто ответьте Да (Yes).

  Kernel daemon support (CONFIG_KERNELD) [Y/n/?] Y
  (Поддержка kerneld (CONFIG_KERNELD) [Д/н/?] Д)

Это, конечно, также необходимо. Затем, многие части ядра могут быть собраны в виде модулей - вы увидите вопросы типа

  Normal floppy disk support (CONFIG_BLK_DEV_FD) [M/n/y/?]
  (Поддержка обычного флоппи-диска (CONFIG_BLK_DEV_FD) [M/н/д/?])

где вы можете ответить М ("Модуль"). В общем случае только драйверы, необходимые для загрузки системы (драйвер жесткого диска, драйвер корневой файловой системы), должны быть встроены в ядро; остальное можно собрать в виде модулей.

ПредостережениеОбязательные драйверы
 

Обязательные драйверы, то есть те драйверы, которые необходимы для загрузки системы, должны быть встроены в ядро, а не собраны в качестве модулей. Обычно это: драйвер жесткого диска и драйвер корневой файловой системы. Если у вас система с двойной загрузкой, которая зависит от файлов на другом разделе, то вы должны также встроить поддержку файловой системы этого раздела в ядро.

Когда вы закончите с make config, соберите и установите новое ядро командой make dep clean bzlilo modules modules_install.

Уффф.

ПодсказкаCompiling a Kernel Image
 

Команда make zImage помещает новое ядро в файл arch/i386/boot/zImage. Вам нужно будет скопировать его туда, где находится ваш загрузочный образ (boot-image), или впоследствии установить его в LILO.

За наиболее подробной информацией по настройке, сборке и установке вашего собственного ядра обращайтесь к Kernel-HOWTO (HOWTO по ядру системы), которое постоянно рассылается через группу новостей comp.os.linux.answers, а также доступно в Linux Documentation Project (и его зеркалах).


3.1. Проверка kerneld

Перезагрузитесь с новым ядром. Когда система загрузится, наберите ps ax, и вы должны увидеть там строку с kerneld:

    PID TTY STAT  TIME COMMAND
     59  ?  S     0:01 /sbin/kerneld

Одно из самых приятных свойств kerneld состоит в том, что после загрузки ядра и загрузки kerneld требуется очень мало дополнительных действий. Для начала попробуйте использовать один из драйверов, который вы собрали в виде модуля - наиболее вероятно, что он заработает без дальнейшей настройки. Я собрал драйвер флоппи-дисковода в виде модуля так, чтобы можно было вставить DOS диск в дисковод и

  osiris:~ $ mdir a:
   Volume in drive A has no label
   Volume Serial Number is 2E2B-1102
   Directory for A:/

  binuti~1 gz       1942 02-14-1996  11:35a binutils-2.6.0.6-2.6.0.7.diff.gz
  libc-5~1 gz      24747 02-14-1996  11:35a libc-5.3.4-5.3.5.diff.gz
          2 file(s)        26689 bytes

Итак, драйвер флоппи-диска работает - он автоматически загрузился kerneld, когда я обратился к флоппи-диску.

Чтобы увидеть, что модуль флоппи на самом деле загружен, запустите /sbin/lsmod, который выдает список всех загруженных модулей на данный момент:

  osiris:~ $ /sbin/lsmod
  Module:        #pages:  Used by:
  floppy            11    0 (autoclean)

Примечание "(autoclean)" означает, что модуль будет автоматически выгружен kerneld, если будет неактивен больше одной минуты. Таким образом, 11 страниц памяти (= 44кб, одна страница - это 4 кб) будут использованы,только пока я обращаюсь к флоппи - если пауза в использовании превысит одну минуту, то эта память будет освобождена. Достаточно удобно, если вам не хватает памяти для ваших программ!


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

Несмотря на то, что 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,


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

Если вы запустите /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

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

Символьные устройства работают тем же образом. Например, драйвер стриммера 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

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

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

  alias eth0 ne

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

  options ne irq=5

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

  /sbin/modprobe ne irq=5

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


4.4. Формат кода программы (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 автоматически, без какой либо дополнительной настройки.


4.5. Протокол линии (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

4.6. Семейства сетевых протоколов (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

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


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

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

  alias iso9660 isofs

5. Устройства, требующие специальной настройки

Некоторые устройства требуют небольшой дополнительной настройки помимо обычных псевдонимов вида устройство-модуль.


5.1. Символьные устройства с главным номером 10: Мыши, сторожевые псы (watchdogs) и генераторы случайных чисел

Обычно периферийные устройства определяются при помощи их главных номеров, например ftape имеет главный номер (major) 27. Однако, если вы взглянете в каталог /dev, и поищете там символьные устройства с главным номером 10, вы увидите там набор абсолютно разных устройств, включая:

  • Мыши, подключенные к различным портам (шинная мышь (busmouse), PS/2-мыши)

  • Сторожевые псы (watchdog)

  • Генератор случайных чисел ядра random

  • Интерфейс расширенного управления питанием APM (Advanced Power Management)

Очевидно, что эти устройства контролируются несколькими различными модулями, а не одним. Поэтому, для настройки конфигурации kerneld для этих разнообразных устройств необходимо указать не только главное, но и дополнительное (minor) число:

        alias char-major-10-1 psaux     # Для мыши PS/2
        alias char-major-10-130 wdt     # Для сторожевого пса (watchdog) WDT

Для этого вам понадобится ядро версии не ранее 1.3.82; более ранние версии не передавали дополнительное число kerneld. Таким образом, kerneld не может выяснить, какому конкретно из подобных устройств понадобился соответствующий модуль.


5.2. Загрузка драйверов SCSI: Строка scsi_hostadapter

Драйвера SCSI-устройств состоят из двух частей: драйвера SCSI-адаптера (например, Adaptec 1542) и драйвера конкретного SCSI-устройства, которое вы используете, например, жесткий диск, CD-ROM или стриммер. Все это может быть загружено в виде модулей. Но при этом, если вы хотите обратиться, например, к CD-ROM-у, подключенному к SCSI-адаптеру Adaptec, ядро и kerneld знает лишь то, что необходимо загрузить модуль sr_mod для поддержки SCSI CD-ROM-ов - ему не известно, к какому SCSI-контроллеру подключен этот CD-ROM, и, соответственно, не известно какой модуль загружать для поддержки SCSI-контроллера.

Для разрешения этой проблемы можно добавить строку в /etc/conf.modules, в которой будет указано, который из многих доступных модулей драйверов SCSI-контроллеров надо загружать:

        alias scd0 sr_mod               # sr_mod для SCSI CD-ROM-а ...
        alias scsi_hostadapter aha1542  # ... требует драйвер SCSI Adaptec

Это работает только с ядрами версии 1.3.82 и выше.

Кроме того, это работает, если у вас только один SCSI-контроллер. Если у вас их несколько, то все немного усложняется.

В общем случае, нельзя заставить kerneld загрузить драйвер SCSI-адаптера, если драйвер для другого SCSI-адаптера уже загружен - вы должны либо встроить оба драйвера в ядро (не в модули), или загружать модули вручную.

Подсказка

Правда, существует способ заставить kerneld загружать несколько SCSI-драйверов. James Tsiao подсказал решение

Вы можете просто заставить kerneld загружать второй scsi-драйвер, установив зависимости в файле modules.dep вручную. Туда просто нужно добавить следующее:

      /lib/modules/2.0.30/scsi/st.o: /lib/modules/2.0.30/scsi/aha1542.o

Чтобы заставить kerneld загружать aha1542.o до загрузки st.o. Мой домашний компьютер настроен в точности так, как указано выше, и он прекрасно работает для всех моих дополнительных scsi-устройств, включая стриммер, cd-rom, и стандартные scsi-устройства. Трудность состоит в том, что команда depmod -a не может определить эти зависимости автоматически, поэтому необходимо добавлять их вручную, и при этом не запускать depmod -a при загрузке. Но после настройки kerneld прекрасно будет загружать aha1542.o.

Нужно помнить, что такой механизм работает, если у вас разные виды SCSI-устройств на разных SCSI-контроллерах, например, жесткие диски на одном, а CD-ROM-ы, стриммеры и прочие на другом.


5.3. Когда недостаточно просто загрузить модуль: Строка post-install

Иногда, простой загрузки модуля недостаточно для того, чтобы все нормально работало. Например, если у вас драйвер звуковой платы собран в виде модуля, то очень часто требуется установить необходимый уровень громкости звука. Только проблема состоит в том, что установки громкости обнуляются при следующей загрузке модуля. Ниже приведен способ решения от Ben Galliart ():

Конечное решение требует установки пакета setmix А затем добавим следующую строку к файлу /etc/conf.modules:

post-install sound /usr/local/bin/setmix -f /etc/volume.conf

Таким образом, после загрузки модуля звуковой платы, kerneld запускает команду, указанную в строке post-install sound. В результате звуковой модуль будет настроен командой /usr/local/bin/setmix -f /etc/volume.conf.

Этот путь можно использовать и для других модулей, например, модуль lp можно настроить программой tunelp, добавив строку

        post-install lp tunelp options

Для того, чтобы kerneld обработал эти опции, вам необходим kerneld версии 1.3.69f или выше.

Замечание

В более старых версиях этого мини-HOWTO упоминалась опция "pre-remove", которая могла использоваться для запуска команды до выгрузки модуля. Однако, она никогда не работала и ее использование вообще сомнительно - наиболее вероятно, что эта опция исчезнет из следующего релиза kerneld. Вся система "настроек" модулей сейчас претерпевает некоторые изменения, и поэтому могут появиться некоторые различия на момент чтения вами этого документа


6. Наблюдение за действиями kerneld

Если вы уже все перепробовали, и так и не выяснили, что же все-таки ядро просит сделать kerneld, существует способ просмотреть запросы, которые получает kerneld, и таким образом выяснить, что написать в /etc/conf.modules: Это утилита kdstat.

Эта маленькая, но очень полезная программа включена в пакет modules, но не собирается и не устанавливается по умолчанию. Чтобы собрать ее, зайдите в каталог исходных текстов kerneld и дайте команду make kdstat Затем, чтобы просмотреть информацию о действиях kerneld, запустите kdstat debug, и kerneld начнет выдавать информацию о том, что он делает, на консоль. Если вы потом попробуете запустить команду, которую хотите использовать, вы увидите запросы, которые получает kerneld; их затем можно поместить в /etc/conf.modules, написав соответствующие псевдонимы.

Для отключения вывода отладочной информации, наберите /sbin/kdstat nodebug.


7. Специфическое использование kerneld

Я знал, что вы спросите о том, как настроить модуль гашения экрана...

Каталог kerneld/GOODIES в пакете modules содержит пару интересных патчей (patch) к ядру для поддержки в kerneld модуля гашения экрана и звукового сигнала консоли; они пока не являются частью официального ядра. Поэтому вам надо будет установить патчи и пересобрать ядро.

Чтобы установить патч, используйте команду "patch":

  cd /usr/src/linux
  patch -s -p1 /usr/src/modules-*/kerneld/GOODIES/blanker_patch

Затем пересоберите и установите новое ядро.

Когда срабатывает программа гашения экрана (screensaver), kerneld запускает команду /sbin/screenblanker - это может быть все, что угодно, например скрипт, запускающий вашу любимую программу гашения экрана.

Когда ядру необходимо включить экран, оно посылает сигнал SIGQUIT процессу, запущенному из /sbin/screenblanker. Ваш скрипт или программа гашения экрана должны перехватить его и прекратить работу.


8. Обычные проблемы и то, чем вы можете заинтересоваться

8.1. Почему я получаю сообщение Cannot locate module for net-pf-X (Не могу найти модуль для net-pf-X), когда я запускаю ifconfig
8.2. После запуска kerneld, моя система сильно замедляется при установке ppp-соединения
8.3. kerneld не загружает мой SCSI-драйвер!
8.4. modprobe выдает сообщение о том, что gcc2_compiled не определено
8.5. Мой драйвер звуковой карты продолжает забывать настройки громкости и т.п.
8.6. DOSEMU требует модули - как заставить kerneld их загружать?
8.7. Почему я получаю сообщения Ouch, kerneld timed out, message failed ("Ох, kerneld превысил время ожидания, запрос не выполнен") ?
8.8. Команда mount не ждет, пока kerneld загрузит модуль файловой системы
8.9. kerneld не может загрузить модуль ncpfs
8.10. kerneld не может загрузить модуль smbfs
8.11. Я все построил в виде модулей, и теперь моя система не загружается, или kerneld не может загрузить модуль корневой файловой системы!
8.12. kerneld не запускается в момент загрузки системы - жалуется на libgdbm
8.13. Я получаю сообщение "Cannot load module xxx" ("Не могу загрузить модуль xxx"), но я только что собрал мое ядро без поддержки xxx!
8.14. Я пересобрал ядро и модули, и до сих пор получаю сообщения о неразрешимых символах (unresolved symbols) в модулях при загрузке
8.15. Я установил Linux с ядром версии 2.1 и теперь не могу загрузить НИ ОДИН модуль!
8.16. Что насчет работы с сетью 'дозвон-по-требованию' (dial-on-demand)?

8.1. Почему я получаю сообщение Cannot locate module for net-pf-X (Не могу найти модуль для net-pf-X), когда я запускаю ifconfig

В районе версии 1.3.80 ядра, код работы с сетью был изменен, чтобы поддерживать загрузку семейств сетевых протоколов (например, IPX, AX.25 и AppleTalk) в виде модулей. Поэтому был введен новый вид запроса ядра к kerneld: net-pf-X, где X - это число, определяющее протокол (см. /usr/src/linux/include/linux/socket.h для конкретных значений различных чисел). К сожалению, ifconfig вызывает своими действиями появление этих сообщений, поэтому у многих появляется пара таких сообщений в журнале загрузки системы и затем при запуске ifconfig для настройки устройства обратной петли. Эти сообщения безобидны, и вы можете запретить их, добавив соответствующие строки

        alias net-pf-3 off      # Забыть AX.25
        alias net-pf-4 off      # Забыть IPX
        alias net-pf-5 off      # Забыть AppleTalk

в /etc/conf.modules. Конечно вам не надо добавлять строчку о запрете IPX, если вы используете его в виде модуля.

8.2. После запуска kerneld, моя система сильно замедляется при установке ppp-соединения

На самом деле пару раз были такие вопросы. Скорее всего, это неправильное взаимодействие между kerneld и скриптом tkPPP, который используется на некоторых системах для настройки и мониторинга PPP соединения - скрипт видимо запускает в цикле ifconfig. Это, в свою очередь, заставляет kerneld каждый раз искать модули net-pf-X (см. выше), тем самым загружая систему и, возможно, забрасывая системный журнал потоком сообщений "Cannot locate module for net-pf-X" ("Не могу найти модуль для net-pf-X") . Пока нет известного решения, кроме того, как не использовать tkPPP, или его изменения для другого способа мониторинга соединения.

8.3. kerneld не загружает мой SCSI-драйвер!

Добавьте строчку SCSI hostadapter в файл /etc/conf.modules. Смотрите описание строки scsi_hostadapter выше.

8.4. modprobe выдает сообщение о том, что gcc2_compiled не определено

Это ошибка в утилитах modules, она проявляется только с пакетом binutils версии 2.6.0.9 и выше, и описана в примечаниях и дополнениях (releasenotes) binutils. Поэтому их и читайте. Или достаньте новую версию утилит modules, в которой эта ошибка исправлена.

8.5. Мой драйвер звуковой карты продолжает забывать настройки громкости и т.п.

Настройки модуля находятся внутри самого модуля на момент загрузки. Поэтому, когда kerneld автоматически выгружает модуль, все настройки, которые вы делали, теряются, и при следующей загрузке модуля настройки возвращаются в значения по умолчанию.

Вы можете заставить kerneld настроить модуль путем запуска программы после того, как модуль автоматически загружен. Смотрите раздел Pre/Post Install, описывающий строки post-install.

8.6. DOSEMU требует модули - как заставить kerneld их загружать?

Никак. Ни одна из версий dosemu - официальных или тестовых - не поддерживает загрузку модулей dosemu через kerneld. С другой стороны, если у вас ядро версии 2.0.26 и выше, вам просто не нужны дополнительные специальные модули dosemu - просто обновите свой dosemu до версии 0.66.1.

8.7. Почему я получаю сообщения Ouch, kerneld timed out, message failed ("Ох, kerneld превысил время ожидания, запрос не выполнен") ?

Когда ядро посылает запрос kerneld, оно ожидает подтверждения в течение секунды. Если kerneld не посылает это подтверждение, тогда и возникает это сообщение. Запрос посылается заново, и, в конце концов, должен пройти.

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

Если это происходит, а система не перегружена, попробуйте перезапустить kerneld. (Пошлите сигнал "Kill" процессу kerneld, а затем снова запустите его командой /usr/sbin/kerneld). Если проблема не исчезла, напишите отчет об ошибке по адресу , но, пожалуйста, сначала убедитесь в том, что версии вашего ядра и kerneld действительно новые. Проверьте соответствие требованиям файла linux/Documentation/Changes

8.8. Команда mount не ждет, пока kerneld загрузит модуль файловой системы

Было несколько сообщений о том, что команда mount(8) не ожидает, пока kerneld загружает модуль файловой системы. Команда lsmod, однако, показывает, что kerneld загружает модуль, и если сразу же повторить команду mount, то она выполнится успешно. Это, по-видимому, ошибка в утилитах modules версии 1.3.69f, которая возникает у некоторых пользователей дистрибутива Debian - ее можно исправить, установив последнюю версию утилит modules.

8.9. kerneld не может загрузить модуль ncpfs

Утилиты ncpfs необходимо собрать с ключом -DHAVE_KERNELD. Смотрите файл сборки (Makefile) утилит ncpfs.

8.10. kerneld не может загрузить модуль smbfs

У вас старая версия утилит smbmount. Установите последнюю версию (0.10 или новее), которую можно найти на ftp по адресу: Архив SMBFS на TSX-11

8.11. Я все построил в виде модулей, и теперь моя система не загружается, или kerneld не может загрузить модуль корневой файловой системы!

Нельзя же превращать в модули все подряд: Ядру должно хватать встроенных драйверов, чтобы смонтировать (mount) вашу корневую файловую систему, а также, чтобы запустить все программы, необходимые для запуска kerneld. [2] Поэтому нельзя превращать в модули:

  • драйвер жесткого диска, на котором находится ваша корневая файловая система

  • собственно драйвер корневой файловой системы

  • драйвер формата кода программ init, kerneld и им подобных

8.12. kerneld не запускается в момент загрузки системы - жалуется на libgdbm

Новые версии kerneld для работы используют библиотеку GNU dbm, libgdbm.so. Во многих установках этот файл находится в каталоге /usr/lib, а у вас, по-видимому, kerneld запускается до подключения файловой системы /usr. Одним из симптомов этого может быть то, что kerneld не запускается в процессе старта системы (из rc-скриптов), но запускается вручную после загрузки системы. Проблема решается либо путем переноса загрузки kerneld так, чтобы он загружался после подключения (mount) файловой системы /usr, либо путем переноса библиотеки gdbm в корневую файловую систему, т.е. в каталог /lib.

8.13. Я получаю сообщение "Cannot load module xxx" ("Не могу загрузить модуль xxx"), но я только что собрал мое ядро без поддержки xxx!

Дистрибутив Slackware (и, возможно, некоторые другие) включает в себя стандартный файл /etc/rc.d/rc.modules, в котором содержатся подробные команды modprobe на некоторые конкретные модули. Конкретный список модулей, для которых запускается команда modprobe, зависит от конфигурации начального ядра. Вы, по-видимому, перенастроили ваше ядро, исключив из него модули, которые используются командой modprobe в rc.modules, поэтому и возникает сообщение об ошибке. Исправьте ваш файл rc.modules, закоментировав строчки с модулями, которые вы больше не используете, или вообще удалите файл, чтобы kerneld загружал модули только тогда, когда они потребуются.

8.14. Я пересобрал ядро и модули, и до сих пор получаю сообщения о неразрешимых символах (unresolved symbols) в модулях при загрузке

Вы, видимо, переконфигурировали/пересобрали ваше ядро и исключили несколько модулей. Значит, у вас сохранились старые модули в районе каталога /lib/modules. Наиболее простое решение - удалить все подкаталоги каталога /lib/modules/x.y.z, и запустить make modules_install из каталога, содержащего исходные тексты ядра. Заметьте, что такая проблема существует, когда вы изменяете конфигурацию ядра без изменения его версии. Если вы получили это сообщение при переходе на новую версию ядра, то у вас, очевидно, другая проблема.

8.15. Я установил Linux с ядром версии 2.1 и теперь не могу загрузить НИ ОДИН модуль!

Ядра Linux-а нечетных версий являются тестовым. Поэтому можно ожидать, что такие вещи будут происходить время от времени. Одна из вещей, которая серьезно изменилась - это способ работы с модулями, а также способ и место загрузки модулей ядром в память. Кроме того, Richard Henderson теперь отвечает за разработку модулей ядра.

В двух словах, если вы хотите использовать модули с разрабатываемым ядром, вы должны

  • прочитать файл Documentation/Changes и выяснить, какие пакеты требуют обновления в вашей системе

  • использовать наиболее новый пакет modutils, доступный по адресу AlphaBits на Red Hat или на зеркале TSX-11

Если вы хотите использовать модули с ядром версии 2.1, я бы порекомендовал использовать ядро, как минимум, версии 2.1.29.

8.16. Что насчет работы с сетью 'дозвон-по-требованию' (dial-on-demand)?

kerneld ранее поддерживал возможность установления dial-up соединения по требованию системы; попытки посылать пакеты в сеть без соединения должны были заставлять kerneld запускать скрипт /sbin/request_route для установления PPP или SLIP соединения.

Но это была плохая идея. Alan Cox, один из знаменитых специалистов по сетям в Linux, написал в списке рассылки по ядру Linux, что

Утилита request-route устарела, не работает и не нужна [...] Она также убрана из структур 2.1.x.

Вместо использования скрипта request-route вместе с kerneld, я настоятельно советую вам установить пакет diald (Eric Schenk), доступный по адресу http://www.dna.lth.se/~erics/diald.html.

Примечания

[1]

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

[2]

(На самом деле, это не совсем так. Поздние версии 1.3.x и все 2.x версии ядер поддерживают режим загрузочного ram-диска, загружаемого LILO или LOADLIN-ом, и также существует возможность загрузить модули с этого "диска" практически в любой момент в процессе загрузки. Как это сделать, описано в файле linux/Documentation/initrd.txt, поставляемом с исходными текстами ядра.)