Сборка модулей ядра
Ядро ОС и модули ядра
ОС "ОСнова" onyx разработана на базе Debian и включает набор ядер Linux, собранных с разными конфигурационными параметрами в зависимости от их назначения.
Ядро Linux относится к монолитным ядрам, включающим большое количество кода для обеспечения управления не только вычислительными ресурсами и процессами, но и для взаимодействия с аппаратными ресурсами или реализации специальных дополнительных функций. При этом код ядра исполняется в привилегированном режиме.
Таким образом в состав ядра входят различные драйвера устройств, средства поддержки сетевого взаимодействия и т. п. Большая часть базовой поддержки оборудования включена в состав кода ядра, но для возможности расширения функциональности ядра и совместимого с ним оборудования предусмотрена возможность добавления модулей ядра, загружаемых дополнительно. Такие модули могут включаться в загрузочный образ системы, или загружаться динамически по требованию во время работы системы.
Варианты ядер и их именование
Операционная система может содержать несколько одновременно установленных вариантов ядер, отличающихся как версией, так и разными конфигурационными параметрами, заданными при сборке.
Определенная версия ядра собирается из пакета исходных текстов вида linux-<версия>.
ОС "ОСнова" onyx включает несколько ядер, собранных с разными конфигурационными параметрами, при этом наименование пакетов формируются следующим образом:
Например:
- 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)
Управление загрузкой модулей
Для управления загруженными модулями используются следующие команды:
- lsmod — просмотр состава загруженных модулей ядра
- modprobe — загрузка/выгрузка модуля ядра
- modinfo — вывод информации по модулю ядра
- insmod — загрузка модуля ядра
- rmmod — выгрузка модуля
- depmod — построение карты зависимостей модулей ядра.
Сборка модулей ядра
Для поддержки возможности сборки модулей ядра в состав средств разработки ОС входят заголовочные файлы вариантов ядра, требуемые для сборки вида:
- linux-headers-<версия>-<abi>-<вариант>-<архитектура> — заголовочные файлы варианта ядра
- linux-kbuild-<версия> - средство сборки модулей версии ядра Linux
Несмотря на то, что модуль ядра может быть собран вручную с помощью kbuild (https://docs.kernel.org/kbuild/modules.html), существуют более удобные способы сборки с помощью вспомогательных средств, предусмотренных в ОС семейства Debian:
- dkms — фреймворк для сборки модуля ядра под актуальную версию ядра
- module-assistant — инструмент сборки модулей ядра
Сборка модулей ядра при помощи DKMS
Технология DKMS (Dynamic Kernel Module Support) позволяет производить автоматическую сборку модулей системы при обновлении ядра. При этом система должна содержать все необходимые для сборки средства разработки и зависимости, включая заголовочные файлы ядра.
Для сборки в помощью dkms бинарные пакеты Debian содержат исходные тексты модуля и зависимость от dkms, например zfs-dkms.
Для сборки должна быть подготовлена конфигурация модуля, например:
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 build -m <name> -v <version> && dkms install -m <name> -v <version> || true
Предполагается, что конфигурационный файл устанавливается как
а исходные тексты в
Скрипт prerm пакета должен содержать:
Сборка модулей ядра при помощи module-assistant
Существует возможность сборки модуля ядра с помощью инструмента module-assistant, в результате работы которого на выходе получается обычный deb-пакет с заданным модулем.
Для сборки модуля ядра под текущую версию и вариант ядра сперва необходимо выполнить:
При этом будет установлен набор базовых средств разработки и соответствующий текущему ядру пакет исходных текстов ядра linux-headers-*.
Обновить список модулей с помощью вызова:
Пересборка модуля ядра осуществляется командой: