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

From ArchWiki
Jump to: navigation, search


Состояние перевода: На этой странице представлен перевод статьи Dynamic Kernel Module Support. Дата последней синхронизации: 28 января 2018. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

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

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

Это означает, что пользователь может не ждать, пока какая-то компания, проект или сопроводитель пакета выпустит новую версию модуля. После введения Pacman#Hooks пересборка модулей осуществляется автоматически во время обновления ядра.

Установка

Установите пакет dkms и заголовочные файлы вашего ядра (linux-headers - заголовочные файлы ядра по умолчанию).

Значительное число модулей, не включенных в ядро, имеют DKMS вариант; некоторые из них размещаются в официальных репозиториях, но большинство из них можно найти только в AUR.

Обновления

Примечание: pacman не берет в расчет зависимости, когда пересобирает модули DKMS. Как следствие, это приведет к ошибкам во время сборки, если один модуль DKMS зависит от другого (например zfs-dkmsAUR). Смотрите следующий отчет об ошибке FS#52901. dkms-sortedAUR[ссылка недействительна: package not found] добавляет экспериментальную поддержку для подобных зависимостей; технически это замена пакета `dkms`. Самый простой способ попробовать - установить dkms-sortedAUR[ссылка недействительна: package not found] перед установкой любых DKMS модулей.

Обычно пересборка модулей 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/KERNELVERSION-ARCH и удалите все файлы и папки, которые больше не используются.

Создание DKMS пакета

Здесь приведены некоторые рекомендации, которым необходимо следовать при создании пакета DKMS.

Название пакета

Пакеты DKMS обозначают приписыванием "-dkms" к исходному названию пакета.

Переменная $_pkgname часто используется после $pkgname, чтобы описать название пакета без "-dkms" (например, _pkgname=${pkgname%-*}). Это полезно для того, чтобы сохранялось сходство между исходным PKGBUILD пакета и его DKMS вариантом.

Зависимости

Зависимости должны наследоваться от оригинального пакета с добавлением dkms и удалением linux-headers (так как он указан в пакете dkms как необязательный).

Построение директории для исходных файлов

Сборка исходных файлов должна происходить в (сборочная директория по умолчанию):

/usr/src/PACKAGE_NAME-PACKAGE_VERSION

В директории, где хранятся пакеты, конфигуратор DKMS говорит DKMS, как построить модуль (dkms.conf), включая переменные PACKAGE_NAME и PACKAGE_VERSION.

  • PACKAGE_NAME - имя проекта (обычно $_pkgname или $_pkgbase).
  • PACKAGE_VERSION - по соглашению это также должно быть $pkgver.

Применение патчей

К исходным файлам можно применить патчи непосредственно в PKGBUILD или через dkms.conf.

Автоматическая загрузка модуля в .install

Загрузку и выгрузку модулей следует оставить пользователю. Учитывая то, что может произойти сбой модуля при загрузке.

Кроме того, вам не нужно каждый раз запускать depmod, чтобы обновить зависимости модуля ядра. Pacman автоматически вызывает dkms install и dkms remove, как хуки. dkms install гарантирует, что depmod будет запущен по окончании процесса. dkms install зависит от dkms build (чтобы собрать исходники для текущего ядра), который, в свою очередь, зависит от dkms add (чтобы создать символическую ссылку на /var/lib/dkms/<package>/<version>/source в /usr/src/<package>).

Вывод namcap

Использование namcap (инструмент, который пытается проверить распространенные ошибки и нестандартные решения в пакете) это хорошая практика, следует хоть раз проверить любой пакет с помощью этого инструмента; однако, он еще не был обновлен для использования со специфичными пакетами DKMS.

Например, DKMS по умолчанию использует /usr/src/, но Namcap считает что это нестандартная директория, это немного противоречит ссылке.

Пример

Вот пример пакета, который редактирует dkms.conf в соответствии с именем пакета и его версии.

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

}

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

Теперь в pacman есть хуки DKMS, поэтому вам не нужно указывать конфигурацию, специфичную для DKMS, в вашем файле .install. dkms install и dkms remove будут вызываны автоматически.

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