Библиотека сайта rus-linux.net
Автоматическая сборка модуля ядра ОС с помощью фреймворка DKMS в Linux
Оригинал: How to build a kernel module with DKMS on Linux
Автор: Dan Nanni
Дата публикации: 8 апреля 2016 г.
Перевод: А.Панин
Дата перевода: 24 июля 2016 г.
Автоматическая сборка модуля ядра ОС с помощью фреймворка DKMS в Linux
Представьте, что вам понадобилось установить драйвер для недавно купленной графической карты, адаптера Wi-Fi или сетевой карты и по какой-то причине вы решили самостоятельно выполнить его компиляцию из доступных исходных кодов и установку (например, из-за того, что собранной версии драйвера, совместимой с вашей версией ядра ОС, попросту не существует, его собранная версия уже устарела или вам нужно использовать нестандартные параметры сборки). Для этого вы загрузили официальный исходный код этого драйвера, скомпилировали его версию, совместимую с вашей версией ядра ОС, установили скомпилированный модуль ядра ОС в систему и активировали его. Новое устройство было успешно распознано системой и начало корректно функционировать.
А теперь подумайте о том, что произойдет, если вы впоследствии обновите версию ядра ОС. Ваш драйвер был собран вне официального дерева исходных кодов ядра Linux, поэтому при обновлении версии ядра ОС драйвер перестанет корректно функционировать.
Как же решить данную проблему? Ну, вам придется повторно скомпилировать версию драйвера устройства, которая будет совместима с текущей версией ядра ОС, и установить ее в систему. Очевидно, что пересборка драйвера при каждом обновлении ядра ОС является не самым оптимальным решением.
В подобной ситуации может оказаться весьма полезным фреймворк динамической поддержки модулей ядра DKMS (Dynamic Kernel Module Support). Фреймворк DKMS позволяет осуществлять автоматическую пересборку модулей ядра Linux с использованием текущего дерева его исходных кодов по мере обновления версий. Производители аппаратного обеспечения нередко выпускают драйверы в виде пакетов DKMS, поэтому пользователи могут свободно обновлять версии ядер своих систем, не заботясь о сборке совместимых версий драйверов устройств. Конечный пользователь может настроить DKMS с целью автоматической пересборки любого драйвера устройства или модуля, исходный код которого не является частью официального дерева исходных кодов ядра Linux.
В рамках данной статьи я постараюсь продемонстрировать методику настройки механизма автоматической пересборки модуля ядра ОС на основе фреймворка DKMS в Linux.
Установка компонентов фреймворка DKMS в Linux
Вы можете установить компоненты фреймворка DKMS в различных дистрибутивах Linux таким же образом, как показано ниже. Для корректной работы DKMS необходим сборочный инструментарий (включающий такие инструменты, как gcc
, make
) и набор заголовочных файлов, причем оба этих компонента должны автоматически устанавливаться силами менеджера пакетов программного обеспечения дистрибутива.
Debian, Ubuntu и Linux Mint:
$ sudo apt-get install dkms
Fedora:
$ sudo dnf install dkms
CentOS и RHEL:
В первую очередь следует подключить репозиторий EPEL, после чего достаточно выполнить следующую команду:
$ sudo yum install dkms
Arch Linux:
$ sudo pacman -S dkms
Автоматическая сборка модуля ядра ОС с помощью фреймворка DKMS
Теперь давайте разберемся с тем, как настроить фреймворк DKMS для автоматической пересборки модуля ядра ОС после обновления последнего. По сути, вам придется создать файл конфигурации DKMS для сборки и установки выбранного модуля ядра ОС в систему. После его создания установка всех обновлений ядра ОС будет инициировать пересборку заданного модуля средствами DKMS.
В данной статье я буду использовать в качестве примера модуль ядра ОС под названием ixgbe
, который по своей сути является драйвером для сетевых карт производства компании Intel.
Во-первых, следует загрузить и распаковать архив исходного кода драйвера устройства в директорию /usr/src/<название-драйвера>-<версия>
.
$ wget http://tenet.dl.sourceforge.net/project/e1000/ixgbe%20stable/4.3.15/ixgbe-4.3.15.tar.gz $ sudo tar -xf ixgbe-4.3.15.tar.gz -C /usr/local/src $ sudo mv /usr/local/src/ixgbe-4.3.15/src /usr/src/ixgbe-4.3.15
После этого нужно создать файл конфигурации с именем dkms.conf
в этой же директории.
$ sudo vi /usr/src/ixgbe-4.3.15/dkms.conf
PACKAGE_NAME="ixgbe" PACKAGE_VERSION="4.3.15" BUILT_MODULE_NAME[0]="ixgbe" DEST_MODULE_LOCATION[0]="/kernel/drivers/net/ethernet/intel/ixgbe/" AUTOINSTALL="yes"
Далее следует добавить исходный код данного модуля в дерево исходного кода ядра ОС на уровне фреймворка DKMS:
$ sudo dkms add -m ixgbe -v 4.3.15
Более простая эквивалентная команда:
$ sudo dkms add ixgbe/4.3.15
Теперь нужно собрать версию данного модуля, совместимую с текущей версией ядра ОС:
$ sudo dkms build -m ixgbe -v 4.3.15
В данном случае также может использоваться более простая эквивалентная команда:
$ sudo dkms build ixgbe/4.3.15
Наконец, нужно установить модуль, совместимый с текущей версией ядра ОС, в систему:
$ sudo dkms install -m ixgbe -v 4.3.15
Разумеется, вы также можете воспользоваться более простой эквивалентной командой:
$ sudo dkms install ixgbe/4.3.15
На данный момент модуль ядра ОС должен быть успешно установлен в систему. Вы можете проверить статус его установки с помощью следующей команды:
$ dkms status | grep ixgbe
Проверка работоспособности механизма автоматической пересборки модуля после обновления ядра ОС
После того, как фреймворк DKMS настроен для автоматической пересборки драйвера ixgbe
, я предлагаю рассмотреть изменения в системе, которые произойдут в результате обновления версии ядра ОС. Я буду обновлять ядро ОС версии 3.10.0-229
до версии 3.10.0-327
. В качестве тестового окружения будет использоваться дистрибутив CentOS 7, поэтому для обновления версии ядра ОС я воспользуюсь утилитой yum
. Обратите внимание на то, что для корректной пересборки драйвера устройства средствами DKMS вместе с пакетами программного обеспечения с компонентами новой версии ядра ОС должен устанавливаться соответствующий пакет программного обеспечения с его заголовочными файлами.
Перед обновлением необходимо узнать версии драйвера ixgbe
и текущего ядра ОС.
$ modinfo ixgbe
Несложно заметить, что драйвер устройства версии 4.3.15
был установлен средствами DKMS в директорию модулей ядра Linux версии 3.10.0-229
.
А теперь попробуем установить новую версию ядра ОС и соответствующих заголовочных файлов:
$ sudo yum install kernel kernel-devel
После перезагрузки с задействованием новой версии ядра ОС следует снова проверить версию драйвера ixgbe
.
Вы должны обнаружить, что драйвер ixgbe
той же версии был автоматически пересобран для ядра Linux новой версии 3.10.0-327
.
Обратите внимание на то, при обновлении версии ядра ОС без установки соответствующего набора заголовочных файлов сборка модуля средствами DKMS попросту не будет инициирована, следовательно, драйвер устройства не будет пересобран из своих исходных кодов. Вместо него будет использоваться официальный драйвер из состава новой версии ядра ОС (если такой доступен).
Например, ниже показан результат обновления ядра ОС без установки соответствующих заголовочных файлов, причем несложно заметить, что в результате был загружен немного устаревший драйвер устройства ixgbe из его состава.
Вы всегда можете пересобрать необходимый драйвер устройства средствами DKMS, самостоятельно инициировав его сборку. Конечно же, перед этим этом следует убедиться в наличии в системе заголовочных файлов для текущей версии ядра ОС.
$ sudo yum install kernel-devel $ sudo dkms build ixgbe/4.3.15 $ sudo dkms install ixgbe/4.3.15
Заключение
В данной статье была продемонстрирована методика использования фреймворка DKMS для автоматической пересборки модуля ядра ОС. Бесспорно, использование фреймворка DKMS не всегда является оправданным решением, особенно в системах Linux, находящихся в промышленной эксплуатации, в которых обычно запрещена установка компонентов сборочного инструментария. Но при этом DKMS значительно упрощает жизнь разработчиков программного обеспечения и пользователей персональных настольных систем, автоматически собирая необходимые модули ядра ОС по мере установки его обновлений.