Сборка модулей ядра

Редактировал(а) atsarkov 18.04.2025 10:04

Применимо к:

  • ОС "ОСнова" 2.x onyx
  • ОС "ОСнова" 3.x onyx

Ядро ОС и модули ядра

ОС "ОСнова" onyx разработана на базе Debian и включает набор ядер Linux, собранных с разными конфигурационными параметрами в зависимости от их назначения.

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

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

delete Возможность загрузки произвольных модулей сильно снижает защищенность системы, так как код таких модулей исполняется в привилегированном режиме. В ОС предусмотрена работа в режиме замкнутой программной среды (ЗПС), при котором обеспечивается загрузка только доверенных (подписанных) модулей ядра

Варианты ядер и их именование

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

Определенная версия ядра собирается из пакета исходных текстов вида linux-<версия>.

ОС "ОСнова" onyx включает несколько ядер, собранных с разными конфигурационными параметрами, при этом наименование пакетов формируются следующим образом:

linux-image-<версия>-<abi>-<вариант>-<архитектура>

Например:

  • linux-image-<версия>-amd64 — основной вариант ядра для архитектуры amd64
  • linux-image-<версия>-hardened-amd64 — имеет повышенный уровень защищенности
  • linux-image-<версия>-mptcp-amd64 — имеет поддержку Multipath TCP
  • linux-image-<версия>-pve-amd64 — обеспечивает возможность установки в систему Proxmox(R) Virtual Environment
  • linux-image-<версия>-rt-amd64 — имеет пониженное время реакции на события
  • linux-image-<версия>-uksm-amd64 включает поддержку технологии Ultra Kernel Samepage Merging (UKSM)

error Для нормального функционирования модуль ядра должен быть специально собран под ту версию и вариант ядра, в котором он должен функционировать

Управление загрузкой модулей

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

  • lsmod — просмотр состава загруженных модулей ядра
  • modprobe — загрузка/выгрузка модуля ядра
  • modinfo — вывод информации по модулю ядра
  • insmod — загрузка модуля ядра
  • rmmod — выгрузка модуля
  • depmod — построение карты зависимостей модулей ядра.

Сборка модулей ядра

Для поддержки возможности сборки модулей ядра в состав средств разработки ОС входят заголовочные файлы вариантов ядра, требуемые для сборки вида:

  • linux-headers-<версия>-<abi>-<вариант>-<архитектура> — заголовочные файлы варианта ядра
  • linux-kbuild-<версия> - средство сборки модулей версии ядра Linux

Несмотря на то, что модуль ядра может быть собран вручную с помощью kbuild (https://docs.kernel.org/kbuild/modules.html), существуют более удобные способы сборки с помощью вспомогательных средств, предусмотренных в ОС семейства Debian:

  • dkms — фреймворк для сборки модуля ядра под актуальную версию ядра
  • module-assistant — инструмент сборки модулей ядра

information Поскольку сборка ядра требует наличия средств разработки, рекомендуется использовать специальное место сборки. После сборки и подготовки ядра для функционирования в режиме  ЗПС, пакеты с ядром  могут быть установлены в реальную систему

Сборка модулей ядра при помощи DKMS

Технология DKMS (Dynamic Kernel Module Support) позволяет производить автоматическую сборку модулей системы при обновлении ядра. При этом система должна содержать все необходимые для сборки средства разработки и зависимости, включая заголовочные файлы ядра.

Для сборки в помощью dkms бинарные пакеты Debian содержат исходные тексты модуля и зависимость от dkms, например zfs-dkms.

Для сборки должна быть подготовлена конфигурация модуля, например:

PACKAGE_NAME=test
PACKAGE_VERSION=0.1
BUILT_MODULE_NAME[0]="$PACKAGE_NAME"
MAKE[0]="make -C ${kernel_source_dir} M=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build"
CLEAN="make -C ${kernel_source_dir} M=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build clean"
DEST_MODULE_LOCATION[0]=/extra
REMAKE_INITRD=yes
AUTOINSTALL=yes

В скрипт postinst пакета следует добавить:

dkms add -m <name> -v <version>
dkms build -m <name> -v <version> && dkms install -m <name> -v <version> || true

Предполагается, что конфигурационный файл устанавливается как

/usr/src/<name>-<version>/dkms.conf

а исходные тексты в

/usr/src/<name>-<version>

Скрипт prerm пакета должен содержать:

dkms remove -m <name> -v <version> --all || true

Сборка модулей ядра при помощи module-assistant

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

Для сборки модуля ядра под текущую версию и вариант ядра сперва необходимо выполнить:

m-a prepare

При этом будет установлен набор базовых средств разработки и соответствующий текущему ядру пакет исходных текстов ядра linux-headers-*.
Обновить список модулей с помощью вызова:

m-a update

Пересборка модуля ядра осуществляется командой:

m-a a-i <модуль>

information Module-assistant может быть запущен и в интерактивном режиме как m-a без аргументов