===== Модули ядра Linux =====
В этой статье мы рассмотрим модули ядра Linux, основы работы с ними, просмотр уже загруженных модулей, загрузку, установку и отключение модулей. А также полное отключение, добавление в черный список и добавление новых модулей ядра.
Модули ядра Linux собираются только под определенную версию ядра, есть способ запуска модуля независимо от версии ядра, если они совместимы с помощью dkms, но об этом мы поговорим позже.
Находятся все модули в папке /lib/modules/. Учитывая, что модули рассчитаны только для определенной версии ядра, то в этой папке создается отдельная подпапка, для каждой установленной в системе версии ядра. В этой папке находятся сами модули и дополнительные конфигурационные файлы, модули отсортированы по категориям, в зависимости от назначения например:
ls /lib/modules/5.4.0.45-generic/kernel/
{{ :linux:kernel:modules:1.png |}}
Перед тем как переходить к практике, давайте коротко рассмотрим основные команды для управления модулями.
* **lsmod** - посмотреть загруженные модули
* **modinfo** - информация о модуле
* **insmod** - загрузить модуль
* **rmmod** - удалить модуль
Работа с модулями ядра Linux выполняется, в основном, с помощью этих команд, но могут использовать и другие.
==== Все модули ====
Такая задача возникает нечасто, но если вы хотите посмотреть все установленные модули ядра Linux в системе, делается очень просто. Все модули расположены в папке /lib/modules, а поэтому очень просто вычислить их все одной командой, или даже просто зайти в папку файловым менеджером и посмотреть.
В Ubuntu команда будет выглядеть вот так:
dpkg -S *.ko | grep /lib/modules
{{ :linux:kernel:modules:2.png |}}
Можно смастерить такую конструкцию с помощью find:
find /lib/modules -name *.ko
Можем искать только для текущего ядра:
find /lib/modules/$(uname -r) -name *.ko
{{ :linux:kernel:modules:3.png |}}
Также, все модули записаны в конфигурационном файле **/lib/modules/modules.aliases**, поэтому мы можем просто посмотреть его содержимое:
modprobe -c
{{ :linux:kernel:modules:4.png |}}
Если хотим проверить установлен ли определенный модуль ядра Linux, отфильтруем вывод любой из команд с помощью grep:
find /lib/modules -name *.ko | grep vbox
{{ :linux:kernel:modules:5.png |}}
==== Что загружено? ====
Все информация о загруженных модулях хранится в файле **/proc/modules**, мы можем ее вывести командой:
cat /proc/modules
{{ :linux:kernel:modules:6.png |}}
Но для этого дела есть более цивилизованные методы. Это утилита lsmod и modinfo. Чтобы посмотреть загруженные модули ядра linux выполните:
sudo lsmod
{{ :linux:kernel:modules:7.png |}}
Удобно проверять загружен ли модуль с помощью grep:
sudo lsmod | grep vbox
А более подробную информацию о каждом модуле можно получить с помощью утилиты modinfo:
modinfo fuse
{{ :linux:kernel:modules:8.png |}}
Здесь вы можете увидеть файл модуля, его лицензию, автора и зависимости. Зависимости - это те модули, которые должны быть загружены для его нормальной работы. К сожалению, не для всех модулей доступно нормальное описание, но вы можете попробовать посмотреть описание зависимостей модуля.
==== Запуск модулей ядра ====
Загрузить модуль ядра Linux можно с помощью команд **modprobe** или **insmod**. Например, загрузим модуль vboxdrv
sudo modprobe vboxdrv
Чтобы загрузить модуль ядра linux с помощью insmod необходимо передать адрес файла модуля:
sudo insmod /lib/modules/4.1.20-11-default/weak-updates/misc/vboxdrv.ko
Напоминаю, что его можно узнать с помощью команды modinfo. Запуск модуля ядра Linux предпочтительно выполнять с помощью modprobe, поскольку эта команда не только находит файл модуля в файловой системе, но и загружает все его зависимости.
==== Удаление модулей ядра ====
Здесь аналогично две команды - modprobe, позволяет удалить модуль если ей передать опцию -r, а также есть команда rmmod. Начнем с modprobe:
sudo modprobe -r vboxdrv
Другая команда в этом случае выглядит немного проще:
sudo rmmod vboxdrv
{{ :linux:kernel:modules:9.png |}}
Если вы получили ошибку во время выгрузки модуля, например: **rmmod: ERROR: Module vboxdrv is in use by: vboxnetadp vboxnetflt**, значит он еще используется другими модулями, и сначала нужно выгрузить их. В данном случае это **vboxnetadp и vboxnetflt**. Правильно отработавшая команда не должна ничего возвращать.
rmmod vboxnetadp vboxnetflt
==== Блокирование загрузки модулей ====
Иногда, во время загрузки системы для используемых нами устройств, загружаются не те модули ядра Linux, они либо не поддерживают нужную функциональность либо конфликтуют с другими модулями. Ярким примером можно назвать загрузку драйвера b43 вместо brcmsmac для беспроводных адаптеров Broadcom. Чтобы решить эту проблему вы можете добавлять модули в черный список. Для этого достаточно добавить одну строчку в файл /etc/modprobe.d/blacklist.conf:
sudo vi /etc/modprobe.d/blacklist.conf
blacklist b43
{{ :linux:kernel:modules:10.png |}}
Этот код добавит в черный список модуль b43.
==== Автозагрузка модулей ====
Кроме чёрного списка существует отдельный каталог, в котором можно настроить автоматическую загрузку модулей при старте системы. Это **/etc/modules.load.d/**. Этот каталог тоже содержит конфигурационные файлы с расширением *.conf, в которых перечислены все модули, которые надо загружать при старте системы. Для добавления своего модуля можно воспользоваться файлом **/etc/modules.load.d/modules.conf**. Например, добавим brcmsmac:
sudo vi /etc/modules.load.d/modules.conf
''brcmsmac''
{{ :linux:kernel:modules:11.png |}}
==== Установка модулей ядра Linux ====
Собранные для этой версии ядра модули вы можете просто скопировать в нужную папку, собственно, мы так и поступаем, когда собираем ядро из исходников. Но с проприетарными драйверами и другими внешними драйверами, не поставляемыми в комплекте с ядром дело обстоит иначе.
Эти модули поддерживают несколько версий ядра, но для их установки используется специальная технология - DKMS (Dynamic Kernel Module Support).
Причем модуль, установленный таким образом один раз, будет пересобираться для каждой новой версии ядра автоматически. Обычно такие модули поставляются в виде пакетов, которые устанавливаются как и все другие приложения пакетным менеджером. Ручная установка модулей с помощью dkms выходит за рамки данной статьи.