Dynamic Kernel Module Support (Русский)

Tango-preferences-desktop-locale.png

Tango-preferences-desktop-locale.png

Эта страница нуждается в сопроводителе

Статья не гарантирует актуальность информации. Помогите русскоязычному сообществу поддержкой подобных страниц. См. Команда переводчиков ArchWiki

Из Википедии:

Dynamic Kernel Module Support или DKMS — фреймворк, который используется для генерации тех модулей ядра Linux, которые в общем случае не включены в дерево исходного кода. DKMS позволяет драйверам устройств автоматически пересобираться, когда ядро уже собрано.

Преимущества и недостатки

Преимуществом использования 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:

Обновления

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
}
Tip: To keep DKMS packages closer to their non-DKMS counterparts: avoid cluttering up package files with DKMS-specific stuff (e.g. version numbers that need updating).

Смотрите также