- Dynamic Kernel Module Support (Русский)
- Contents
- Установка
- Обновления
- Использование
- Список модулей
- Пересборка модулей
- Удаление модулей
- Создание DKMS пакета
- Initial ramdisk
- Автоматическая сборка модуля ядра ОС с помощью фреймворка DKMS в Linux
- Автоматическая сборка модуля ядра ОС с помощью фреймворка DKMS в Linux
- Установка компонентов фреймворка DKMS в Linux
- Автоматическая сборка модуля ядра ОС с помощью фреймворка DKMS
- Проверка работоспособности механизма автоматической пересборки модуля после обновления ядра ОС
- Заключение
- Install Kernel Modules¶
- Install with DKMS¶
- Install DKMS package from PPA¶
- Install with in-tree modules¶
- Ubuntu Wiki
- DKMSPackaging
- Summary
- Prepare source
- dkms.conf
- DKMS commands
- Debug when DKMS build failed
- Generate DKMS deb
- Limitation of DKMS
Dynamic Kernel Module Support (Русский)
Dynamic Kernel Module Support (DKMS) — это фреймворк, который используется для генерации тех модулей ядра Linux, которые в общем случае не включены в дерево исходного кода. DKMS позволяет драйверам устройств автоматически пересобираться, когда ядро уже установлено.
Это означает, что пользователь может не ждать, пока какая-то компания, проект или сопроводитель пакета выпустит новую версию модуля. После введения хуков pacman пересборка модулей осуществляется автоматически во время обновления ядра.
Contents
Установка
Установите пакет dkms и заголовочные файлы требуемого ядра/ядер. Например, для ядра по умолчанию linux соответствует linux-headers . Другие ядра имеют собственные пакеты с заголовочными файлами.
Значительное число модулей, не включенных в ядро, имеют DKMS вариант; некоторые из них размещаются в официальных репозиториях, но большинство из них можно найти только в AUR.
Обновления
Обычно пересборка модулей DKMS во время обновления ядра выполняется бесшовно, но что-то может пойти не так. Следует обратить особое внимание на вывод pacman! Это, в частности, относится к тем системам, которым требуется модуль DKMS для успешной загрузки и/или если вы используете DKMS с ядром не из официальных репозиториев.
Для того, чтобы следовать изменениям в ядре, исправить ошибки или добавить необходимый функционал, подумайте об обновлении соответствующего пакета DKMS перед перезагрузкой.
Использование
Использование DKMS вручную.
Автозавершение по Tab будет доступно после выполнения команды:
Список модулей
Чтобы увидеть текущее состояние модулей, версий и ядер внутри дерева, выполните:
Пересборка модулей
Пересборка всех модулей для текущего ядра:
или для конкретного ядра:
Сборка конкретного модуля для текущего ядра:
Сборка модуля для всех ядер:
Удаление модулей
Удаление модуля (старые автоматически не удаляются):
Если пакет dkms удален, то теряется информация о предыдущих файлах сборки модуля. В этом случае, перейдите в директорию /usr/lib/modules/KERNELVERSION-ARCH и удалите все файлы и каталоги, которые больше не используются.
Создание DKMS пакета
Initial ramdisk
В случаях для любых модулей, которые были установлены через DKMS и используются в Initrd, например zfs-dkms AUR , может быть полезно написать хук pacman для автоматической пересборки образа(ов) initramfs.
Например, когда используется linux и mkinitcpio, то для обновления модуля ZFS после каждого zfs-dkms AUR апгрейда,
Вы можете добавить больше таргетов в хук и сделать дополнительные копии хука, если в вашей система установлены другие ядра. Префикс 90- необходим для гарантированного запуска после хуков DPKMS.
Источник
Автоматическая сборка модуля ядра ОС с помощью фреймворка 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:
В первую очередь следует подключить репозиторий EPEL, после чего достаточно выполнить следующую команду:
Автоматическая сборка модуля ядра ОС с помощью фреймворка DKMS
Теперь давайте разберемся с тем, как настроить фреймворк DKMS для автоматической пересборки модуля ядра ОС после обновления последнего. По сути, вам придется создать файл конфигурации DKMS для сборки и установки выбранного модуля ядра ОС в систему. После его создания установка всех обновлений ядра ОС будет инициировать пересборку заданного модуля средствами DKMS.
В данной статье я буду использовать в качестве примера модуль ядра ОС под названием ixgbe , который по своей сути является драйвером для сетевых карт производства компании Intel.
Во-первых, следует загрузить и распаковать архив исходного кода драйвера устройства в директорию /usr/src/ — .
После этого нужно создать файл конфигурации с именем dkms.conf в этой же директории.
Далее следует добавить исходный код данного модуля в дерево исходного кода ядра ОС на уровне фреймворка DKMS:
Более простая эквивалентная команда:
Теперь нужно собрать версию данного модуля, совместимую с текущей версией ядра ОС:
В данном случае также может использоваться более простая эквивалентная команда:
Наконец, нужно установить модуль, совместимый с текущей версией ядра ОС, в систему:
Разумеется, вы также можете воспользоваться более простой эквивалентной командой:
На данный момент модуль ядра ОС должен быть успешно установлен в систему. Вы можете проверить статус его установки с помощью следующей команды:
Проверка работоспособности механизма автоматической пересборки модуля после обновления ядра ОС
После того, как фреймворк DKMS настроен для автоматической пересборки драйвера ixgbe , я предлагаю рассмотреть изменения в системе, которые произойдут в результате обновления версии ядра ОС. Я буду обновлять ядро ОС версии 3.10.0-229 до версии 3.10.0-327 . В качестве тестового окружения будет использоваться дистрибутив CentOS 7, поэтому для обновления версии ядра ОС я воспользуюсь утилитой yum . Обратите внимание на то, что для корректной пересборки драйвера устройства средствами DKMS вместе с пакетами программного обеспечения с компонентами новой версии ядра ОС должен устанавливаться соответствующий пакет программного обеспечения с его заголовочными файлами.
Перед обновлением необходимо узнать версии драйвера ixgbe и текущего ядра ОС.
Несложно заметить, что драйвер устройства версии 4.3.15 был установлен средствами DKMS в директорию модулей ядра Linux версии 3.10.0-229 .
А теперь попробуем установить новую версию ядра ОС и соответствующих заголовочных файлов:
После перезагрузки с задействованием новой версии ядра ОС следует снова проверить версию драйвера ixgbe .
Вы должны обнаружить, что драйвер ixgbe той же версии был автоматически пересобран для ядра Linux новой версии 3.10.0-327 .
Обратите внимание на то, при обновлении версии ядра ОС без установки соответствующего набора заголовочных файлов сборка модуля средствами DKMS попросту не будет инициирована, следовательно, драйвер устройства не будет пересобран из своих исходных кодов. Вместо него будет использоваться официальный драйвер из состава новой версии ядра ОС (если такой доступен).
Например, ниже показан результат обновления ядра ОС без установки соответствующих заголовочных файлов, причем несложно заметить, что в результате был загружен немного устаревший драйвер устройства ixgbe из его состава.
Вы всегда можете пересобрать необходимый драйвер устройства средствами DKMS, самостоятельно инициировав его сборку. Конечно же, перед этим этом следует убедиться в наличии в системе заголовочных файлов для текущей версии ядра ОС.
Заключение
В данной статье была продемонстрирована методика использования фреймворка DKMS для автоматической пересборки модуля ядра ОС. Бесспорно, использование фреймворка DKMS не всегда является оправданным решением, особенно в системах Linux, находящихся в промышленной эксплуатации, в которых обычно запрещена установка компонентов сборочного инструментария. Но при этом DKMS значительно упрощает жизнь разработчиков программного обеспечения и пользователей персональных настольных систем, автоматически собирая необходимые модули ядра ОС по мере установки его обновлений.
Источник
Install Kernel Modules¶
Install with DKMS¶
In order to support the mandatory kernel subsystems ashmem and binder for the Android container you have to install two DKMS based kernel modules. The source for the kernel modules is maintained by the Anbox project here.
At the moment we only have packages prepared for Ubuntu in a PPA on Launchpad. If you want to help to get the packages in your favorite distribution please come and talk to us or submit a PR with the distribution specific packaging.
Install DKMS package from PPA¶
Starting with Ubuntu 19.04 binder and ashmem are now build with the standard Ubuntu kernel (>= 5.0) and you don’t have to install the modules from the PPA anymore.
In order to add the PPA to your Ubuntu system please run the following commands:
In case add-apt-repository is missing, install it via:
These will add the PPA to your system and install the anbox-modules-dkms package which contains the ashmem and binder kernel modules. They will be automatically rebuild every time the kernel packages on your system update.
Please install the corresponding header package for your running kernel, if you’re not using the default one.
After you installed the anbox-modules-dkms package you have to manually load the kernel modules. The next time your system starts they will be automatically loaded.
Now you should have two new nodes in your systems /dev directory:
Install with in-tree modules¶
Android ashmem and binder modules are in linux kernel tree. So it’s possible to build them as in-tree modules.
You can enable them, by looking at the following configuration,
However if you don’t want these modules to be built-in for your kernel, you can apply the following patches, to build them as modules.
Debian has enabled these modules since kernel 4.17.3. So you don’t need to bother how to install. Currently kernel 4.17.3 and above are only available in Debian Unstable.
Other distributions are welcome to take these patches and enable them by default.
Источник
Ubuntu Wiki
DKMSPackaging
Summary
dkms is a framework which allows kernel modules to be dynamically built for each kernel on your system in a simplified and organized fashion.
This page will show you how to build an DKMS deb package.
Prepare source
Prepare your kernel module source. It contains the C file and its Makefile at least. The following is an hello world kernel module as an example
The following is its Makefile as example.
Please use a variable to keep the kernel version we want to compile. In the above example, it is $(KVERSION). We usually run dkms build under the various kernel version, and the DKMS will pass the target kernel version to Makefile.
Please put your Makefile and source code at /usr/src/ — . For example, I put above two files at /usr/src/hello-0.1
dkms.conf
Add dkms.conf and put it with your Makefile
Here is an example dkms.conf for hello-0.1
PACKAGE_NAME, PACKAGE_VERSION is necessary information, it shall be the same with the information or your folder name.
CLEAN is the command to clean up the folder. Every time before build, it will be executed. If unset, it is assumed to be «make clean»
MAKE[0] is the first command to build the kernel object. Since this is an example, this is the only command we have. This field tells DKMS how to build the kernel object, and we can pass the target kernel version by using $kernelver that DKMS provides us.
DEST_MODULE_LOCATION[0] tells DKMS where to put the kernel object when installing. In this example, the kernel object will be «/lib/modules/$kernelver/updates». In Ubuntu, this information will be overrade to «/updates/dkms». It means our kernel objects will be put at /lib/modules/$kernelver/updates/dkms». Although this information will be overrade, it is still a necessary field.
AUTOINSTALL set to yes means DKMS will try to build and install the kernel object when booting and it won’t be re-built nor re-installed if the kernel object has been installed.
DKMS commands
Now, use «dkms add» to tell DKMS we have a module is ready. DKMS will create symlink from /var/lib/dkms to /usr/src.
Then, you can try to build this module with «DKMS build».
And, you can install this module to the kernel module tree.
Then, you can see the kernel object has been add to your module tree
And you can use it now.
If the module is useless for you, you can remove the module from DKMS. All files related to this module under /var/lib/dkms and /lib/modules will be removed.
You can also ask DKMS to build and install this module for another kernel version after «dkms add».
It is also possible to build against multiple kernel versions.
The pre-built modules will be included in the DKMS deb made later. When the versions of the pre-built modules and the kernel on the target computer match, the pre-built modules will just be used rather than compiling on installation.
Debug when DKMS build failed
If DKMS build kernel failed, it will leave the make.log for you to tell what happened.
The log will be at /var/lib/dkms/ / /build/make.log
In this example, the log will be /var/lib/dkms/hello/0.1/build/make.log
Generate DKMS deb
Using «dkms mkdeb» to build deb package. You shall run «dkms mkdeb» after «dkms add» and «dkms build»
And you can have the deb package
with AUTOINSTALL=yes in dkms.conf, you can boot with various kernel and dkms will build the kernel module automatically for you.
Limitation of DKMS
1. DKMS may not work well after a large change of kernel ABI — Using DKMS on a stable release kernel will be a better idea.
2. Make sure the we have toolchains and kernel header installed.
3. Using DKMS on a netbook is not a smart idea — It takes too much time to build the kernel module after kernel upgrading.
4. DKMS modules will not be loaded if there are another ones in initrd.
Kernel/Dev/DKMSPackaging (последним исправлял пользователь fourdollars 2016-12-30 11:03:22)
Источник