# Практическая работа 3: Автоматическая сборка модуля ядра ОС с помощью фреймворка DKMS в Linux. ## Цель работы: 1) Получить навыки работы с фреймворком DKMS. ## Теоретические материалы к работе: DKMS или Dynamic Kernel Module Support — это система, которая позволяет обновлять отдельные модули ядра без необходимости модификации всего ядра. Это бесплатное программное обеспечение под лицензией GPL v2, написанное командой Dell Linux Engineering Team. DKMS имеет много преимуществ для сообществ поставщиков услуг Linux, например: * С точки зрения разработчика драйверов, это помогает добавлять драйверы, которых еще нет в базовом ядре. Кроме того, разработчики драйверов, которые должны предоставлять обновленные драйверы устройств для тестирования и общего использования с большим количеством ядер, также получают выгоду. Еще одним преимуществом DKMS является то, что разработчики могут тестировать код своего драйвера на разных машинах. На самом деле это ускоряет процесс разработки драйверов. * С точки зрения системного администратора DKMS упрощает процесс установки обновлений драйверов устройств в активное ядро ​​без внесения в него каких-либо изменений. Следовательно, им не нужно ждать прибытия нового ядра. * Выбранные исправления ошибок или исправления могут быть развернуты между крупными обновлениями. * Новое оборудование, которое требует модификации в одном модуле, может быть легко интегрировано. Опять же, этого можно добиться без полного тестирования новых ядер. Представьте, что вам понадобилось установить драйвер для недавно купленной графической карты, адаптера Wi-Fi или сетевой карты и по какой-то причине вы решили самостоятельно выполнить его компиляцию из доступных исходных кодов и установку (например, из-за того, что собранной версии драйвера, совместимой с вашей версией ядра ОС, попросту не существует, его собранная версия уже устарела или вам нужно использовать нестандартные параметры сборки). Для этого вы загрузили официальный исходный код этого драйвера, скомпилировали его версию, совместимую с вашей версией ядра ОС, установили скомпилированный модуль ядра ОС в систему и активировали его. Новое устройство было успешно распознано системой и начало корректно функционировать. А теперь подумайте о том, что произойдет, если вы впоследствии обновите версию ядра ОС. Ваш драйвер был собран вне официального дерева исходных кодов ядра Linux, поэтому при обновлении версии ядра ОС драйвер перестанет корректно функционировать. Как же решить данную проблему? Ну, вам придется повторно скомпилировать версию драйвера устройства, которая будет совместима с текущей версией ядра ОС, и установить ее в систему. Очевидно, что пересборка драйвера при каждом обновлении ядра ОС является не самым оптимальным решением. В подобной ситуации может оказаться весьма полезным фреймворк динамической поддержки модулей ядра DKMS (Dynamic Kernel Module Support). Фреймворк DKMS позволяет осуществлять автоматическую пересборку модулей ядра Linux с использованием текущего дерева его исходных кодов по мере обновления версий. Производители аппаратного обеспечения нередко выпускают драйверы в виде пакетов DKMS, поэтому пользователи могут свободно обновлять версии ядер своих систем, не заботясь о сборке совместимых версий драйверов устройств. Конечный пользователь может настроить DKMS с целью автоматической пересборки любого драйвера устройства или модуля, исходный код которого не является частью официального дерева исходных кодов ядра Linux. ## Методические указания к выполнению: Установка компонентов фреймворка DKMS и других необходимых пакетов: ``` root@debian:/# sudo apt-get install dkms root@debian:/# sudo apt-get install linux-headers-$(uname -r) root@debian:/# sudo apt-get install debhelper ``` Теперь посмотрим, какие модули ядра уже загружены: ``` root@debian:/# lsmod или root@debian:/# kmod list ``` Информация считывается из /proc/modules и данные команды выводят её в более понятном для восприятия виде. В качестве примера установим модуль ixgbe. Для этого следует загрузить и распаковать архив исходного кода драйвера в директорию /usr/src/<название-драйвера>-<версия>. Ссылка на скачивание: https://sourceforge.net/projects/e1000/files/ixgbe%20stable/ (Для подключения может потребоваться VPN). В открывшемся окне переходим в папку с последней версией модуля: ![](https://i.imgur.com/lLILxNT.png) и нажимаем на архив tar.gz: ![](https://i.imgur.com/0oMYYjN.png) Затем, для получения прямой ссылки на скачивание переходим в пункт Problems Downloading и копируем ccылкуц direct link: ![](https://i.imgur.com/ZWk1485.png) ``` root@debian:/# mkdir /usr/src/ixgbe-5.15.2 root@debian:/# cd /usr/src/ixgbe-5.15.2 root@debian:/usr/src/ixgbe-5.15.2# wget 'ссылка на скачивание' root@debian:/usr/src/ixgbe-5.15.2# sudo tar -xf 'имя скачанного файла' -C /usr/local/src root@debian:/usr/src/ixgbe-5.15.2# sudo mv /usr/local/src/ixgbe-5.15.2/src /usr/src/ixgbe-5.15.2/ ``` После этого нужно создать файл конфигурации с именем dkms.conf в этой же директории: ``` root@debian:/usr/src/ixgbe-5.15.2# sudo nano /usr/src/ixgbe-5.15.2/dkms.conf ``` И вставить туда следующее: ``` MAKE="BUILD_KERNEL=${kernelver} make -C src/ CFLAGS_EXTRA=-DIXGBE_NO_LRO KERNELDIR=/lib/modules/${kernelver}/build" CLEAN="make -C src/ clean" BUILT_MODULE_NAME=ixgbe BUILT_MODULE_LOCATION=src/ DEST_MODULE_LOCATION="/updates" PACKAGE_NAME=ixgbe-dkms PACKAGE_VERSION=5.15.2 REMAKE_INITRD=no ``` Значение PACKAGE_VERSION заменить на версию, которую устанавливаете. Далее следует добавить исходный код данного модуля в дерево исходного кода ядра ОС на уровне фреймворка DKMS: ``` root@debian:/usr/src/ixgbe-5.15.2# sudo dkms add -m ixgbe -v 5.15.2 ``` Теперь нужно собрать версию данного модуля, совместимую с текущей версией ядра ОС: ``` root@debian:/usr/src/ixgbe-5.15.2# sudo dkms build -m ixgbe -v 5.15.2 ``` Наконец, нужно установить модуль, совместимый с текущей версией ядра ОС, в систему: ``` root@debian:/usr/src/ixgbe-5.15.2# sudo dkms install -m ixgbe -v 5.15.2 ``` На данный момент модуль ядра ОС должен быть успешно установлен в систему. Вы можете проверить статус его установки с помощью следующей команды: ``` root@debian:/# dkms status | grep ixgbe ixgbe, 5.13.4: added ixgbe, 5.15.2, 5.10.0-15-amd64, x86_64: installed ```