Понимание ядра 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 лицензия irdaGPL
$
В новых ядрах 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-зависит i915insmod / библиотека / модули / 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