Ядро Linux

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

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

Понимание ядра Linux

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

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

В общем, модуль ядра - это «фрагмент кода, который может быть загружен и выгружен в ядро ​​по запросу. Они расширяют функциональность ядра без перезагрузки системы »[1]. Это приводит к очень большой гибкости во время работы.

Кроме того, «модуль ядра может быть настроен как встроенный или загружаемый. Чтобы динамически загружать или удалять модуль, он должен быть настроен как загружаемый модуль в конфигурации ядра »[1]. Это делается в исходном файле ядра / usr / src / linux /.config [2]. Встроенные модули отмечены буквой «y», а загружаемые модули - буквой «m». В качестве примера листинг 1 демонстрирует это для модуля SCSI:

Листинг 1: Объявление использования модуля SCSI

CONFIG_SCSI = y # встроенный модуль
CONFIG_SCSI = m # загружаемый модуль
# CONFIG_SCSI # переменная не задана

Мы не рекомендуем редактировать файл конфигурации напрямую, но использовать команду «make config», «make menuconfig» или «make xconfig» для определения использования соответствующего модуля в ядре Linux.

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

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

Для текущих ядер Linux следующие команды предоставляются пакетом kmod [3]. Все команды являются символическими ссылками на kmod.

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

Начнем с команды lsmod. lsmod сокращает «список модулей» и отображает все модули, загруженные в настоящее время в ядро ​​Linux, красиво форматируя содержимое файла / proc / modules. В листинге 2 показаны выходные данные, состоящие из трех столбцов: имя модуля, размер, используемый в памяти, и другие модули ядра, которые используют этот конкретный столбец.

Листинг 2: Использование lsmod

$ lsmod
Размер модуля, используемый
ctr 12927 2
куб.см 17534 2
snd_hrtimer 12604 1
snd_seq 57112 1
snd_seq_device 13132 1 snd_seq

$

Найдите доступные модули для вашего текущего ядра

Могут быть доступны модули ядра, о которых вы еще не знаете. Они хранятся в каталоге / lib / modules. С помощью find в сочетании с командой uname вы можете распечатать список этих модулей. «Uname -r» просто печатает версию текущего ядра Linux. Листинг 3 демонстрирует это для более старых 3.16.0-7 Linux
ядро и показывает модули для IPv6 и IRDA.

Листинг 3: Отображение доступных модулей (выбор)

$ найти / lib / modules / $ (uname -r) -name '*.ко '
/ lib / модули / 3.16.0-7-amd64 / ядро ​​/ сеть / ipv6 / ip6_vti.ко
/ lib / модули / 3.16.0-7-amd64 / ядро ​​/ сеть / ipv6 / xfrm6_tunnel.ко
/ lib / модули / 3.16.0-7-amd64 / ядро ​​/ сеть / ipv6 / ip6_tunnel.ко
/ lib / модули / 3.16.0-7-amd64 / ядро ​​/ сеть / ipv6 / ip6_gre.ко
/ lib / модули / 3.16.0-7-amd64 / ядро ​​/ сеть / irda / irnet / irnet.ко
/ lib / модули / 3.16.0-7-amd64 / ядро ​​/ сеть / Ирда / Ирлан / Ирлан.ко
/ lib / модули / 3.16.0-7-amd64 / ядро ​​/ сеть / irda / irda.ко
/ lib / модули / 3.16.0-7-amd64 / ядро ​​/ сеть / irda / ircomm / ircomm.ко
/ lib / модули / 3.16.0-7-amd64 / ядро ​​/ сеть / irda / ircomm / ircomm-tty.ко

$

Отображение информации о модуле с помощью modinfo

Команда modinfo сообщает вам больше о запрошенном модуле ядра («информация о модуле»). В качестве параметра modinfo требуется либо полный путь к модулю, либо просто имя модуля. Листинг 4 демонстрирует это для модуля ядра IrDA, имеющего дело со стеком протокола прямого доступа через инфракрасный порт.

Листинг 4: Отображение информации о модуле

$ / sbin / modinfo irda
имя файла: / lib / modules / 3.16.0-7-amd64 / ядро ​​/ сеть / irda / irda.ко
псевдоним: net-pf-23
лицензия: GPL
Описание: Стек протоколов Linux IrDA
автор: Даг Браттли И Жан Турриль
зависит: crc-ccitt
вермаж: 3.16.0-7-amd64 SMP mod_unload версии мода
$

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

Информационные поля различаются от модуля к модулю. Чтобы ограничить вывод конкретным информационным полем, modinfo принимает параметр «-F» (сокращение от «-field»), за которым следует имя поля. В листинге 5 вывод ограничен информацией о лицензии, доступной с помощью поля лицензии.

Листинг 5: Отображение только определенного поля.

$ / sbin / modinfo -F лицензия irda
GPL
$

В новых ядрах Linux доступна полезная функция безопасности. Это касается модулей ядра с криптографической подписью. Как объясняется на веб-сайте проекта ядра Linux [4], «это позволяет повысить безопасность ядра за счет запрета загрузки неподписанных модулей или модулей
подписан неверным ключом. Подпись модуля повышает безопасность, затрудняя загрузку вредоносного модуля в ядро. Проверка подписи модуля выполняется ядром, поэтому нет необходимости иметь «доверенные биты пользовательского пространства».На рисунке ниже показано это для
модуль parport_pc.

Показать конфигурацию модуля с помощью modprobe

Каждый модуль ядра имеет определенную конфигурацию. Команда modprobe, за которой следует параметр «-c» (сокращение от «-showconfig»), отображает конфигурацию модуля. В сочетании с grep этот вывод ограничен определенным символом. Листинг 6 демонстрирует это для параметров IPv6.

Листинг 6: Показать конфигурацию модуля

$ / sbin / modprobe -c | grep ipv6
псевдоним net_pf_10_proto_0_type_6 dccp_ipv6
псевдоним net_pf_10_proto_33_type_6 dccp_ipv6
псевдоним nf_conntrack_10 nf_conntrack_ipv6
псевдоним nf_nat_10 nf_nat_ipv6
псевдоним nft_afinfo_10 nf_tables_ipv6
псевдоним nft_chain_10_nat nft_chain_nat_ipv6
псевдоним nft_chain_10_route nft_chain_route_ipv6
псевдоним nft_expr_10_reject nft_reject_ipv6
символ псевдонима: nf_defrag_ipv6_enable nf_defrag_ipv6
символ псевдонима: nf_nat_icmpv6_reply_translation nf_nat_ipv6
символ псевдонима: nft_af_ipv6 nf_tables_ipv6
символ псевдонима: nft_reject_ipv6_eval nft_reject_ipv6
$

Показать зависимости модуля

Ядро Linux спроектировано как модульное, а функциональность распределена по ряду модулей. Это приводит к нескольким зависимостям модулей, которые можно снова отобразить с помощью modprobe. В листинге 7 используется опция «-show-plays» для перечисления зависимостей для модуля i915.

Листинг 7: Показать зависимости модуля

$ / sbin / modprobe --show-зависит i915
insmod / библиотека / модули / 3.16.0-7-amd64 / ядро ​​/ драйверы / i2c / i2c-ядро.ко
insmod / библиотека / модули / 3.16.0-7-amd64 / ядро ​​/ драйверы / i2c / алгоритмы / i2c-алгоритм-бит.ко
insmod / библиотека / модули / 3.16.0-7-amd64 / ядро ​​/ драйверы / термический / Thermal_sys.ко
insmod / библиотека / модули / 3.16.0-7-amd64 / ядро ​​/ драйверы / графический процессор / drm / drm.ко
insmod / библиотека / модули / 3.16.0-7-amd64 / ядро ​​/ драйверы / графический процессор / drm / drm_kms_helper.ко
insmod / библиотека / модули / 3.16.0-7-amd64 / ядро ​​/ драйверы / acpi / видео.ко
insmod / библиотека / модули / 3.16.0-7-amd64 / ядро ​​/ драйверы / acpi / кнопка.ко
insmod / библиотека / модули / 3.16.0-7-amd64 / ядро ​​/ драйверы / графический процессор / drm / i915 / i915.ко
$

Чтобы отобразить зависимости в виде дерева, похожего на команду «tree» или «lsblk», может помочь проект modtree [5] (см. Рисунок ниже для дерева модулей i915). Хотя он находится в свободном доступе на GitHub, он требует некоторых изменений, чтобы соответствовать правилам для бесплатного программного обеспечения и стать частью дистрибутива Linux в виде пакета.

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

Загрузить модуль в работающее ядро ​​можно двумя командами - insmod («вставить модуль») и modprobe. Имейте в виду, что между этими двумя есть небольшое, но важное различие: insmod не разрешает зависимости модулей, но modprobe умнее и делает это.

В листинге 8 показано, как вставить модуль ядра IrDA. Обратите внимание, что insmode работает с полным путем к модулю, тогда как modprobe доволен именем модуля и ищет его в дереве модулей для текущего ядра Linux.

Листинг 8: Вставка модуля ядра

# insmod / lib / modules / 3.16.0-7-amd64 / ядро ​​/ сеть / irda / irda.ко

# modprobe irda

Разгрузочные модули

Последний шаг касается выгрузки модулей из работающего ядра. Опять же, для этой задачи доступны две команды - modprobe и rmmod («удалить модуль»). Обе команды ожидают имя модуля как параметр. В листинге 9 показано, как удалить модуль IrDA из работающего ядра Linux.

Листинг 9: Удаление модуля ядра

# rmmod irda

# modprobe -r irda

Заключение

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

Спасибо

Автор благодарит Axel Beckert (ETH Zürich) и Saif du Plessis (Hothead Studio Cape Town) за помощь при подготовке статьи.

Ссылки и ссылки

  • [1] Модуль ядра, Arch Linux wiki, https: // wiki.Archlinux.org / index.php / Kernel_module
  • [2] Конфигурация ядра, https: // tldp.org / HOWTO / SCSI-2.4-HOWTO / kconfig.html
  • [3] kmod, https: // git.ядро.org / pub / scm / utils / kernel / kmod / kmod.мерзавец
  • [4] Средство подписи модуля ядра, https: // www.ядро.org / doc / html / v4.15 / руководство администратора / подписывание модуля.html
  • [5] modtree, https: // github.com / falconindy / modtree
Бесплатные движки с открытым исходным кодом для разработки игр для Linux
В этой статье будет рассмотрен список бесплатных игровых движков с открытым исходным кодом, которые можно использовать для разработки 2D- и 3D-игр в L...
Shadow of the Tomb Raider для Linux Учебное пособие
Shadow of the Tomb Raider - двенадцатое дополнение к серии Tomb Raider - франшизе приключенческой игры, созданной Eidos Montreal. Игра была очень хоро...
Как увеличить FPS в Linux?
FPS означает Кадров в секунду. Задача FPS - измерить частоту кадров при воспроизведении видео или во время игры. Проще говоря, количество непрерывных ...