Лекция
Сразу хочу сказать, что здесь никакой воды про модули linux, и только нужная информация. Для того чтобы лучше понимать что такое модули linux , настоятельно рекомендую прочитать все из категории Операционная система 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. Об этом говорит сайт https://intellect.icu . В качестве параметра команда 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.
Пожалуйста, пиши комментарии, если ты обнаружил что-то неправильное или если ты желаешь поделиться дополнительной информацией про модули linux Надеюсь, что теперь ты понял что такое модули linux и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Операционная система LINUX
Из статьи мы узнали кратко, но содержательно про модули linux
Комментарии
Оставить комментарий
Операционная система LINUX
Термины: Операционная система LINUX