Немного о модулях ядра Linux

()

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

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

Начнём с того что получим список модулей, используемых системой. Список загруженных модулей покажет команда:

lsmod

Так же список загруженный модулей доступен в файле "modules", виртуальной файловой системы "proc":

cat /proc/modules

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

Любой модуль ядра так же имеет "проекцию" в виртуальной файловой системе "sys". Эта проекция доступа как директория по пути "/sys/module/<имя_модуля>". Важно что такую проекцию имеют не только загруженные, но и встроенные модули ядра. Так что полный список используемых модулей, а не только загруженных, можно получить командой:

ls /sys/module/

Через sysfs так же можно получить доступ к настройкам модуля. Если у модуля есть какие-либо настройки то они доступны в виде файлов в поддиректории "parameters", директории модуля. Например список параметров модуля "acpi" можно увидеть командой:

ls /sys/module/acpi/parameters/

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

Для загружаемых модулей список параметров можно получить из вывода команды "modinfo". Оттуда же можно получить и описание этих параметров, описание модуля и другую информацию. Например для получения сведений о модуле "btusb" нужно выполнить следующую команду:

modinfo btusb

Для встроенных модулей описание параметров так легко получить не получится и придётся воспользоваться поиском в интернете. Вообще при наличии большого количества модулей найти тот, что потенциально связан с проблемой, достаточно трудно. Автор этих строк написал небольшой скрипт на Perl для визуализации используемых модулей и их параметров. Код доступен в репозитории на github.

Список модулей и их параметров в окне perl Kernel Module Info

Разобравшись с просмотром списка параметров и их описаний у модулей перейдём к их изменению. Обычно значения указываются при загрузке модуля примерно так:

modprobe btusb enable_autosuspend=N

В данном примере загружается модуль "btusb" с параметром "enable_autosuspend=N". Если модуль уже загружен то выполнение этой команды ни к чему не приведёт. Однако можно попытаться изменить параметр уже загруженного модуля командой вроде:

echo N | sudo tee -a /sys/module/btusb/parameters/enable_autosuspend

Однако не все модули допускают изменение параметров "на лету". В этом случае будет выдана ошибка "Permission denied". В такой ситуации можно попрообвать выгрузить модуль и загрузить заново с нужными параметрами, однако зачастую такие модули и выгрузить проблематично. Либо внести изменения в конфигурацию системы и перезагрузить машину.

Если модуль загружаемый то можно создать файл с произвольным именем в директории "/etc/modprobe.d/" (например "99_my.conf") где каждая строчка будет иметь вид:

options имя_модуля параметры

Например так:

options btusb enable_autosuspend=N

Эти же файлы могут использоваться не только для указания параметров модулей. Подробнее можно прочитать в man-странице "modprobe.d".

Так же параметры модулей можно передавать в командной строке ядра. Этот способ более универсален, так как позволяет управлять параметрами ещё и встроенных модулей. Дяя указания параметра модуля в командную строку ядра нужн добавить элемент вида:

имя_модуля.название_параметра=значение_параметра

Всё тот же пример с модулем btusb и параметром enable_autosuspend будет выглядеть так:

btusb.enable_autosuspend=N

В Debian и Ubuntu параметры ядра лучше всего дописывать в файле "/etc/default/grub" в строку "GRUB_CMDLINE_LINUX". После изменения этого параметра необходимо обновить всю конфигурацию загрузчика:

sudo update-grub

На этом пока всё. Надеемся что эта информация была полезна.

Ключевые слова: lsmod, modinfo, modprobe, pmodinfo, sysfs, модуль.

Подписаться на обновления: RSS-лента Канал в TamTam Telegram канал Канал в ICQ

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

Ladm 2020-04-28 17:00:45 (#)

в RH подобных дистрах (CentOS 7) надо:

yum install perl-Curses-UI kmod для текстового варианта
yum install perl-Gtk2 kmod для gtk соответственно.

у остальныч rpm-based думаю будет все аналогично.

MooSE 2020-05-02 08:04:22 (#)

Отвечая на коммент: с момента написания текста код на гитхабе сильно изменился:) Добавилась версия на ncurses и gtk2, а версию на Tk я планирую похоронить. Но сначала надо вынести общие части кода в отдельную библиотеку.
Новый комментарий

Жирный текстКурсивный текстПодчёркнутый текстЗачёркнутый текстПрограммный кодСсылкаИзображение




© 2006-2024 Вадим Калинников aka MooSE
Политика конфиденциальности