Dynamic Kernel Module Support (Русский)
Из Википедии:
- Dynamic Kernel Module Support или DKMS — фреймворк, который используется для генерации тех модулей ядра Linux, которые в общем случае не включены в дерево исходного кода. DKMS позволяет драйверам устройств автоматически пересобираться, когда ядро уже собрано.
Contents
Преимущества и недостатки
Преимуществом использования DKMS является то, что модули модули часто могут быть пересобраны, когда вы обновили ядро. Это означает, что пользователь может не ждать, пока какая-то компания, проект или сопроводитель пакета выпустит новую версию модуля.
Недостатком использования DKMS является то, что DKMS портит базу данных Pacman. Проблема в том, что такие модули больше не принадлежат какому-то пакету, поэтому Pacman не может их отслеживать. Однако, теоретически такая поддержка может быть добавлена с помощью перехватчиков (хуков) (смотрите: FS#2985).
Установка
Установите dkms из официальных репозиториев.
Активируйте dkms
systemd сервис, чтобы DKMS модули пересобрались автоматически после перезагрузки, когда вы обновите ядро.
Огромное количество модулей, которые не включены в ядро имеют DKMS вариант; некоторые из них хостятся в официальных репозиториях, но большинство из них можно найти только в AUR. Listed below are a few of the software packages that have a DKMS variant with additional links to dedicated sections where available:
- AMD Catalyst: catalyst-dkms;
- NVIDIA: nvidia-dkms, nvidia-304xx-dkms, nvidia-173xx-dkms, nvidia-96xx-dkms;
- VirtualBox, section VirtualBox#Hosts running a custom kernel;
- VMware, section VMware#Using DKMS to manage the modules.
Обновления
Though modules are able to be rebuilt usually through a good number of kernel upgrades, at times the package will need to get upgraded. To deal with changes in the kernel, fix bugs, or add necessary features consider upgrading the DKMS package before rebooting.
Использование
Usage for invoking DKMS manually.
Tab-completion is available by doing:
# source /usr/share/bash-completion/completions/dkms
Пересборка модулей
Чтобы пересобрать все модули:
# dkms autoinstall -k $(uname -r)
или для конкретного ядра:
# dkms autoinstall -k 3.16.4-1-ARCH
Чтобы собрать какой-то определённый модуль (например, для текущего ядра):
# dkms install -m nvidia -v 334.21 -k $(uname -r)
или просто:
# dkms install nvidia/334.21 -k $(uname -r)
Чтобы собрать модуль для всех ядер:
# dkms install nvidia/334.21 --all
Удаление модулей
Чтобы удалить модуль (старые модули не удаляются автоматически):
# dkms remove -m nvidia -v 331.49 --all
или просто:
# dkms remove nvidia/331.49 --all
Создание DKMS пакета
Здесь приведены некоторые указания, которые вы должны выполнять при создании DKMS пакета.
Название пакета
DKMS пакеты обозначают приписыванием "-dkms" к исходному названию пакета.
Переменная $_pkgname
часто используется после $pkgname
, чтоды описать название пакета без "-dkms" суффикса (например, _pkgname=${pkgname%-*
}). Это полезно для того, чтобы сохранялась одинаковость между обычным исходным PKGBUILD пакета и его DKMS вариантом.
Зависимости
Dependencies should be inherited from the original version with dkms added and linux-headers removed (as it is listed by the dkms pacakge as optional).
Build source location
Build sources should go into (this is the default build directory for DKMS):
/usr/src/PACKAGE_NAME-PACKAGE_VERSION
In the package directory, a DKMS configuration tells DKMS how to build the module (dkms.conf
), including the variables PACKAGE_NAME
and PACKAGE_VERSION
.
-
PACKAGE_NAME
- the actual project name (usually$_pkgname
or$_pkgbase
). -
PACKAGE_VERSION
- by convention this should also be the$pkgver
.
Patching
The sources can be patched either directly in the PKGBUILD or through dkms.conf
.
Module loading automatically in .install
Loading and unloading modules should be left to the user. Consider the possibility a module may crash when loaded.
namcap output
namcap (which attempts to check for common mistakes and non-standard decisions in a package) is good practice to use at least once on any package; however, it has not yet been updated for DKMS specific guidelines.
For example, DKMS uses /usr/src/
by default, but Namcap believes this to be a non-standard directory, a little contrary to its reference.
Пример
Here is an example package that edits dkms.conf
according to the package name and version.
PKGBUILD
PKGBUILD
# Maintainer: foo <foo(at)gmail(dot)com> # Contributor: bar <bar(at)gmai(dot)com> _pkgbase=amazing pkgname=amazing-dkms pkgver=1 pkgrel=1 pkgdesc="The Amazing kernel modules (DKMS)" arch=('i686' 'x86_64') url="https://www.amazing.com/" license=('GPL2') depends=('dkms') conflicts=("${_pkgbase}") install=${pkgname}.install source=("${url}/files/tarball.tar.gz" 'dkms.conf' 'linux-3.14.patch') md5sums=(use 'updpkgsums') build() { cd ${_pkgbase}-${pkgver} # Patch patch -p1 -i "${srcdir}"/linux-3.14.patch # Build msg2 "Starting ./configure..." ./configure msg2 "Starting make..." make } package() { # Install msg2 "Starting make install..." make DESTDIR="${pkgdir}" install # Copy dkms.conf install -Dm644 dkms.conf "${pkgdir}"/usr/src/${_pkgbase}-${pkgver}/dkms.conf # Set name and version sed -e "s/@_PKGBASE@/${_pkgbase}/" \ -e "s/@PKGVER@/${pkgver}/" \ -i "${pkgdir}"/usr/src/${_pkgbase}-${pkgver}/dkms.conf # Copy sources (including Makefile) cp -r ${_pkgbase}/* "${pkgdir}"/usr/src/${_pkgbase}-${pkgver}/ }
dkms.conf
dkms.conf
PACKAGE_NAME="@_PKGBASE@" PACKAGE_VERSION="@PKGVER@" MAKE[0]="make --uname_r=$kernelver" CLEAN="make clean" BUILT_MODULE_NAME[0]="@_PKGBASE@" DEST_MODULE_LOCATION[0]="/kernel/drivers/misc" AUTOINSTALL="yes"
.install
Instead of depmod
now dkms install
can be used (it depends on dkms build
, which depends on dkms add
):
amazing-dkms.install
# old version (without -$pkgrel): ${1%%-*} # new version (without -$pkgrel): ${2%%-*} post_install() { dkms install amazing/${1%%-*} } pre_upgrade() { pre_remove ${2%%-*} } post_upgrade() { post_install ${1%%-*} } pre_remove() { dkms remove amazing/${1%%-*} --all }