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

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

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

Статья не гарантирует актуальность информации. Помогите русскоязычному сообществу поддержкой подобных страниц. См. Команда переводчиков 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:

- 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
    }

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).

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

- Linux Journal: Exploring Dynamic Kernel Module Support

Categories:

- Kernel (Русский)
- Русский