Лекция №19 - Модули Linux

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

Расположены модули в каталоге /lib/modules/версия ядра. Если у вас установлено несколько версий ядра, то, как правило, в каталоге /lib/modules/ будет находится такое же количество каталогов. Например:

igor@ubuntu:~/linux$ ls -1 /lib/modules/
2.6.31-14-generic
2.6.31-15-generic
2.6.31-16-generic

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

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

Module Size Used by
nfs_acl 2844 0
sunrpc 191712 1 nfs_acl
qnx4 8576 0

В примере видим, что работа модуля nfs_acl зависит от модуля sunrpc.

Чтобы загрузить модуль в оперативную память (и ядро могло использовать его функции) можно использовать команду insmod. Выполняется команда от имени суперпользователя и в качестве параметра нужно указать название файла модуля с указанием полного пути к файлу:

igor@ubuntu:~/linux$ sudo insmod /lib/modules/2.6.31-16-generic/kernel/fs/qnx4/qnx4.ko

Загружаемый модуль отвечает за возможность взаимодействия ядра с файловой системой qnx. Проверим загружен ли модуль:

igor@ubuntu:~/linux$ lsmod | grep qnx
qnx4 8576 0

Модуль загружен.

Чтобы выгрузить модуль из памяти предназначена команда rmmod. В качестве параметра команда rmmod принимает имя модуля в том виде в котором выдает его команда lsmod. При указании имени модуля можно пользоваться клавишей TAB для дополнения имени по первым буквам.

igor@ubuntu:~/linux$ sudo rmmod qnx4
igor@ubuntu:~/linux$ lsmod | grep qnx

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

igor@ubuntu:~/linux$ sudo rmmod sunrpc
ERROR: Module sunrpc is in use by nfs_acl

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

igor@ubuntu:~/linux$ sudo modprobe qnx4
igor@ubuntu:~/linux$ lsmod | grep qnx
qnx4 8576 0

Основное преимущество команды modprobe в том, что она в отличии от insmod умеет разбирать зависимости модулей. В начале я уже говорил, что модули могут зависеть от других модулей и если вы попытаетесь командой insmod загрузить модуль который зависит от другого модуля (и он не загружен), то получите ошибку. Например:

igor@ubuntu:~/linux$ sudo insmod /lib/modules/2.6.31-16-generic/kernel/fs/nfs_common/nfs_acl.ko
insmod: error inserting ‘/lib/modules/2.6.31-16-generic/kernel/fs/nfs_common/nfs_acl.ko’: -1 Unknown symbol in module

Команда modprobe может воспользоваться файлом /lib/modules/версия ядра/modules.dep в котором описаны все зависимости модулей. Если открыть этот файл и найти строку для модуля nfs_acl.ko, то можно увидеть, что он зависит от модуля sunrpc.ko. Командой insmod в данном случае пришлось бы воспользоваться дважды: сначала для загрузки модуля sunrpc.ko, а затем уже для модуля nfs_acl.ko:

igor@ubuntu:~/linux$ sudo insmod /lib/modules/2.6.31-16-generic/kernel/net/sunrpc/sunrpc.ko
igor@ubuntu:~/linux$ sudo insmod /lib/modules/2.6.31-16-generic/kernel/fs/nfs_common/nfs_acl.ko

Команда modprobe сама разбирает зависимости и загружает необходимые модули:

igor@ubuntu:~/linux$ sudo modprobe nfs_acl
igor@ubuntu:~/linux$ lsmod
Module Size Used by
nfs_acl 2844 0
sunrpc 191712 1 nfs_acl

Файл /lib/modules/версия ядра/modules.dep генерируется и обновляется командой depmod. Команда depmod просматривает информацию о каждом модуле и генерирует зависимости, которые записываются в файл /lib/modules/версия ядра/modules.dep.

Еще одна полезная команда при работе с модулями это команда modinfo. modinfo - считывает информацию о модуле и выдает ее на экран:

igor@ubuntu:~/linux$ modinfo nfs_acl
filename: /lib/modules/2.6.31-16-generic/kernel/fs/nfs_common/nfs_acl.ko
license: GPL
srcversion: F7BFA9B63618825ED524789
depends: sunrpc
vermagic: 2.6.31-16-generic SMP mod_unload modversions 586

Среди прочей видим информацию об имени файла модуля (строка filename), и зависимостях (строка depends).

Важный момент для понимания работы моделей состоит в том, что модуль во время своей загрузки может принимать параметры, которые могут влиять на его работу. Тема эта непростая и мы не будем рассматривать ее на этой лекции, но знать об этом нужно. Какие параметры может принимать модуль можно посмотреть командой modinfo. Не все модули могут принимать параметры (например у нашего модуля nfs_acl таких параметров нет), а вот в примере ниже показан модуль которому можно передавать параметры:

igor@ubuntu:~/linux$ modinfo snd-bt87x
filename: /lib/modules/2.6.31-16-generic/kernel/sound/pci/snd-bt87x.ko
license: GPL
parm: index:Index value for Bt87x soundcard (array of int)
parm: id:ID string for Bt87x soundcard (array of charp)
parm: enable:Enable Bt87x soundcard (array of bool)
parm: digital_rate:Digital input rate for Bt87x soundcard (array of int)
parm: load_all:Allow to load the non-whitelisted cards (bool)

Строки начинающиеся с parm и есть описания параметров.

Для передачи модулю параметров (и не только) существует файл /etc/modprobe.conf, который перед запуском и выгрузкой модуля просматривает программа modprobe и если для модуля описаны определенные дополнительные действия они будут выполнены. В некоторых дистрибутивах файл /etc/modprobe.conf отсутствует, вместо него команда modprobe использует конфигурационные файлы из каталога /etc/modprobe.d/. Подробнее об этом файле читайте в справке man modprobe.conf.

Статьи и новости схожей тематики:

Комментариев: 2

  1. Антон:

    А modprobe подгружает модуль только до перезагрузки. чтобы модули были всегда надо написать какой-то скрипт и запускать его например через init.d (rc5 к примеру)?

    Ответить

    Igorka Reply:

    Я уже и не помню, если честно. Нужно документацию смотреть.

    Ответить

Оставьте свой отзыв