<div class="box message" style="float:right; width:50%"><p>Применимо к:</p><ul><li>ОС "ОСнова" 2.x onyx</li><li>ОС "ОСнова" 3.x onyx</li></ul></div><div class="wikimodel-emptyline"></div><ul class="wikitoc"><li><span class="wikilink"><a href="#H42F43444043E41E42143843C43E43444343B43844F434440430">Ядро ОС и модули ядра</a></span></li><li><span class="wikilink"><a href="#H41243044043843043D44244B44F43443544043843844543843C43543D43E43243043D438435">Варианты ядер и их именование</a></span></li><li><span class="wikilink"><a href="#H42343F44043043243B43543D43843543743043344044343743A43E43943C43E43444343B435439">Управление загрузкой модулей</a></span></li><li><span class="wikilink"><a href="#H42143143E44043A43043C43E43444343B43543944F434440430">Сборка модулей ядра</a></span><ul><li><span class="wikilink"><a href="#H42143143E44043A43043C43E43444343B43543944F43444043043F44043843F43E43C43E449438DKMS">Сборка модулей ядра при помощи DKMS</a></span></li><li><span class="wikilink"><a href="#H42143143E44043A43043C43E43444343B43543944F43444043043F44043843F43E43C43E449438module-assistant">Сборка модулей ядра при помощи module-assistant</a></span></li></ul></li></ul><div class="wikimodel-emptyline"></div><div class="wikimodel-emptyline"></div><hr/><h1 id="H42F43444043E41E42143843C43E43444343B43844F434440430" class="wikigeneratedid"><span>Ядро ОС и модули ядра</span></h1><p>ОС "ОСнова" onyx разработана на базе Debian и включает набор ядер Linux, собранных с разными конфигурационными параметрами в зависимости от их назначения.</p><p>Ядро Linux относится к монолитным ядрам, включающим большое количество кода для обеспечения управления не только вычислительными ресурсами и процессами, но и для взаимодействия с аппаратными ресурсами или реализации специальных дополнительных функций. При этом код ядра исполняется в привилегированном режиме.</p><p>Таким образом в состав ядра входят различные драйвера устройств, средства поддержки сетевого взаимодействия и т. п. Большая часть базовой поддержки оборудования включена в состав кода ядра, но для возможности расширения функциональности ядра и совместимого с ним оборудования предусмотрена возможность добавления модулей ядра, загружаемых дополнительно. Такие модули могут включаться в загрузочный образ системы, или загружаться динамически по требованию во время работы системы.</p><div class="box errormessage" style="background-color: #fddbce; border: 1px solid red; border-radius: 8px;"><p><img src="/resources/icons/silk/delete.png?cache-version=1719321170000" class="wikimodel-freestanding" alt="delete"/> Возможность загрузки произвольных модулей сильно снижает защищенность системы, так как код таких модулей исполняется в привилегированном режиме. В ОС предусмотрена работа в режиме <span class="wikilink"><a href="/bin/view/%D0%9E%D0%A1%D0%BD%D0%BE%D0%B2%D0%B0/%D0%A1%D0%97%D0%98/%D0%97%D0%B0%D0%BC%D0%BA%D0%BD%D1%83%D1%82%D0%B0%D1%8F_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%28%D0%97%D0%9F%D0%A1%29/"><span style="color:blue">замкнутой программной среды</span></a></span> (ЗПС), при котором обеспечивается загрузка только доверенных (подписанных) модулей ядра</p></div><h1 id="H41243044043843043D44244B44F43443544043843844543843C43543D43E43243043D438435" class="wikigeneratedid"><span>Варианты ядер и их именование</span></h1><p>Операционная система может содержать несколько одновременно установленных вариантов ядер, отличающихся как версией, так и разными конфигурационными параметрами, заданными при сборке.</p><p>Определенная версия ядра собирается из пакета исходных текстов вида <strong>linux-<версия></strong>.</p><p>ОС "ОСнова" onyx включает несколько ядер, собранных с разными конфигурационными параметрами, при этом наименование пакетов формируются следующим образом:</p><div class="box"><div class="code">linux-image-<версия>-<abi>-<вариант>-<архитектура></div></div><p>Например:</p><ul><li>linux-image-<версия>-amd64 — основной вариант ядра для архитектуры amd64</li><li>linux-image-<версия>-hardened-amd64 — имеет повышенный уровень защищенности</li><li>linux-image-<версия>-mptcp-amd64 — имеет поддержку Multipath TCP</li><li>linux-image-<версия>-pve-amd64 — обеспечивает возможность установки в систему Proxmox(R) Virtual Environment</li><li>linux-image-<версия>-rt-amd64 — имеет пониженное время реакции на события</li><li>linux-image-<версия>-uksm-amd64 включает поддержку технологии Ultra Kernel Samepage Merging (UKSM)</li></ul><div class="box warningmessage" style="background-color: #fdf2ce; border: 1px solid orange; border-radius: 8px;"><p><img src="/resources/icons/silk/error.png?cache-version=1719321170000" class="wikimodel-freestanding" alt="error"/> Для нормального функционирования модуль ядра должен быть специально собран под ту версию и вариант ядра, в котором он должен функционировать</p></div><h1 id="H42343F44043043243B43543D43843543743043344044343743A43E43943C43E43444343B435439" class="wikigeneratedid"><span>Управление загрузкой модулей</span></h1><p>Для управления загруженными модулями используются следующие команды:</p><ul><li>lsmod — просмотр состава загруженных модулей ядра</li><li>modprobe — загрузка/выгрузка модуля ядра</li><li>modinfo — вывод информации по модулю ядра</li><li>insmod — загрузка модуля ядра</li><li>rmmod — выгрузка модуля</li><li>depmod — построение карты зависимостей модулей ядра.</li></ul><h1 id="H42143143E44043A43043C43E43444343B43543944F434440430" class="wikigeneratedid"><span>Сборка модулей ядра</span></h1><p>Для поддержки возможности сборки модулей ядра в состав средств разработки ОС входят заголовочные файлы вариантов ядра, требуемые для сборки вида:</p><ul><li>linux-headers-<версия>-<abi>-<вариант>-<архитектура> — заголовочные файлы варианта ядра</li><li>linux-kbuild-<версия> - средство сборки модулей версии ядра Linux</li></ul><p>Несмотря на то, что модуль ядра может быть собран вручную с помощью <strong>kbuild</strong> (<span class="wikiexternallink"><a class="wikimodel-freestanding" href="https://docs.kernel.org/kbuild/modules.html)"><span class="wikigeneratedlinkcontent">https://docs.kernel.org/kbuild/modules.html)</span></a></span>, существуют более удобные способы сборки с помощью вспомогательных средств, предусмотренных в ОС семейства Debian:</p><ul><li>dkms — фреймворк для сборки модуля ядра под актуальную версию ядра</li><li>module-assistant — инструмент сборки модулей ядра</li></ul><div class="box infomessage" style="background-color: #e3e3fa; border: 1px solid blue; border-radius: 8px;"><p><img src="/resources/icons/silk/information.png?cache-version=1719321170000" class="wikimodel-freestanding" alt="information"/> Поскольку сборка ядра требует наличия средств разработки, рекомендуется использовать специальное место сборки. После сборки и подготовки ядра для функционирования в режиме ЗПС, пакеты с ядром могут быть установлены в реальную систему</p></div><h2 id="H42143143E44043A43043C43E43444343B43543944F43444043043F44043843F43E43C43E449438DKMS" class="wikigeneratedid"><span>Сборка модулей ядра при помощи DKMS</span></h2><p>Технология <strong>DKMS</strong> (Dynamic Kernel Module Support) позволяет производить автоматическую сборку модулей системы при обновлении ядра. При этом система должна содержать все необходимые для сборки средства разработки и зависимости, включая заголовочные файлы ядра.</p><p>Для сборки в помощью dkms бинарные пакеты Debian содержат исходные тексты модуля и зависимость от dkms, например zfs-dkms.</p><p>Для сборки должна быть подготовлена конфигурация модуля, например:</p><div class="box"><div class="code">PACKAGE_NAME=test<br/>PACKAGE_VERSION=0.1<br/>BUILT_MODULE_NAME[0]="$PACKAGE_NAME"<br/>MAKE[0]="make -C ${kernel_source_dir} M=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build"<br/>CLEAN="make -C ${kernel_source_dir} M=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build clean"<br/>DEST_MODULE_LOCATION[0]=/extra<br/>REMAKE_INITRD=yes<br/>AUTOINSTALL=yes</div></div><p>В скрипт postinst пакета следует добавить:</p><div class="box"><div class="code">dkms add -m <name> -v <version><br/>dkms build -m <name> -v <version> && dkms install -m <name> -v <version> || true</div></div><p>Предполагается, что конфигурационный файл устанавливается как</p><div class="box"><div class="code">/usr/src/<name>-<version>/dkms.conf</div></div><p>а исходные тексты в</p><div class="box"><div class="code">/usr/src/<name>-<version></div></div><p>Скрипт prerm пакета должен содержать:</p><div class="box"><div class="code">dkms remove -m <name> -v <version> --all || true</div></div><h2 id="H42143143E44043A43043C43E43444343B43543944F43444043043F44043843F43E43C43E449438module-assistant" class="wikigeneratedid"><span>Сборка модулей ядра при помощи module-assistant</span></h2><p>Существует возможность сборки модуля ядра с помощью инструмента <strong>module-assistant</strong>, в результате работы которого на выходе получается обычный deb-пакет с заданным модулем.</p><div class="wikimodel-emptyline"></div><p>Для сборки модуля ядра под текущую версию и вариант ядра сперва необходимо выполнить:</p><div class="box"><div class="code">m-a prepare</div></div><p>При этом будет установлен набор базовых средств разработки и соответствующий текущему ядру пакет исходных текстов ядра linux-headers-*.<br/>Обновить список модулей с помощью вызова:</p><div class="box"><div class="code">m-a update</div></div><p>Пересборка модуля ядра осуществляется командой:</p><div class="box"><div class="code">m-a a-i <модуль></div></div><div class="box infomessage" style="background-color: #e3e3fa; border: 1px solid blue; border-radius: 8px;"><p><img src="/resources/icons/silk/information.png?cache-version=1719321170000" class="wikimodel-freestanding" alt="information"/> Module-assistant может быть запущен и в интерактивном режиме как m-a без аргументов</p></div>