Как найти модуль ядра

Как вы знаете из статьи что такое ядро Linux, ядро является монолитным. Это значит, что весь исполняемый код сосредоточен в одном файле. Такая архитектура имеет некоторые недостатки, например, невозможность установки новых драйверов без пересборки ядра. Но разработчики нашли решение и этой проблеме, добавив систему модулей.

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

В этой статье мы рассмотрим модули ядра Linux, основы работы с ними, просмотр уже загруженных модулей, загрузку, установку и отключение модулей. А также полное отключение, добавление в черный список и добавление новых модулей ядра.

Модули ядра Linux собираются только под определенную версию ядра, есть способ запуска модуля независимо от версии ядра, если они совместимы с помощью dkms, но об этом мы поговорим позже.

Находятся все модули в папке /lib/modules/. Учитывая, что модули рассчитаны только для определенной версии ядра, то в этой папке создается отдельная подпапка, для каждой установленной в системе версии ядра. В этой папке находятся сами модули и дополнительные конфигурационные файлы, модули отсортированы по категориям, в зависимости от назначения например:

ls /lib/modules/5.4.0.45-generic/kernel/

Перед тем как переходить к практике, давайте коротко рассмотрим основные команды для управления модулями.

  • lsmod — посмотреть загруженные модули
  • modinfo — информация о модуле
  • insmod — загрузить модуль
  • rmmod — удалить модуль

Работа с модулями ядра Linux выполняется, в основном, с помощью этих команд, но могут использовать и другие.

Все модули

Такая задача возникает нечасто, но если вы хотите посмотреть все установленные модули ядра Linux в системе, делается очень просто. Все модули расположены в папке /lib/modules, а поэтому очень просто вычислить их все одной командой, или даже просто зайти в папку файловым менеджером и посмотреть.

В Ubuntu команда будет выглядеть вот так:

dpkg -S *.ko | grep /lib/modules

Можно смастерить такую конструкцию с помощью find:

find /lib/modules -name *.ko

Можем искать только для текущего ядра:

find /lib/modules/$(uname -r) -name *.ko

Также, все модули записаны в конфигурационном файле /lib/modules/modules.aliases, поэтому мы можем просто посмотреть его содержимое:

modprobe -c

Если хотим проверить установлен ли определенный модуль ядра Linux, отфильтруем вывод любой из команд с помощью grep:

find /lib/modules -name *.ko | grep vbox

Что загружено?

Все информация о загруженных модулях хранится в файле /proc/modules, мы можем ее вывести командой:

cat /proc/modules

Но для этого дела есть более цивилизованные методы. Это утилита lsmod и modinfo. Чтобы посмотреть загруженные модули ядра linux выполните:

sudo lsmod

Удобно проверять загружен ли модуль с помощью grep:

sudo lsmod | grep vbox

А более подробную информацию о каждом модуле можно получить с помощью утилиты modinfo:

modinfo fuse

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

Запуск модулей ядра

Загрузить модуль ядра 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

Если вы получили ошибку во время выгрузки модуля, например: 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

Этот код добавит в черный список модуль b43.

Автозагрузка модулей

Кроме чёрного списка существует отдельный каталог, в котором можно настроить автоматическую загрузку модулей при старте системы. Это /etc/modules.load.d/. Этот каталог тоже содержит конфигурационные файлы с расширением *.conf, в которых перечислены все модули, которые надо загружать при старте системы. Для добавления своего модуля можно воспользоваться файлом /etc/modules.load.d/modules.conf. Например, добавим brcmsmac:

sudo vi /etc/modules.load.d/modules.conf

brcmsmac

Установка модулей ядра Linux

Собранные для этой версии ядра модули вы можете просто скопировать в нужную папку, собственно, мы так и поступаем, когда собираем ядро из исходников. Но с проприетарными драйверами и другими внешними драйверами, не поставляемыми в комплекте с ядром дело обстоит иначе. Эти модули поддерживают несколько версий ядра, но для их установки используется специальная технология — DKMS (Dynamic Kernel Module Support). Причем модуль, установленный таким образом один раз, будет пересобираться для каждой новой версии ядра автоматически. Обычно такие модули поставляются в виде пакетов, которые устанавливаются как и все другие приложения пакетным менеджером. Ручная установка модулей с помощью dkms выходит за рамки данной статьи.

Выводы

Скорее всего, вам редко придется возиться с этими модулями. Но работа с модулями ядра будет необходима, если ваш дистрибутив не поддерживает аппаратное обеспечение вашего устройства из коробки, а также когда вы работаете со сторонним программным обеспечением, таким как VirtualBox, Vmware и т д. Но очень полезно знать как обращаться с модулями, когда вам нужно добавить или удалить их. Даже если у вас нет необходимости в этом сейчас, вы можете протестировать, как все работает, чтобы быть вооруженным потом.

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

Время на прочтение
7 мин

Количество просмотров 247K


Ядро — это та часть операционной системы, работа которой полностью скрыта от пользователя, т. к. пользователь с ним не работает напрямую: пользователь работает с программами. Но, тем не менее, без ядра невозможна работа ни одной программы, т.е. они без ядра бесполезны. Этот механизм чем-то напоминает отношения официанта и клиента: работа хорошего официанта должна быть практически незаметна для клиента, но без официанта клиент не сможет передать заказ повару, и этот заказ не будет доставлен.
В Linux ядро монолитное, т.е. все его драйвера и подсистемы работают в своем адресном пространстве, отделенном от пользовательского. Сам термин «монолит» говорит о том, что в ядре сконцентрировано всё, и, по логике, ничего не может в него добавляться или удаляться. В случае с ядром Linux — это правда лишь отчасти: ядро Linux может работать в таком режиме, однако, в подавляющем большинстве сборок возможна модификация части кода ядра без его перекомпиляции, и даже без его выгрузки. Это достигается путем загрузки и выгрузки некоторых частей ядра, которые называются модулями. Чаще всего в процессе работы необходимо подключать модули драйверов устройств, поддержки криптографических алгоритмов, сетевых средств, и, чтобы уметь это правильно делать, нужно разбираться в строении ядра и уметь правильно работать с его модулями. Об этом и пойдет речь в этой статье.

В современных ядрах при подключении оборудования модули подключаются автоматически, а это событие обрабатывается демоном udev, который создает соответствующий файл устройства в каталоге «/dev». Все это выполняется в том случае, если соответствующий модуль корректно установлен в дерево модулей. В случае с файловыми системами ситуация та же: при попытке монтирования файловой системы ядро подгружает необходимый модуль автоматически, и выполняет монтирование.
Если необходимость в модуле не на столько очевидна, ядро его не загружает самостоятельно. Например, для поддержки функции шифрования на loop устройстве нужно вручную подгрузить модуль «cryptoloop», а для непосредственного шифрования — модуль алгоритма шифрования, например «blowfish».

Поиск необходимого модуля

Модули хранятся в каталоге «/lib/modules/<версия ядра>» в виде файлов с расширением «ko». Для получения списка всех модулей из дерева можно выполнить команду поиска всех файлов с расширением «ko» в каталоге с модулями текущего ядра:

find /lib/modules/`uname -r` -name ‘*.ko’

Полученный список даст некоторое представление о доступных модулях, их назначении и именах. Например, путь «kernel/drivers/net/wireless/rt2x00/rt73usb.ko» явно указывает на то, что этот модуль — драйвер устройства беспроводной связи на базе чипа rt73. Более детальную информацию о модуле можно получить при помощи команды modinfo:

# modinfo rt73usb

filename: /lib/modules/2.6.38-gentoo-r1/kernel/drivers/net/wireless/rt2x00/rt73usb.ko
license: GPL
firmware: rt73.bin
description: Ralink RT73 USB Wireless LAN driver.
version: 2.3.0
author: rt2x00.serialmonkey.com
depends: rt2x00lib,rt2x00usb,crc-itu-t
vermagic: 2.6.38-gentoo-r1 SMP preempt mod_unload modversions CORE2
parm: nohwcrypt:Disable hardware encryption. (bool)


Поле «firmware» указывает на то, что этот модуль сам по себе не работает, ему нужна бинарная микропрограмма устройства в специальном файле «rt73.bin». Необходимость в файле микропрограммы появилась в связи с тем, что интерфейс взаимодействия с устройством закрыт, и эти функции возложены на файл прошивки (firmware). Взять firmware можно с сайта разработчика, установочного диска, поставляемого вместе с устройством, или где-нибудь в репозиториях дистрибутива, затем нужно его скопировать в каталог «/lib/firmware», при чем имя файла должно совпадать с тем, что указано в модуле.
Следующее поле, на которое нужно обратить внимание — это поле «depends». Здесь перечислены модули, от которых зависит данный. Логично предположить, что модули друг от друга зависят, например модуль поддержки USB накопителей зависит от модуля поддержки USB контроллера. Эти зависимости просчитываются автоматически, и будут описаны ниже.
Последнее важное поле — «param». Здесь описаны все параметры, которые может принимать модуль при загрузке, и их описания. В данном случае возможен только один: «nohwcrypt», который, судя по описанию, отключает аппаратное шифрование. В скобках указан тип значения параметра.
Более подробную информацию о модуле можно прочитать в документации к исходным кодам ядра (каталог Documentation) в дереве исходных кодов. Например, найти код нужного видеорежима драйвера «vesafb» можно в файле документации «Documentation/fb/vesafb.txt» относительно корня дерева исходных кодов.

Загрузка и выгрузка модулей

Загрузить модуль в ядро можно при помощи двух команд: «insmod» и «modprobe», отличающихся друг от друга возможностью просчета и удовлетворения зависимостей. Команда «insmod» загружает конкретный файл с расширением «ko», при этом, если модуль зависит от других модулей, еще не загруженных в ядро, команда выдаст ошибку, и не загрузит модуль. Команда «modprobe» работает только с деревом модулей, и возможна загрузка только оттуда по имени модуля, а не по имени файла. Отсюда следует область применения этих команд: при помощи «insmod» подгружается файл модуля из произвольного места файловой системы (например, пользователь скомпилировал модули и перед переносом в дерево ядра решил проверить его работоспособность), а «modprobe» — для подгрузки уже готовых модулей, включенных в дерево модулей текущей версии ядра. Например, для загрузки модуля ядра «rt73usb» из дерева ядра, включая все зависимости, и отключив аппаратное шифрование, нужно выполнить команду:

# modprobe rt73usb nohwcrypt=0

Загрузка этого модуля командой «insmod» произойдет следующим образом:

# insmod /lib/modules/2.6.38-gentoo-r1/kernel/drivers/net/wireless/rt2x00/rt73usb.ko nohwcrypt=0

Но нужно помнить, что при использовании «insmod» все зависимости придется подгружать вручную. Поэтому эта команда постепенно вытесняется командой «modprobe».

После загрузки модуля можно проверить его наличие в списке загруженных в ядро модулей при помощи команды «lsmod»:

# lsmod | grep rt73usb

Module Size Used by
rt73usb 17305 0
crc_itu_t 999 1 rt73usb
rt2x00usb 5749 1 rt73usb
rt2x00lib 19484 2 rt73usb,rt2x00usb


Из вывода команды ясно, что модуль подгружен, а так же в своей работе использует другие модули.
Чтобы его выгрузить, можно воспользоваться командой «rmmod» или той же командой «modprobe» с ключем «-r». В качестве параметра обоим командам нужно передать только имя модуля. Если модуль не используется, то он будет выгружен, а если используется — будет выдана ошибка, и придется выгружать все модули, которые от него зависят:

# rmmod rt2x00usb
ERROR: Module rt2x00usb is in use by rt73usb

# rmmod rt73usb
# rmmod rt2x00usb


После выгрузки модуля все возможности, которые он предоставлял, будут удалены из таблицы ядра.

Для автоматической загрузки модулей в разных дистрибутивах предусмотрены разные механизмы. Я не буду вдаваться здесь в подробности, они для каждого дистрибутива свои, но один метод загрузки всегда действенен и удобен: при помощи стартовых скриптов. В тех же RedHat системах можно записать команды загрузки модуля прямо в «/etc/rc.d/rc.local» со всеми опциями.
Файлы конфигурация модулей находится в каталоге «/etc/modprobe.d/» и имеют расширение «conf». В этих файлах преимущественно перечисляются альтернативные имена модулей, их параметры, применяемые при их загрузке, а так же черные списки, запрещенные для загрузки. Например, чтобы вышеупомянутый модуль сразу загружался с опцией «nohwcrypt=1» нужно создать файл, в котором записать строку:

options rt73usb nohwcrypt=1

Черный список модулей хранится преимущественно в файле «/etc/modules.d/blacklist.conf» в формате «blacklist <имя модуля>». Используется эта функция для запрета загрузки глючных или конфликтных модулей.

Сборка модуля и добавление его в дерево

Иногда нужного драйвера в ядре нет, поэтому приходится его компилировать вручную. Это так же тот случай, если дополнительное ПО требует добавление своего модуля в ядро, типа vmware, virtualbox или пакет поддержки карт Nvidia. Сам процесс компиляции не отличается от процесса сборки программы, но определенные требования все же есть.
Во первых, нужен компилятор. Обычно установка «gcc» устанавливает все, что нужно для сборки модуля. Если чего-то не хватает — программа сборки об этом скажет, и нужно будет доустановить недостающие пакеты.
Во вторых, нужны заголовочные файлы ядра. Дело в том, что модули ядра всегда собираются вместе с ядром, используя его заголовочные файлы, т.к. любое отклонение и несоответствие версий модуля и загруженного ядра ведет к невозможности загрузить этот модуль в ядро.
Если система работает на базе ядра дистрибутива, то нужно установить пакеты с заголовочными файлами ядра. В большинстве дистрибутивов это пакеты «kernel-headers» и/или «kernel-devel». Для сборки модулей этого будет достаточно. Если ядро собиралось вручную, то эти пакеты не нужны: достаточно сделать символическую ссылку «/usr/src/linux», ссылающуюся на дерево сконфигурированных исходных кодов текущего ядра.
После компиляции модуля на выходе будет получен один или несколько файлов с расширением «ko». Можно попробовать их загрузить при помощи команды «insmod» и протестировать их работу.
Если модули загрузились и работают (или лень вручную подгружать зависимости), нужно их скопировать в дерево модулей текущего ядра, после чего обязательно обновить зависимости модулей командой «depmod». Она пройдется рекурсивно по дереву модулей и запишет все зависимости в файл «modules.dep», который, в последствие, будет анализироваться командой «modprobe». Теперь модули готовы к загрузке командой modprobe и могут загружаться по имени со всеми зависимостями.
Стоит отметить, что при обновлении ядра этот модуль работать не будет. Нужны будут новые заголовочные файлы и потребуется заново пересобрать модуль.

«Слушаем» что говорит ядро

При появлении малейших неполадок с модулем, нужно смотреть сообщения ядра. Они выводятся по команде «dmesg» и, в зависимости от настроек syslog, в файл «/var/log/messages». Сообщения ядра могут быть информативными или отладочными, что поможет определить проблему в процессе работы модуля, а могут сообщать об ошибке работы с модулем, например недостаточности символов и зависимостей, некорректных переданных параметрах. Например, выше рассмотренный модуль «rt73usb» требует параметр типа bool, что говорит о том, что параметр может принимать либо «0», либо «1». Если попробовать передать «2», то система выдаст ошибку:

# modprobe rt73usb nohwcrypt=2
FATAL: Error inserting rt73usb (/lib/modules/2.6.38-gentoo-r1/kernel/drivers/net/wireless/rt2x00/rt73usb.ko): Invalid argument

Ошибка «Invalid argument» может говорить о чем угодно, саму ошибку ядро на консоль написать не может, только при помощи функции «printk» записать в системный лог. Посмотрев логи можно уже узнать в чем ошибка:

# dmesg | tail -n1
rt73usb: `2′ invalid for parameter `nohwcrypt’

В этом примере выведена только последняя строка с ошибкой, чтобы не загромаждать статью. Модуль может написать и несколько строк, поэтому лучше выводить полный лог, или хотя бы последние строк десять.
Ошибку уже легко найти: значение «2» неприемлемо для параметра «nohwcrypt». После исправления, модуль корректно загрузится в ядро.

Из всего сказанного можно сделать один вывод: ядро Linux играет по своим правилам и занимается серьезными вещами. Тем не менее — это всего лишь программа, оно, по сути, не сильно отличается от других обычных программ. Понимание того, что ядро не так уж страшно, как кажется, может стать первым шагом к пониманию внутреннего устройства системы и, как результат, поможет быстро и эффективно решать задачи, с которыми сталкивается любой администратор Linux в повседневной работе.

Сейчас каждая операционная система имеет разделение на пользовательский режим и режим ядра, в этой статье разбирается ядро Linux и его модули.

Ядро операционной системы

Все процессы, работающие в системе, работают либо в режиме ядра, либо в пользовательском режиме. Процессы, работающие в режиме ядра получают больше прав, чем в пользовательском режиме. В режиме ядра работает само ядро и могут работать другие подсистемы.

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

  • связь с оборудованием, и предоставление ресурсов компьютера всем процессам в системе;
  • управление всеми процессами в системе;
  • в зависимости от типа ядра, у него могут быть и другие функции. Либо эти функции могут быть вынесены из ядра, но работать в режиме ядра. Или могут вообще быть вынесены из режима ядра в пользовательский режим.

Вообще, ядро можно рассматривать как главную программу, которая устанавливает правила, по которым работают остальные программы. Все в системе должно работать по правилам ядра. А ядро подчиняется правилам, которые диктует оборудование (архитектура процессора, оперативная память, системная плата).

Типы ядер

Существуют следующие типы ядер:

  • Монолитные — очень много функций, помимо основных, заложено в ядро. Это и управление файловой системой, работа с драйверами оборудования, работа с сетью. Это увеличивает размер ядра, усложняет его, делает ядро менее безопасным, но упрощает обмен между процессами, создает более легкий доступ к оборудованию. Ядро Linux является именно таким ядром.
  • Микроядра — взаимодействуют только с процессором, и управляют процессами в системе. Все остальное вынесено из ядра и работает в режиме пользователя.
  • Гибридные ядра — пытаются как можно больше вынести из ядра, но взаимодействуют не только с процессором. Ядро Windows является гибридным.

Особенность ядра Linux

В Linux все является файлом (файл, каталог, сокет, оборудование). Об этом я уже писал здесь.

Ядро написано на языке C и является переносимым. Оно реализует многозадачность и многопоточность, виртуальную память и многое другое. Также оно соответствует стандартам POSIX, это означает что программа написанная по стандартам POSIX будет работать на всех дистрибутивах Linux.

Официальный сайт ядра Linux: https://www.kernel.org/. Здесь можно найти исходники и списки изменений разных версий ядра.

Создатель и основной руководитель ядра Linux – Линус Торвальдс:

Линус Торвальдс

Линус Торвальдс

Файлы ядра

Файл ядра находится в каталоге /boot и начинается со слова vmlinuz, а дальше идет версия:

alex@deb-11:~$ ls -l /boot/vmlinuz*
-rw-r--r-- 1 root root 6962816 авг 13 16:25 /boot/vmlinuz-5.10.0-17-amd64
-rw-r--r-- 1 root root 6962016 сен  2 16:54 /boot/vmlinuz-5.10.0-18-amd64

alex@ubu-22:~$ ls -l /boot/vmlinuz*
lrwxrwxrwx 1 root root       25 ноя 16 07:00 /boot/vmlinuz -> vmlinuz-5.15.0-53-generic
-rw------- 1 root root 11543392 окт 13 07:49 /boot/vmlinuz-5.15.0-52-generic
-rw------- 1 root root 11548224 окт 17 18:41 /boot/vmlinuz-5.15.0-53-generic
lrwxrwxrwx 1 root root       25 ноя 16 07:00 /boot/vmlinuz.old -> vmlinuz-5.15.0-52-generic

По умолчанию Debian и Ubuntu хранят старые ядра после обновления, поэтому здесь находятся несколько файлов.

Посмотрим что лежит еще в каталоге /boot:

alex@deb-11:~$ ls -l /boot/
итого 70660
-rw-r--r-- 1 root root   236286 авг 13 16:25 config-5.10.0-17-amd64
-rw-r--r-- 1 root root   236286 сен  2 16:54 config-5.10.0-18-amd64
drwxr-xr-x 5 root root     4096 сен 13 12:23 grub
-rw-r--r-- 1 root root 28960621 сен  9 10:49 initrd.img-5.10.0-17-amd64
-rw-r--r-- 1 root root 28979132 сен 12 15:00 initrd.img-5.10.0-18-amd64
-rw-r--r-- 1 root root       83 авг 13 16:25 System.map-5.10.0-17-amd64
-rw-r--r-- 1 root root       83 сен  2 16:54 System.map-5.10.0-18-amd64
-rw-r--r-- 1 root root  6962816 авг 13 16:25 vmlinuz-5.10.0-17-amd64
-rw-r--r-- 1 root root  6962016 сен  2 16:54 vmlinuz-5.10.0-18-amd64

alex@ubu-22:~$ ls -l /boot/
total 244772
-rw-r--r-- 1 root root    261861 окт 13 07:40 config-5.15.0-52-generic
-rw-r--r-- 1 root root    261837 окт 17 18:36 config-5.15.0-53-generic
drwxr-xr-x 5 root root      4096 ноя 16 07:00 grub
lrwxrwxrwx 1 root root        28 ноя 16 07:00 initrd.img -> initrd.img-5.15.0-53-generic
-rw-r--r-- 1 root root 107247090 ноя  9 06:19 initrd.img-5.15.0-52-generic
-rw-r--r-- 1 root root 107269841 ноя 16 07:00 initrd.img-5.15.0-53-generic
lrwxrwxrwx 1 root root        28 ноя 16 07:00 initrd.img.old -> initrd.img-5.15.0-52-generic
-rw------- 1 root root   6249017 окт 13 07:40 System.map-5.15.0-52-generic
-rw------- 1 root root   6250186 окт 17 18:36 System.map-5.15.0-53-generic
lrwxrwxrwx 1 root root        25 ноя 16 07:00 vmlinuz -> vmlinuz-5.15.0-53-generic
-rw------- 1 root root  11543392 окт 13 07:49 vmlinuz-5.15.0-52-generic
-rw------- 1 root root  11548224 окт 17 18:41 vmlinuz-5.15.0-53-generic
lrwxrwxrwx 1 root root        25 ноя 16 07:00 vmlinuz.old -> vmlinuz-5.15.0-52-generic
  • vmlinuz – ядро;
  • initrd.img – образ стартовой файловой системы, которая необходима чтобы запустить ядро;
  • System.map – файл для управления памятью;
  • config – файл параметров с которыми собрано текущее ядро;
  • Каталог grub – файлы загрузчика grub, про него я рассказывал здесь.

Модули ядра

Так как ядро в Linux – монолитное. То все драйвера должны быть включены в ядро. Вначале так и было, но когда возможного оборудования стало слишком много, и всё многообразие драйверов не могли поместить в одно ядро, придумали динамически подгружаемые модули ядра.

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

Вот размер ядра:

alex@deb-11:~$ du -h /boot/vmlinuz-5.10.0-18-amd64
6,7M    /boot/vmlinuz-5.10.0-18-amd64

alex@ubu-22:~$ du -h /boot/vmlinuz-5.15.0-53-generic
12M     /boot/vmlinuz-5.15.0-53-generic

Базовый набор модулей обычно включается в initrd.img, который распаковывается в момент загрузки системы. После того, как система будет загружена, ядро прощупывает систему дополнительно и подгружает необходимые модули устройств, так обнаруживаются новые устройства.

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

Использование lsmod

Команда lsmod берет информацию из /proc/modules чтобы вывести список уже загруженных модулей:

$ lsmod | head -n 20
Module                        Size  Used by
binfmt_misc                   24576  1
snd_hda_codec_generic         98304  2
ledtrig_audio                 16384  1 snd_hda_codec_generic
snd_hda_intel                 57344  0
snd_intel_dspcfg              28672  1 snd_hda_intel
soundwire_intel               45056  1 snd_intel_dspcfg
soundwire_generic_allocation  16384  1 soundwire_intel
snd_soc_core                  319488  1 soundwire_intel
snd_compress                  32768  1 snd_soc_core
soundwire_cadence             36864  1 soundwire_intel
snd_hda_codec                176128  2 snd_hda_codec_generic,snd_hda_intel
snd_hda_core                 110592  3 snd_hda_codec_generic,snd_hda_intel,snd_hda_codec
qxl                           77824  0
snd_hwdep                     16384  1 snd_hda_codec
drm_ttm_helper                16384  1 qxl
soundwire_bus                 94208  3 soundwire_intel,soundwire_generic_allocation,soundwire_cadence
joydev                        28672  0
ttm                          114688  2 qxl,drm_ttm_helper
snd_pcm                      143360  6 snd_hda_intel,snd_hda_codec,soundwire_intel,snd_compress,snd_soc_core,snd_hda_core

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

$ find /lib/modules/$(uname -r) -name *.ko

Вывод предыдущей команды будет очень большим, например в Ubuntu сейчас более 6040 подгружаемых модулей.

Использование modinfo

Команда modinfo нужна для получения информации о модуле. Вы можете указать полное имя файла или имя модуля.

Для выполнения этой команды в Ubuntu не обязательно использовать sudo, а в Debian нужно:

alex@ubu-22:~$ modinfo vfat
name:           vfat
filename:       (builtin)
author:         Gordon Chaffee
description:    VFAT filesystem support
license:        GPL
file:           fs/fat/vfat
alias:          fs-vfat

alex@deb-11:~$ sudo modinfo vfat
filename:       /lib/modules/5.10.0-18-amd64/kernel/fs/fat/vfat.ko
author:         Gordon Chaffee
description:    VFAT filesystem support
license:        GPL
alias:          fs-vfat
depends:        fat
retpoline:      Y
intree:         Y
name:           vfat
vermagic:       5.10.0-18-amd64 SMP mod_unload modversions
sig_id:         PKCS#7
signer:         Debian Secure Boot CA
sig_key:        32:A0:28:7F:84:1A:03:6F:A3:93:C1:E0:65:C4:3A:E6:B2:42:26:43
sig_hashalgo:   sha256
signature:      A0:1A:81:0B:41:A4:6C:82:1A:2F:85:91:BD:E3:51:69:CA:95:4E:EF:
                BB:29:9E:D5:DF:79:26:EC:85:2E:B7:2E:53:E7:4F:16:F5:00:C3:F2:
                C2:F0:85:51:8F:C3:2A:51:EF:0E:85:32:6F:7D:8D:59:6D:37:5F:7B:
                76:71:8A:C4:D3:96:39:3E:F7:EE:E5:59:ED:79:65:65:51:4C:3F:F4:
                F6:05:C7:61:D6:0D:91:B3:71:19:CA:81:B8:D6:90:CA:21:44:6A:FC:
                B0:B2:AE:11:7D:D9:EA:E5:E9:93:6B:A0:30:F2:20:95:97:84:E4:81:
                CA:26:09:3E:78:1A:B6:BB:21:7B:DC:B2:18:C6:2B:C9:1B:8F:60:7A:
                D3:8B:CB:21:15:C1:E5:88:75:06:07:DC:DC:B0:E9:5F:DF:C5:6F:20:
                DE:39:EA:7D:13:83:D1:92:7A:3A:0C:34:27:F2:50:43:5B:EA:68:E8:
                25:B2:A7:81:49:38:E7:8A:1C:25:74:B0:00:DC:CB:5A:52:D7:07:E0:
                32:12:D6:ED:0B:CC:90:49:00:5B:DB:7C:5B:5C:9F:44:C1:DF:51:EC:
                19:A7:96:2F:5A:7C:BF:E5:C9:9E:AB:08:2D:05:83:18:B8:F0:87:7E:
                03:C3:53:64:21:0D:35:54:B4:04:EF:39:32:71:0E:19

Выше вы можете заметить разницу. В Ubuntu вместо имени файла написано – (builtin). А в Debian/lib/modules/5.10.0-18-amd64/kernel/fs/fat/vfat.ko. Если вы вместо имени видите (builtin), значит этот модуль встроен в ядро.

Утилита modinfo показывает следующую информацию:

  • filename – полный путь к файлу (если это не встроенный в ядро модуль);
  • author – информация о создателе;
  • description – описание;
  • license – лицензия;
  • alias – псевдоним (их может быть несколько);
  • depends – зависимость, то есть без этого модуля, он не загрузится. Зависимостей может быть несколько. (не бывает для встроенных в ядро модулей);
  • retpoline – указывает, что модуль построен с поддержкой защиты от Spectre;
  • intree – все модули ядра начинают разработку как out-of-tree. Как только модуль принимается для включения в ядро, он становится модулем in-tree. Модули без этого флага (установленного в N) могут испортить ядро;
  • name – имя модуля;
  • vermagic – это строка используется для проверки, был ли модуль ядра скомпилирован для конкретной версии ядра или нет (не бывает для встроенных в ядро модулей);
  • parm – если у модуля есть параметры, то они записываются сюда.

Вы можете использовать опцию -F для ограничения вывода по конкретному полю:

alex@ubu-22:~$ modinfo -F description vfat
VFAT filesystem support

Если вы не укажете полное имя файла, modinfo ищет модуль в /lib/modules/<версия_ядра>/kernel

Версию вашего ядра можно получить командой uname -r:

alex@deb-11:~$ uname -r
5.10.0-18-amd64

alex@ubu-22:~$ uname -r
5.15.0-52-generic

Для поиска модулей ядра можно воспользоваться такой командой:

alex@deb-11:~$ ls /lib/modules/`uname -r`/kernel
arch  block  crypto  drivers  fs  lib  mm  net  sound  virt

alex@ubu-22:~$ ls /lib/modules/`uname -r`/kernel
arch   crypto   fs      lib  net      sound   v4l2loopback
block  drivers  kernel  mm   samples  ubuntu  zfs

Вы можете найти некоторые простые текстовые файлы в каталоге:

$ ls /lib/modules/`uname -r`
build          modules.alias.bin          modules.builtin.modinfo  modules.order        vdso
initrd         modules.builtin            modules.dep              modules.softdep
kernel         modules.builtin.alias.bin  modules.dep.bin          modules.symbols
modules.alias  modules.builtin.bin        modules.devname          modules.symbols.bin
  • modules.dep – перечислены зависимости;
  • modules.alias – перечислены псевдонимы;
  • modules.builtin – содержит модули, которые встроены в ядро. К ним относятся драйверы необходимые для основных функциональных возможностей в большинстве систем.

Если вы заходите получить имя файла модуля с помощью modinfo а модуль окажется встроенным, то попробуйте поискать информацию в файле modules.builtin:

alex@deb-11:~$ sudo modinfo processor -F filename
(builtin)

alex@deb-11:~$ grep processor /lib/modules/`uname -r`/modules.builtin
kernel/drivers/acpi/processor.ko

alex@ubu-22:~$ modinfo processor -F filename
(builtin)
(builtin)

alex@ubu-22:~$ grep processor /lib/modules/`uname -r`/modules.builtin
kernel/drivers/acpi/processor.ko
kernel/drivers/xen/xen-acpi-processor.ko

Использование modprobe

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

Раньше использовались команды: insmod – для загрузки модуля, и rmmod – для извлечения модуля.

Команда modprobe заменила insmod и rmmod, при этом modprobe следит за зависимостями и выгружает или загружает модули с их учётом.

Я буду использовать модуль uhci_hcd для этого примера. Используйте modinfo, чтобы увидеть зависимости этого модуля:

alex@ubu-22:~$ modinfo uhci_hcd
name:           uhci_hcd
filename:       (builtin)
license:        GPL
file:           drivers/usb/host/uhci-hcd
description:    USB Universal Host Controller Interface driver
author:         Linus 'Frodo Rabbit' Torvalds, Johannes Erdfelt, Randy Dunlap, Georg Acher, Deti Fliegl, Thomas Sailer, Roman Weissgaerber, Alan Stern
softdep:        pre: ehci_pci
parm:           ignore_oc:ignore hardware overcurrent indications (bool)
parm:           debug:Debug level (int)


alex@deb-11:~$ sudo modinfo uhci_hcd
filename:       /lib/modules/5.10.0-18-amd64/kernel/drivers/usb/host/uhci-hcd.ko
license:        GPL
description:    USB Universal Host Controller Interface driver
author:         Linus 'Frodo Rabbit' Torvalds, Johannes Erdfelt, Randy Dunlap, Georg Acher, Deti Fliegl, Thomas Sailer, Roman Weissgaerber, Alan Stern
softdep:        pre: ehci_pci
alias:          pci:v*d*sv*sd*bc0Csc03i00*
depends:        usbcore,usb-common
retpoline:      Y
intree:         Y
name:           uhci_hcd
vermagic:       5.10.0-18-amd64 SMP mod_unload modversions
sig_id:         PKCS#7
signer:         Debian Secure Boot CA
sig_key:        32:A0:28:7F:84:1A:03:6F:A3:93:C1:E0:65:C4:3A:E6:B2:42:26:43
sig_hashalgo:   sha256
signature:      0A:D2:BF:AF:B5:35:14:B4:7D:BC:73:6F:06:66:9A:F1:5D:94:67:99:
                CA:72:89:45:7C:3E:95:B1:00:19:F3:59:D6:D2:74:82:E8:AA:85:F8:
                60:A0:AB:CB:98:E1:A5:E4:7F:A6:3D:48:29:9B:4C:01:33:61:61:C0:
                A3:E5:80:B3:E6:3A:78:B0:F1:DB:D0:AF:A6:CA:41:EA:B2:59:EB:E6:
                4B:0C:80:69:3E:06:7A:BB:E9:DD:16:C6:B4:D2:78:10:68:D2:F0:0F:
                93:62:18:80:71:D3:42:3D:81:D6:3E:48:B5:85:FE:FB:77:C0:03:68:
                23:50:9B:99:F1:F8:8C:AF:9F:93:2D:28:16:AF:36:75:1E:72:54:AF:
                A6:3A:DD:43:32:6C:4C:39:1C:66:B9:77:B2:E2:9C:76:45:D7:0D:85:
                AE:38:9B:4A:69:00:B1:AA:92:5A:85:86:89:04:82:F7:DA:40:D4:2E:
                9D:D6:B9:AE:5C:44:01:6C:B6:95:8E:3C:02:06:18:D0:E1:D2:6A:18:
                E4:39:FF:0C:1D:62:C5:2D:16:C6:51:2F:24:B8:3E:DB:3A:8D:11:C6:
                48:F9:AC:A7:C2:83:95:88:D3:28:EC:C1:E9:6A:B0:B1:54:5E:76:E6:
                A6:00:1A:79:44:66:61:BB:9B:8C:7B:B4:B3:F6:EA:8C
parm:           ignore_oc:ignore hardware overcurrent indications (bool)
parm:           debug:Debug level (int)

Как видите, в Ubuntu этот модуль встроен в ядро. А в Debian это подгружаемый модуль ядра. Поэтому дальнейшие действия я буду выполнять в Debian.

Найдём зависимости для uhci_hcd:

$ sudo modinfo -F depends uhci_hcd
usbcore,usb-common

Как вы видите, этот модуль имеет зависимость от usbcore. А он зависит от usb-common:

$ sudo modinfo -F depends usbcore
usb-common

На этом зависимости кончаются:

$ sudo modinfo -F depends usb-common

Если вы хотите, вручную загрузить или выгрузить драйвер, используйте modprobe с опцией:

  • -i, чтобы загрузить модуль;
  • -r, чтобы выгрузить модуль;
  • -n чтобы показать, что будет сделано, не делая это;
  • а опция -v покажет подробную информацию.

Например:

$ sudo modprobe -nrv uhci_hcd
rmmod uhci_hcd
rmmod ehci_hcd

То есть, при выгрузке uhci_hcd выгрузится еще и ehci_hcd. Мы можем выполнить эти две команды (rmmod uhci_hcdrmmod ehci_hcd), или выполнить одну modprobe.

Давайте выгрузим этот модуль:

$ sudo modprobe -rv uhci_hcd
rmmod uhci_hcd
rmmod ehci_hcd
rmmod usbcore
rmmod usb_common

И загрузим модули обратно:

$ sudo modprobe -iv uhci_hcd
insmod /lib/modules/5.10.0-18-amd64/kernel/drivers/usb/common/usb-common.ko
insmod /lib/modules/5.10.0-18-amd64/kernel/drivers/usb/core/usbcore.ko
insmod /lib/modules/5.10.0-18-amd64/kernel/drivers/usb/host/uhci-hcd.ko

$ sudo modprobe -iv ehci-hcd
insmod /lib/modules/5.10.0-18-amd64/kernel/drivers/usb/host/ehci-hcd.ko

Вы не можете выгрузить модуль если он используется или если этот модуль встроен в ядро. Именно поэтому я не стал приводить пример на Ubuntu:

$ sudo modprobe -rv uhci_hcd
modprobe: FATAL: Module uhci_hcd is builtin

Параметры модулей

Некоторые модули имеют параметры. Например, драйвер устройства должен знать, какие IRQ или порт I/O использовать. Следующий пример показывает информацию о модуле usbhid, который имеет несколько таких параметров:

$ modinfo -F parm usbhid
mousepoll:Polling interval of mice (uint)
jspoll:Polling interval of joysticks (uint)
kbpoll:Polling interval of keyboards (uint)
ignoreled:Autosuspend with active leds (uint)
quirks:Add/modify USB HID quirks by specifying  quirks=vendorID:productID:quirks where vendorID, productID, and quirks are all in 0x-prefixed hex (array of charp)

Чтобы изменить параметры, нужно указать их при загрузке модуля в командной строке modprobe.

Автозагрузка модулей ядра

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

$ sudo modprobe 8021q

Проверить, загружен модуль или нет можно так:

$ sudo lsmod | grep 8021q
8021q                  40960  0
garp                   16384  1 8021q
mrp                    20480  1 8021q

Ну а чтобы в дальнейшем, после перезагрузки, этот модуль загружался, нужно добавить его название в конфиг в каталог /etc/modules-load.d:

$ sudo nano /etc/modules-load.d/8021q.conf
8021q

После этого можно перезагрузиться и проверить, что модуль загружен автоматически.

Также в Debian и Ubuntu для автозагрузки модуля ядра, можно добавить имя модуля в файл /etc/modules.

Итог

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

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

Узнали как получить информацию о модуле ядра используя команду modinfo, а также как получить список модулей в системе используя lsmod.


Сводка

Ядро Linux и модули ядра

Имя статьи

Ядро Linux и модули ядра

Описание

Сейчас каждая операционная система имеет разделение на пользовательский режим и режим ядра, в этой статье разбирается ядро Linux и его модули

Как вывести список всех модулей ядра?

Команды модуля

  1. depmod — обрабатывать описания зависимостей для загружаемых модулей ядра.
  2. insmod — установить загружаемый модуль ядра.
  3. lsmod — список загруженных модулей.
  4. modinfo — отображать информацию о модуле ядра.
  5. modprobe — высокоуровневая обработка загружаемых модулей.
  6. rmmod — выгрузить загружаемые модули.

Как увидеть модули ядра?

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

Как вы найдете информацию о загруженном модуле?

Вы можете увидеть, какие модули уже загружены в ядро, запустив lsmod, который получает информацию чтение файла /proc/modules.

Как вывести список всех модулей в Linux?

Самый простой способ перечислить модули с помощью команда lsmod. Хотя эта команда предоставляет много деталей, это наиболее удобный вывод. В выводе выше: «Модуль» показывает имя каждого модуля.

Как вывести список всех драйверов в Linux?

Использование под линуксом файл /proc/modules показывает, какие модули ядра (драйверы) в данный момент загружены в память.

Что такое модуль ядра?

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

Как вручную установить драйвер ядра?

Загрузка модуля

  1. Чтобы загрузить модуль ядра, запустите modprobe имя_модуля от имени пользователя root. …
  2. По умолчанию modprobe пытается загрузить модуль из /lib/modules/kernel_version/kernel/drivers/. …
  3. Некоторые модули имеют зависимости, которые являются другими модулями ядра, которые должны быть загружены до того, как можно будет загрузить рассматриваемый модуль.

Как просмотреть все модули Python?

Есть два способа получить список установленных пакетов на python.

  1. Использование функции помощи. Вы можете использовать функцию справки в python, чтобы получить список установленных модулей. Войдите в приглашение python и введите следующую команду. помощь(“модули”)…
  2. используя питон-пип. sudo apt-get установить python-pip. заморозка пипа.

Что такое модуль ядра Br_netfilter?

Интерфейс командной строки платформы проверяет, загружен ли модуль br_netfilter, и завершает работу, если он недоступен. Этот модуль необходим для обеспечения прозрачной маскировки и облегчения трафика виртуальной расширяемой локальной сети (VxLAN) для связи между модулями Kubernetes в кластере.

Состояние перевода: На этой странице представлен перевод статьи Kernel module. Дата последней синхронизации: 29 декабря 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

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

Чтобы создать модуль ядра, вы можете прочитать The Linux Kernel Module Programming Guide. Модуль можно сконфигурировать как вкомпилированный, а можно как загружаемый. Чтобы иметь возможность динамически загружать или выгружать модуль, его необходимо сконфигурировать как загружаемый модуль в настройке ядра (в этом случае строка, относящаяся к модулю должна быть отмечена буквой M).

Получение информации

Модули хранятся в /usr/lib/modules/kernel_release. Чтобы узнать текущую версию вашего ядра, используйте команду uname -r.

Примечание: Часто в названии модулей используются подчёркивания (_) или дефисы (-); однако, эти символы взаимозаменяемы как при использовании команды modprobe, так и в конфигурационных файлах в /etc/modprobe.d/.

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

$ lsmod

Чтобы показать информацию о модуле:

$ modinfo module_name

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

$ systool -v -m module_name

Чтобы отобразить настройки для всех модулей:

$ modprobe -c | less

Чтобы отобразить настройки для отдельного модуля:

$ modprobe -c | grep module_name

Чтобы узнать зависимости модуля (или его псевдонима), включая сам модуль:

$ modprobe --show-depends module_name

Автоматическая загрузка модулей с помощью systemd

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

Чтобы дополнительные модули ядра загружались автоматически в процессе загрузки, создаются статические списки в конфигурационных файлах в директории /etc/modules-load.d/. Каждый конфигурационный файл называется по схеме /etc/modules-load.d/program.conf. Эти файлы просто содержат список названий модулей ядра, которые необходимо грузить, разделённых переносом строки. Пустые строки и строки, в которых первым непробельным символом является # или ;, игнорируются.

/etc/modules-load.d/virtio-net.conf
# Load virtio_net.ko at boot
virtio_net

Смотрите modules-load.d(5) для дополнительной информации.

Управление модулями вручную

Управление модулями ядра производится с помощью утилит, предоставляемых пакетом kmod. Вы можете использовать эти утилиты вручную.

Примечание: Если вы обновили ваше ядро, но ещё не перезагрузились, modprobe не сработает без каких либо уведомлений об ошибках и завершится с ошибкой 1, потому что путь /usr/lib/modules/$(uname -r)/ больше не существует. Проверьте вручную существование этого пути, если modprobe не работает, чтобы убедиться, что это ваш случай.

Загрузка модуля:

# modprobe имя_модуля

Загрузка модуля из другого места (для тех модулей, которых нет в /usr/lib/modules/$(uname -r)/):

# insmod имя_файла [параметры]

Выгрузка модуля:

# modprobe -r имя_модуля

Альтернативный вариант выгрузки модуля:

# rmmod имя_модуля

Настройка параметров модуля

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

Вручную при загрузке с помощью modprobe

Основной способ передать параметры модулю — использовать команду modprobe. Параметры указываются с помощью простых присваиваний ключ=значение:

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

С помощью файлов в /etc/modprobe.d/

Файлы в директории /etc/modprobe.d/ можно использовать для передачи настроек модуля в udev, который через modprobe управляет загрузкой модулей во время загрузки системы. Конфигурационные файлы в этой директории могут иметь любое имя, оканчивающееся расширением .conf. Синтаксис следующий:

/etc/modprobe.d/myfilename.conf
options имя_модуля имя_параметра=значение_параметра

Например:

/etc/modprobe.d/thinkfan.conf
# On ThinkPads, this lets the 'thinkfan' daemon control fan speed
options thinkpad_acpi fan_control=1

Примечание: Если какой-либо из затрагиваемых модулей загружается из initramfs, тогда вам придётся добавить соответствующий файл .conf в массив FILES в файле mkinitcpio.conf или использовать хук modconf для добавления файла .conf в образ initramfs. Чтобы посмотреть содержимое образа initramfs, можно использовать lsinitcpio.

С помощью командной строки ядра

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

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

Например:

thinkpad_acpi.fan_control=1

Просто добавьте это в загрузчике в строку с ядром, как описано в статье Параметры ядра.

Создание псевдонимов

Псевдонимы (алиасы) — это альтернативные названия для модуля. Например: alias my-mod really_long_modulename означает, что вы можете использовать modprobe my-mod вместо modprobe really_long_modulename. Вы также можете использовать звёздочки в стиле shell, то есть alias my-mod* really_long_modulename будет иметь тот же эффект, что и modprobe my-mod-something. Создайте алиас:

/etc/modprobe.d/myalias.conf
alias mymod really_long_module_name

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

/etc/modprobe.d/modprobe.conf
# Prevent Bluetooth autoload
alias net-pf-31 off

Запрет загрузки

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

Некоторые модули загружаются как часть initramfs. Команда mkinitcpio -M напечатает все автоматически обнаруженные модули: для предотвращения initramfs от загрузки каких-то из этих модулей, занесите их в чёрный список в файле .conf в каталоге /etc/modprobe.d/, и хук modconf добавит этот файл в образ initramfs при его генерации. Команда mkinitcpio -v отобразит все модули, которые необходимы некоторым хукам (например, filesystems хук, block хук и т.д.). Если вы не используете хук modconf, то не забудьте добавить нужный вам .conf файл в секцию FILES в /etc/mkinitcpio.conf. После того, как вы запретили загрузку модулей, пересоберите initramfs, а затем перезагрузитесь.

С помощью файлов в /etc/modprobe.d/

Создайте .conf файл в /etc/modprobe.d/ и добавьте строку для каждого модуля, который вы хотите запретить, используя ключевое слово blacklist. Например, если вы хотите запретить загружать модуль pcspkr:

/etc/modprobe.d/nobeep.conf
# Do not load the 'pcspkr' module on boot.
blacklist pcspkr

Примечание: Команда blacklist запретит автоматическую загрузку модуля, но этот модуль всё равно может загрузиться, если от него зависит какой-то не запрещённый модуль или если он загружен вручную.

Можно изменить такое поведение. Команда install заставляет modprobe запускать вашу собственную команду вместо вставки модуля в ядро как обычно. Поэтому вы можете насильно сделать так, чтобы модуль никогда не загружался:

/etc/modprobe.d/blacklist.conf
...
install имя_модуля /bin/true
...

Это запретит данный модуль и все модули, зависящие от него.

С помощью командной строки ядра

Совет: Это может очень помочь, если неправильный модуль не даёт загрузиться вашей системе.

Вы также можете запрещать модули из загрузчика.

Просто добавьте module_blacklist=модуль1,модуль2,модуль3 в вашем загрузчике в строку ядра, как описано в статье Параметры ядра.

Примечание: Когда вы запрещаете несколько модулей, обратите внимание, что они разделяются только запятой. Пробелы или что-либо ещё могут нарушить синтаксис.

Решение проблем

Модули не загружаются

В случае, если конкретный модуль не загружается и журнал загрузки (доступный с помощью journalctl -b) говорит, что модуль в чёрном списке, но в директории /etc/modprobe.d/ нет соответствующей записи, проверьте другую папку-источник modprobe в /usr/lib/modprobe.d/ на записи в чёрном списке.

Модуль не будет загружен, если строка «vermagic», содержащаяся в модуле ядра, не соответствует значению текущего запущенного ядра. Если достоверно известно, что модуль совместим с текущим запущенным ядром, проверку «vermagic» можно отключить с помощью modprobe --force-vermagic.

Важно: Игнорирование проверок версии для модуля ядра может привести к сбою ядра или к неопределённому поведению системы из-за несовместимости. Используйте --force-vermagic только с особой осторожностью.

Смотрите также

  • Отключение PC Speaker
  • Writing a WMI driver — an LWM introduction

Понравилась статья? Поделить с друзьями:
  • Как найти семейного психотерапевта
  • Как найти среднее линейное отклонение статистика
  • Как найти уборщицу для дома
  • Как составить соц анкету
  • Магазин как найти встречи