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

Solaris работает на основе динамически загружаемых модулей. Да, в Solaris существует файл настройки ядра, а именно /etc/system, но этот файл весьма мал, имеет ограниченные возможности и не редактируется системным администратором напрямую. В процессе установки нового программного пакета сценарий установки вносит все необходимые изменения в файл /etc/system. И даже такая ситуация встречается нечасто. Большинство драйверов, поставляемых с устройствами сторонних разработчиков, имеют собственные файлы настройки.

В системе Solaris необязательные драйверы устройств устанавливаются при помощи команды pkgadd. Синтаксис команды следующий:

  • pkgadd -d device packagename

Здесь device - имя устройства, раскадепате - название пакета с программными драйверами.

Установка драйвера устройства приводит к созданию сопутствующей записи в каталоге /dev, а также в каталоге /kernel/drv. В качестве примера рассмотрим драйвер Ethernet для сетевых карт, созданных на основе набора микросхем DEC 21140. Имя драйвера - dnet. В каталоге устройств существует устройство с именем /dev/dnet. В каталоге драйверов ядра присутствует динамически загружаемый модуль /kernel/drv/dnet, и, кроме того, существует файл настройки драйвера - /kernel/drv/dnet.conf. dnet является стандартным драйвером, но установка дополнительного драйвера приводит к созданию похожих файлов.

Завершив установку нового драйвера, создайте пустой файл с именем /reconfigure. Остановите работу системы и установите новое устройство. Перезапустите систему. Файл /reconfigure сигнализирует системе о необходимости проверить наличие новых устройств в системе. При загрузке система Solaris обнаружит новое устройство и загрузит модуль, содержащий драйвер этого устройства.


Команда Solaris ifconfig, описанная во всех подробностях в главе 6, имеет параметр modlist, приводящий к отображению модулей ядра, связанных с определенным сетевым интерфейсом TCP/IP. Например:

  • ifconfig dnetO modlist
0 arp 
1 ip 
2 dnet

Назначение каждого из перечисленных модулей ядра вполне очевидно, агр реализует протокол ARP для интерфейса Ethernet, ip реализует протоколы TCP/IP, применяемые в этой сети. Каждому из модулей соответствует файл настройки, хранящийся в каталоге /kernel/drv. Существуют файлы arp.conf, ip.conf и dnet.conf. Однако эти файлы предоставляют весьма ограниченные возможности настройки модулей. Для управления модулями система Solaris предоставляет команду ndd.

Чтобы выяснить, какие параметры настройки доступны для модуля, воспользуйтесь командой ndd с аргументом ?. Например, следующая команда перечисляет переменные для модуля агр:

  • ndd /dev/агр ?
? (read only)
arp_cache_report (read only)
arp_debug (read and write)
arp_cleanup_interval (read and write) 
arp_publish_interval (read and write) 
arp_publish_count (read and write)

Модуль arp предлагает шесть значений для настройки:

Значение только для чтения, приводит к отображению данного списка.

  • arp_cache_report - Значение только для чтения, приводит к отображению постоянных записей из буфера ARP. Команда агр предоставляет более удобный доступ к значениям из буфера. Описание команды агр приводится в главе 2.
  • arp_debug - Переменная, позволяющая включить отладку для протокола ARP. По умолчанию имеет значение 0, отладка выключена. Значение 1 приводит к включению отладки. Протокол ARP - очень старый и очень надежный, так что отладка ARP никогда не требуется.
  • arp_cleanup_interval - Переменная, определяющая срок хранения в буфере временных записей.
  • arp_publish_interval - Переменная, определяющая интервал посылки широковещательных сообщений с опубликованными адресами Ethernet.
  • arp_publish_count - Переменная, определяющая число широковещательных сообщений, посылаемых в ответ на запрос опубликованного адреса.

Стандартные значения переменных модуля агр замечательно работали для всех систем Solaris, с которыми мне приходилось сталкиваться. У меня еще ни разу не возникала необходимость изменять какое-либо из них. Второй из упомянутых по параметру modlist модулей представляет больший интерес.

Для получения параметров настройки модуля ip воспользуйтесь командой ndd /dev/ip ?. Существует почти 60 параметров! Из всех этих параметров мне приходилось настраивать лишь один: ip_forwarding.

Переменная ip_forwarding определяет, должен ли модуль ip считать, что система является маршрутизатором, и пересылать пакеты другим узлам. По умолчанию системы с одним сетевым интерфейсом не пересылают пакеты, а системы более чем с одним интерфейсом являются маршрутизаторами и выполняют такую пересылку. Нулевое значение переменной ip_forwarding отключает пересылку пакетов, даже для системы с несколькими сетевыми интерфейсами. Значение ip_forwarding, равное единице, включает пересылку пакетов, даже для системы с одним сетевым интерфейсом.

Время от времени приходится иметь дело с многосетевыми узлами, то есть с узлами, подключенными к нескольким сетям. Несмотря на несколько сетевых соединений такая система является обычным узлом, а не маршрутизатором. Чтобы система не вела себя как маршрутизатор, вмешиваясь в функционирование действительной системы маршрутизации, отключите пересылку пакетов IP следующим образом:

  • ndd /dev/ip ip_forwarding
1 
# ndd -set /dev/ip ip_forwarding 0 
# ndd /dev/ip ip_forwarding 
0 

В этом примере первая команда ndd запрашивает значение переменной ip_forwarding для модуля ip. Мы видим, что значение переменной равно 1 и пересылка пакетов включена. Вторая команда ndd при помощи параметра -set присваивает переменной ip_forwarding нулевое значение. Последняя команда повторно отображает значение переменной, чтобы мы могли удостовериться, что оно изменилось.

Команда pkgadd, параметр modlist команды ifconfig, а также команда ndd специфичны для системы Solaris. В других системах также существуют динамически загружаемые модули, но управляются они иными наборами команд.


Так, поддержка загружаемых модулей присутствует в Linux. Linux получает от загружаемых модулей все те же преимущества, что Solaris, и требует столь же ограниченного вмешательства в работу этих модулей. Обычно система Linux выполняет обнаружение устройств и определение соответствующих модулей в процессе первоначальной установки, не требуя участия системного администратора. Но это не всегда так. Устройства могут не определяться в процессе установки либо могут добавляться в уже существующую систему. Чтобы справиться с подобными ситуациями, необходимо знать команды Linux, применяемые для работы с загружаемыми модулями.

Чтобы выяснить, какие модули установлены в системе Linux, воспользуйтесь командой Ismod. Вот пример для системы Red Hat:

  • ft lsmod
Module    Size    Used by    
ide-cd    26848    0    (autoclean)
cdrom    27232    0    (autoclean) [ide-cd]
autofs    11264    1    (autoclean)
smc-ultra    6048    1    (autoclean)
8390    6816    0    (autoclean) [smc-ultra]
ipchains    38976    0    (unused)
nls_iso8859-1    2880    1    (autoclean)
nls_cp437    4384    1    (autoclean)
vfat    9392    1    (autoclean)
fat    32672    0    (autoclean) [vfat]

Загружаемые модули решают широкий спектр задач. Некоторые реализуют драйверы устройств (например, модуль smc-ultra является драйвером для сетевой карты SMC Ultra Ethernet), другие обеспечивают поддержку многочисленных типов файловых систем, применяемых в Linux, таких как файловая система IS08859 для компакт-дисков или система DOS FAT с поддержкой длинных имен файлов (vfat).

Каждая запись перечня, выведенного командой lsmod, начинается с имени модуля, за которым следует размер модуля. Как можно видеть по полю Size, модули имеют небольшие размеры. Часто модули используют другие модули для решения своей задачи. Взаимосвязь модулей известна в качестве зависимостей модулей, и эти зависимости отражены в перечне модулей. В нашем примере драйвер smc-ultra в своей работе полагается на модуль 8390, как можно видеть из записи для 8390 - она заканчивается строкой «[smc-ultra]». В записи для 8390 модули, зависящие от него, перечислены под заголовком Used by. Можно наблюдать и другие зависимости: vfat зависит от fat , a cdrom зависит от ide-cd.

Большинство записей примера содержит строку «(autoclean)». Строка означает, что модуль может удаляться из памяти автоматически, если он не задействован. autoclean - это параметр. Параметры работы модулей можно указывать, вручную загружая их при помощи команды insmod.


Модули загружаются вручную при помощи команды insmod. Команда очень простая - достаточно указать имя модуля. Например, чтобы загрузить драйвер устройства Зс509, наберите команду insmod Зс509. В этом случае модуль загружается без параметра autoclean. Чтобы драйвер удалялся из памяти автоматически, добавьте ключ-к в команду insmod: insmod -k Зс509.

Серьезное ограничение команды insmod связано с тем, что она ничего не смыслит в зависимостях модулей. Если загрузить при помощи этой команды модуль smc-ultra, это не приведет к автоматической загрузке необходимого модуля 8390. По этой причине для ручной загрузки модулей лучше использовать команду modprobe. Синтаксис этой команды также очень прост. Чтобы загрузить модуль smc-ultra, наберите просто modprobe smc-ultra.

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

Для удаления ненужных модулей применяется команда гmmod. Опять же, ее синтаксис прост: rmmod appletalk удаляет из системы драйвер appletalk. Необходимость в ручном удалении модулей возникает редко, поскольку, как говорилось при обсуждении autoclean, неиспользуемые модули удаляются системой автоматически.

Модуль smc-ultra реализует драйвер устройства Ethernet . Именно этот драйвер устройства используется в работе сетевого интерфейса системы Linux из нашего примера. Драйверы устройств могут встраиваться в ядро - такой вариант мы рассмотрим позже, либо динамически загружаться из модулей. Большинство драйверов устройств Ethernet используются в качестве загружаемых модулей. Модули драйверов Ethernet расположены в каталоге /lib/ modules. В случае системы Red Hat 7.1 драйверы устройств Ethernet находятся в каталоге /lib/modules/2.4.7-10/kernel/drivers/net, как можно видеть из следующего фрагмента:

  • ls /lib/modules/2.4.7-10/kernel/drivers/net
3c501.o    atp.o    eexpress.o    ni50l0.o    smc-ultra.o
3c503.o    bcm    epiclOO.o    ni52.o    starfire.o
3c505.o    bonding.o    eql.o    ni65.o    strip.o
3c507.o    bsd_comp.o    es3210.o    pcmcia    Sundance.o
3c509.o    cipe    ethl6i.o    pcnet32.o    sunhme.o
3c515.o    cs89x0.o    ethertap.o    plip.o    tlan.o
3c59x.o    de4x5.o    ewrk3.o    ppp_async.o    tokenring
8139too.o    de600.o    fc    ppp_deflate.o    tulip
82596.0    de62O.o    hamachi.o    ppp_generic.o    tun.o
8390.o    defxx.o    hpl00.o    ppp_synctty.o    via-rhine.o
ac3200.o    depca.o    hp.o    rcpci.o    wan
acenic.o    dgrs.o    hp-plus.o    sbl000.o    wavelan.o
aironet4500_card.o    dmfe.o    irda    shaper.o    wd. o
aironet4500_core.o    dummy.o    lance.o    sis900.o    winbond-840.o
aironet4500_proc.o    e1000.o    lne390.o    sk981in    yellowfin.o
appletalk    elOO.o    natsemi.o    skfp    
arlan.o    e2100.o    ne2k-pci.o    sk_g16.o    
arlan-proc.o    eeprolOO.o    ne3210.o    slip.o    
at1700.o    eepro.o    ne.o    smc-ultra32.o

Здесь перечислены все загружаемые драйверы сетевых устройств. Некоторые из них, например plip.o, относятся вовсе не к устройствам Ethernet. Большинство модулей можно легко опознать по именам файлов, в частности драйверы 3COM, SMC, NE2000, а также Ethernet Express.

Система Linux определяет наличие устройств Ethernet в процессе первоначальной установки и в случае присутствия подходящего драйвера устанавливает его. Если карта Ethernet не определена при установке системы либо добавлена в систему уже после установки, воспользуйтесь командой modprobe, чтобы загрузить драйвер устройства вручную. Если подходящий драйвер не входит в комплект поставки системы, возможно, понадобится самостоятельно скомпилировать нужный модуль.

Для корректной работы драйвера устройства необходима компиляция модуля с библиотеками, соответствующими текущему ядру системы. Иногда приходится загружать исходный текст драйвера и компилировать его самостоятельно на целевой системе. Исходные тексты драйверов многих устройств Ethernet доступны на сайте http://www.scyld.com, в замечательном хранилище сетевых драйверов для Linux. Комментарии, сопровождающие исходный текст драйвера, обычно содержат указание по командам для компиляции модуля.

После компиляции модуля скопируйте полученный объектный файл в соответствующий каталог иерархии /lib/modules. Воспользуйтесь командой modprobe для загрузки и проверки работоспособности драйвера. Следует отметить, большинство драйверов устройств сегодня доступно в формате пакетов RPM, что позволяет обойтись без компиляции.

В системах Linux часто применяются динамически загружаемые модули драйверов устройств. Однако прочие компоненты TCP/IP не загружаются во время работы, они встроены в ядро системы. В следующем разделе мы рассмотрим перекомпиляцию ядра системы Unix.