Dynamic Kernel Module Support (Русский)
Состояние перевода: На этой странице представлен перевод статьи Dynamic Kernel Module Support. Дата последней синхронизации: 2022-02-27. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.
Dynamic Kernel Module Support (DKMS) — это фреймворк, который используется для генерации тех модулей ядра Linux, которые в общем случае не включены в дерево исходного кода. DKMS позволяет драйверам устройств автоматически пересобираться, когда ядро уже установлено.
Это означает, что пользователь может не ждать, пока какая-то компания, проект или сопроводитель пакета выпустит новую версию модуля. После введения хуков pacman пересборка модулей осуществляется автоматически во время обновления ядра.
Установка
Установите пакет dkms и заголовочные файлы требуемого ядра/ядер. Например, для ядра по умолчанию linux соответствует linux-headers . Другие ядра имеют собственные пакеты с заголовочными файлами.
Значительное число модулей, не включенных в ядро, имеют DKMS вариант; некоторые из них размещаются в официальных репозиториях, но большинство из них можно найти только в AUR.
Обновления
Обычно пересборка модулей DKMS во время обновления ядра выполняется бесшовно, но что-то может пойти не так. Следует обратить особое внимание на вывод pacman! Это, в частности, относится к тем системам, которым требуется модуль DKMS для успешной загрузки и/или если вы используете DKMS с ядром не из официальных репозиториев.
Для того, чтобы следовать изменениям в ядре, исправить ошибки или добавить необходимый функционал, подумайте об обновлении соответствующего пакета DKMS перед перезагрузкой.
Использование
Использование DKMS вручную.
Автозавершение по Tab будет доступно после выполнения команды:
# source /usr/share/bash-completion/completions/dkms
Список модулей
Чтобы увидеть текущее состояние модулей, версий и ядер внутри дерева, выполните:
# dkms status
Пересборка модулей
Пересборка всех модулей для текущего ядра:
# dkms autoinstall
или для конкретного ядра:
# dkms autoinstall -k 3.16.4-1-ARCH
Сборка конкретного модуля для текущего ядра:
# dkms install -m nvidia -v 334.21
# dkms install nvidia/334.21
Сборка модуля для всех ядер:
# dkms install nvidia/334.21 --all
Удаление модулей
Удаление модуля (старые автоматически не удаляются):
# dkms remove -m nvidia -v 331.49 --all
# dkms remove nvidia/331.49 --all
Если пакет dkms удален, то теряется информация о предыдущих файлах сборки модуля. В этом случае, перейдите в директорию /usr/lib/modules/kernel_release и /var/lib/dkms/package_name и удалите все файлы и каталоги, которые больше не используются.
Создание DKMS пакета
Initial ramdisk
В случаях для любых модулей, которые были установлены через DKMS и используются в Initrd, например zfs-dkms AUR , может быть полезно написать хук pacman для автоматической пересборки образа(ов) initramfs.
Например, когда используется linux и mkinitcpio, то для обновления модуля ZFS после каждого zfs-dkms AUR апгрейда,
/etc/pacman.d/hooks/90-mkinitcpio-dkms-linux.hook
[Trigger] Operation=Install Operation=Upgrade Operation=Remove Type=Package Target=zfs-dkms Target=linux [Action] Description=Update dkms modules in Linux initcpio Depends=mkinitcpio When=PostTransaction NeedsTargets Exec=/bin/sh -c 'while read -r trg; do case $trg in linux) exit 0; esac; done; /usr/bin/mkinitcpio -p linux'
Вы можете добавить больше таргетов в хук и сделать дополнительные копии хука, если в вашей система установлены другие ядра. Префикс 90- необходим для гарантированного запуска после хуков DPKMS.
Смотрите также
Что такое DKMS в Linux 5 мин для чтения

D KMS или Dynamic Kernel Module Support — это система, которая позволяет обновлять отдельные модули ядра без необходимости модификации всего ядра. Это бесплатное программное обеспечение под лицензией GPL v2, написанное командой Dell Linux Engineering Team. Первоначально DKMS был разработан для Dell Computer Corporation для распространения программных исправлений среди клиентов четко определенным образом.
DKMS имеет много преимуществ для сообществ поставщиков услуг Linux, например:
- С точки зрения разработчика драйверов, это помогает добавлять драйверы, которых еще нет в базовом ядре. Кроме того, разработчики драйверов, которые должны предоставлять обновленные драйверы устройств для тестирования и общего использования с большим количеством ядер, также получают выгоду. Еще одним преимуществом DKMS является то, что разработчики могут тестировать код своего драйвера на разных машинах. На самом деле это ускоряет процесс разработки драйверов.
- С точки зрения системного администратора DKMS упрощает процесс установки обновлений драйверов устройств в активное ядро без внесения в него каких-либо изменений. Следовательно, им не нужно ждать прибытия нового ядра.
- Выбранные исправления ошибок или исправления могут быть развернуты между крупными обновлениями.
- Новое оборудование, которое требует модификации в одном модуле, может быть легко интегрировано. Опять же, этого можно добиться без полного тестирования новых ядер.
Что мы будем освещать?
В этой статье будут обсуждаться различные термины, связанные с ядром, и, в частности, что такое DKMS.
Краткий обзор терминологии
Что такое ядро Linux?
Это основная часть ОС Linux. Это основной интерфейс между процессами, работающими в ОС, и ее оборудованием. Он управляет основными функциями, такими как управление памятью, управление процессами, управление ЦП, управление драйверами устройств, а также системные вызовы и управление безопасностью.
Пространство ядра
Ядро фактически скрыто от пользователя и работает в своей собственной области, называемой пространством ядра. Пользователь взаимодействует с ядром с помощью пользовательских приложений, таких как файловый браузер, веб-браузер и т. д. Эти взаимодействия используют специальную программную конструкцию, называемую системным вызовом.
Читать Как включить TCP BBR для увеличения скорости сети/интернета на сервере Linux
Дерево исходного кода ядра
Содержит весь исходный код ядра и драйверов устройств. Он состоит из множества каталогов и подкаталогов, таких как arch, block, crypto, include, init, lib, usr и т. д.
Модули ядра Linux
Модули ядра Linux в основном представляют собой фрагменты кода. Их можно добавлять и удалять из ядра в соответствии с требованиями. Они могут быть встроенными или загружаемыми. Модуль ядра расширяет функции ядра, не требуя перезагрузки системы. В отличие от микроядер, где добавление новых компонентов в ядро требует настройки и сборки нового ядра, мы можем загружать и выгружать компоненты или модули ОС во время выполнения. Этими модулями являются драйверы устройств, файловые системы и т. д.
После того, как модуль загружен, он подобен фрагменту кода ядра. Он имеет те же привилегии и обязанности, что и обычный код ядра.
Определение DKMS
Вот выдержка из определения DKMS, которую мы нашли здесь :
«DKMS — это инфраструктура, в которой исходный код драйвера устройства может находиться за пределами дерева исходного кода ядра, что упрощает пересборку модулей при обновлении ядра».
Остановимся на вышеизложенном. Система DKMS представляет собой дерево из базового дерева ядра на земле. Он содержит исходный код модуля и скомпилированные двоичные файлы модуля. В результате этой репликации модули не связаны с ядром.
Мы впервые столкнулись с концепцией DKMS, когда купили ноутбук HP и установили на него Ubuntu 18.04. Все работало нормально, кроме Wi-Fi. Ноутбук не смог найти какой-либо адаптер Wi-Fi. В настройках в меню Wi-Fi появилось сообщение “No WiFi Adapter Found”. Мы начали искать в форумах в Интернете и обнаружили, что многие люди сталкиваются с той же проблемой. Мы нашли много решений, предлагающих установить заголовочные файлы, драйверы и другие пакеты.
Читать Преимущества VPS-серверов NVMe
Мы просто слепо следовали этим руководствам, не зная, что они на самом деле хотели передать. В любом случае, эти руководства помогли, и каким-то образом заработал Wi-Fi. Но проблема заключалась в том, что всякий раз, когда обновляли свою систему Ubuntu, возникала одна и та же проблема, и мне приходилось повторять одни и те же шаги по перекомпиляции скачанных драйверов. Также приходится исправлять проблему с низким уровнем сигнала каждый раз после установки драйвера. Даже установили ОС Windows, и, к нашему удивлению, Wi-Fi действительно работал безупречно. Но все равно приходится использовать Ubuntu для работы. Поэтому решили жить с временным патчем, который получил ранее.
DKMS приходит на помощь
Недавнее решение, с которым только что столкнулись и которое меня не заботило в прошлом, использовало способ DKMS. Вместо использования команды make или make install DKMS выполняет три операции с исходным кодом: добавление, сборка и установка.
Использование DKMS
Для работы DKMS исходный код модуля должен присутствовать в системе, в которой мы собираем модуль, а путь расположения должен быть таким, как «/usr/src/-/», и помните, что это самое первое требование DKMS. Еще одним требованием является файл с именем «dkms.conf», который поможет вам собрать и установить модуль. Кстати говоря, DKMS уже должен быть установлен в системе. Когда все на месте, мы можем добавить модуль в дерево DKMS.
Давайте посмотрим на эти шаги, установив демонстрационный модуль «demo-v0.1.tar.gz» с помощью DKMS. Мы делаем этот образец только для того, чтобы понять, как работает DKMS. После извлечения файла нам нужно «cd» внутри него:
# cd demo-v0.1/
Теперь создайте файл dkms.conf, содержащий следующие строки:
MAKE="make -C src/ KERNELDIR=/lib/modules/$/build" CLEAN="make -C $ M=$/$/$/build clean" BUILT_MODULE_NAME=”demo” BUILT_MODULE_LOCATION=”src” PACKAGE_NAME=demo PACKAGE_VERSION=0.1 REMAKE_INITRD=”yes” AUTOINSTALL=yes
Теперь, когда наш файл dkms.conf готов, мы можем добавить наш демо-модуль как:
# dkms add -m demo -v 0.1
Читать 10 Основных шагов для настройки нового сервера в 2023 году
Прелесть DKMS в том, что мы можем указать версию ядра, для которой мы хотим выполнить сборку или модуль, как показано здесь:
# dkms build -m demo -v 0.1 -k 5.13.0-27
Если мы не укажем ядро, DKMS соберет модуль с текущей версией ядра.
Если все пойдет хорошо, теперь мы можем установить модуль, используя:
# dkms install -m demo -v 0.1
Если мы обновим наше ядро или изменим аппаратную архитектуру, модуль должен быть снова пересобран вручную. С помощью DKMS эта процедура становится избыточной, поскольку DKMS динамически создает эти модули ядра для каждого ядра, присутствующего в системе.
Заключение
Такие инструменты, как DKMS, очень помогли администраторам, разработчикам драйверов и другим пользователям упростить задачу управления ядром. В то время как конечные пользователи не заботятся о том, как работает базовая система, пока их цели не будут достигнуты, DKMS позволяет разработчикам и администраторам сосредоточиться на своей работе.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Автоматическая сборка модулей ядра при помощи DKMS
В некоторых случаях ручная сборка модулей ядра нецелесообразна, поскольку удобнее использовать Dynamic Kernel Module Support (DKMS)
Технология DKMS позволяет в том числе производить автоматическую сборку модулей системы при обновлении ядра.
В данной статье рассматривается автоматическое управление при помощи DKMS на примере модулей шины CAN.
DKMS предполагает, что пакет модуля или совокупности модулей ядра располагается в директории /usr/src/-
Кроме исходных текстов модуля/модулей, директория пакета содержит конфиг dkms.conf, а также Makefile, в соответствии с которым производится сборка.
- net/can
- drivers/net/can
PACKAGE_NAME="can-dkms" PACKAGE_VERSION="4.1.6-200" MAKE[0]="make M=$dkms_tree/$PACKAGE_NAME/$PACKAGE_VERSION/build modules" BUILT_MODULE_NAME[0]="can" BUILT_MODULE_LOCATION[0]="net/can" DEST_MODULE_LOCATION[0]="/updates/net/can" BUILT_MODULE_NAME[1]="can-raw" BUILT_MODULE_LOCATION[1]="net/can" DEST_MODULE_LOCATION[1]="/updates/net/can" BUILT_MODULE_NAME[2]="can-bcm" BUILT_MODULE_LOCATION[2]="net/can" DEST_MODULE_LOCATION[2]="/updates/net/can" BUILT_MODULE_NAME[3]="can-gw" BUILT_MODULE_LOCATION[3]="net/can" DEST_MODULE_LOCATION[3]="/updates/net/can" BUILT_MODULE_NAME[4]="vcan" BUILT_MODULE_LOCATION[4]="drivers/net/can" DEST_MODULE_LOCATION[4]="/updates/drivers/net/can" BUILT_MODULE_NAME[5]="can-dev" BUILT_MODULE_LOCATION[5]="drivers/net/can" DEST_MODULE_LOCATION[5]="/updates/drivers/net/can" BUILT_MODULE_NAME[6]="kvaser_usb" BUILT_MODULE_LOCATION[6]="drivers/net/can/usb" DEST_MODULE_LOCATION[6]="/updates/drivers/net/can/usb" AUTOINSTALL="yes"
В конфиге указывается имя и версия пакета, команда сборки, список собираемых модулей, а также включается автосборка.
В директории пакета также необходимо создать Makefile:
# net/can export CONFIG_CAN := m export CONFIG_CAN_RAW := m export CONFIG_CAN_BCM := m export CONFIG_CAN_GW := m export CONFIG_CAN_VCAN := m # drives/net/can export CONFIG_CAN_DEV := m export CONFIG_CAN_KVASER_USB := m SRC_DIRS := net/can drivers/net/can modules: $(SRC_DIRS) $(SRC_DIRS): $(MAKE) -C /lib/modules/`uname -r`/build M="$(M)/$@" subdir-ccflags-y=-DCONFIG_CAN_CALC_BITTIMING .PHONY: $(SRC_DIRS) modules
В Makefile задается структура поддиректорий модулей шины CAN, а также список собираемых модулей.
Таким образом, пакет DKMS для модулей шины CAN создан.
Далее необходимо зарегистрировать пакет в дереве DKMS:
sudo dkms add -m can-dkms -v 4.1.6-200
После чего создается ссылка /var/lib/dkms/can-dkms/4.1.6-200/source
Сборка и установка пакета производится командами:
sudo dkms build -m can-dkms -v 4.1.6-200 sudo dkms install -m can-dkms -v 4.1.6-200
В случае необходимости пакет можно удалить из дерева командой:
sudo dkms remove -m can-dkms/4.1.6-200 --all
При создании статьи были использованы материалы проекта aur.archlinux.org/packages/linux-can-dkms
Зачем нужен DKMS?
Прочитал о выходе нового драйвера NVidia, и что в нем «обеспечена возможность динамической пересборки модуля ядра Linux с использованием DKMS». Почитал про DKMS тут и тут. Не понял где профит.
1. Заявляется что «DKMS позволяет драйверам устройств автоматически пересобираться, когда ядро уже собрано». А без DKMS они как собираются — перед тем как ядро собрано? При условии правильного линка /usr/src/linux , в Gentoo (уверен что и в другом дистрибутиве) emerge nvidia-drivers тоже сделает то, что нужно.
2. Заявляется «автоматическая рекомпиляция всех модулей в случае установки новой версии ядра». Но оно ж не мониторит систему на предмет нового ядра! Просто когда ты установил новое ядро, будь добр, переустанови «внешние» драйвера.
Kroz ★★★★★
14.07.12 09:27:45 MSK

Открой для себя бинарные дистры. Ядро там прилетает уже собранное и в post-install скрипте просто вызывает dkms-autoinstall для пересборки локально собранных с помощью dkms драйверов. Профит в отсутствии ручной работы — все происходит автоматически и не надо самому следить за локально собранными модулями.
redgremlin ★★★★★
( 14.07.12 10:07:47 MSK )

«Выращиваю зерно, мелю его, завожу тесто, пеку. В чем профит от булочных?»