Linux порядок загрузки модулей

Как загружать и выгружать модули ядра в Linux

Оригинал: How to Load and Unload Kernel Modules in Linux
Автор: Aaron Kili
Дата публикации: 13 июня 2017 года
Перевод: А. Кривошей
Дата перевода: июль 2017 г.

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

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

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

Список всех загруженных модулей ядра в Linux

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

Для вывода списка всех загруженных модулей в Linux может использоваться команда lsmod (list modules), которая читает содержимое /proc/modules.

Как загрузить или выгрузить (удалить) модули ядра в Linux

Для загрузки модуля ядра мы можем использовать команду insmod (insert module). Здесь необходимо задать полный путь к модулю. Приведенная ниже команда загружает модуль speedstep-lib.ko.

Для выгрузки модуля ядра мы будем использовать команду rmmod (remove module). Следующая команда выгрузит модуль speedstep-lib.ko.

Управление модулями ядра с помощью команды modprobe

modprobe — это интеллектуальная команда для чтения списка, загрузки и выгрузки модулей ядра. Она производит поиск всех модулей и соответствующих файлов в директории /lib/modules/$(uname -r), но не включает в поиск альтернативные конфигурационные файлы в директории /etc/modprobe.d. Таким образом, здесь вам не нужно вводить полный путь к модулю — в этом преимущество modprobe по сравнению с ранее описанными командами.

Для загрузки модуля просто введите его имя.

Для выгрузки модуля используется флаг -r.

Замечание: в modprobe выполняется автоматическое преобразование подчеркивания, поэтому при вводе названий модулей нет никакой разницы между _ и -.

Более подробно ознакомиться с опциями можно на man-странице modprobe.

Источник

Какова последовательность загрузки модуля ядра Linux при запуске? Как приоритет для них?

У меня есть модуль ядра Linux, который я скомпилировал динамически. Как это добавляется в автозагрузку? Есть много .ko файлов в /lib/modules . Как устанавливается приоритет для загрузки этих модулей?

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

Запрос в пользовательском пространстве: охватывает все, от служб init до udev и командной строки. Init или udev, вероятно, являются наиболее простым средством, если вы хотите загрузить определенный модуль во время загрузки.

Читайте также:  Net framework download is available from windows update

Устройство с горячим подключением: когда вы подключаете что-либо, например, к USB или PCI, ядро ​​обнаруживает это и запрашивает соответствующий модуль на основе того, как устройство идентифицирует себя.

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

Обратите внимание, что для последних двух я использовал фразу «запросить модуль» — это потому, что ядро ​​фактически загружается через демон userpace, kmod который выполняется /sbin/modprobe . По словам Вольфганга Моерера из Linux Kernel Architecture , в ядре 2.6 есть только

100 различных точек, где он вызывает внутреннюю request_module() функцию.

modprobe использует базу данных установленных MODULE_ALIAS. Они явно указаны в исходном коде модуля или получены из его MODULE_DEVICE_TABLE, который представляет собой список идентификаторов OEM-устройств, которые обслуживает модуль.

Многие системы настроены на использование initrd или initramfs . Это образы файловой системы, которые загружаются загрузчиком и становятся доступными ядру до его монтирования в корневой раздел. Это позволяет скомпилировать драйверы, необходимые для монтирования корневого раздела (драйверы дисков, драйверы файловой системы, драйверы устройств отображения или логических томов,…), и загрузить их из initrd / initramfs.

Скрипты запуска в initrd ( /linuxrc ) или initramfs ( /init ) обычно загружают некоторые модули и обнаруживают корневую файловую систему. Каждый дистрибутив имеет свою настройку. Ubuntu использует initramfs, который собран из компонентов в initramfs-tools пакете и регенерирован для каждого ядра на основе необходимых драйверов для монтирования корневой файловой системы.

После того, как корневая файловая система смонтирована, во время загрузки системы загружаются модули, перечисленные в /etc/modules (Debian,…) или /etc/modules.conf (Red Hat, Arch,…). Этот файл обычно содержит несколько модулей, если таковые имеются. Большинство модулей загружаются по требованию.

Когда ядро ​​обнаруживает некоторое оборудование, для которого ему не хватает драйвера, или некоторые другие компоненты, такие как сетевые протоколы или криптографические алгоритмы, оно вызывает /sbin/modprobe загрузку модуля. Для драйверов аппаратного обеспечения ядро ​​передает имена, которые кодируют идентификатор PCI, идентификатор USB или другое систематическое обозначение оборудования. Существует таблица, в /lib/modules/$VERSION/modules.alias которой эти систематические обозначения сопоставляются с именами модулей. Эта таблица генерируется depmod и читается modprobe .

Если у вас есть дополнительный модуль ядра, который вы скомпилировали вручную для аппаратного устройства, поместите его в /lib/modules/$VERSION/local (создайте local подкаталог, если он не существует) и запустите depmod -a для регенерации базы данных псевдонимов. Если модуль предназначен для какой-то необычной функции, которую ядро ​​не может обнаружить автоматически, поместите его /lib/modules/$VERSION/local , запустите depmod -a для анализа его зависимостей и добавьте имя модуля /etc/modules .

Источник

Загружаемые модули ядра Linux

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

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

Общие сведения и модулях ядра

Следующая команда выдает номер версии используемого ядра:

Все модули ядра расположены в директории /lib/modules/версия :

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

Команды управления модулями

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

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

Читайте также:  Тонкий клиент 1с для mac os низкое разрешение

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

Следующая команда выдает информацию об одном модуле:

Как правило, для загрузки модулей ядра применяется не insmod , a modprobe . Эта команда имеет два преимущества: сама ищет файл модуля (следует указать только название модуля), а при необходимости также загружает все модули, требуемые для работы.

Кроме того, эта команда позволяет выгрузить модуль из ядра:

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

Для того, чтобы определенные модули загружались во время старта системы, их можно прописать в файл /etc/modules . Каждый модуль должен быть записан в отдельной строке. Строки, начинающиеся со слова blacklist , запрещают загрузку модуля.

Источник

Модули ядра Linux

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

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

Модули ядра Linux

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

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

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

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

  • 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, поэтому мы можем просто посмотреть его содержимое:

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

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

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

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

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

Читайте также:  Как установить обновление windows 10 через командную строку

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

sudo lsmod | grep vbox

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

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

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

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

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

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

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

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

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

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

Выводы

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

Источник

Оцените статью