DKMS - сборка модуля только для определенных версий ядра

Материал из support.qbpro.ru

ВВЕДЕНИЕ

DKMS или Dynamic Kernel Module Support — это система, которая позволяет обновлять отдельные модули ядра без необходимости модификации всего ядра. Это бесплатное программное обеспечение под лицензией GPL v2, написанное командой Dell Linux Engineering Team. Первоначально DKMS был разработан для Dell Computer Corporation для распространения программных исправлений среди клиентов четко определенным образом.

DKMS имеет много преимуществ для сообществ поставщиков услуг Linux, например:

С точки зрения разработчика драйверов, это помогает добавлять драйверы, которых еще нет в базовом ядре. Кроме того, разработчики драйверов, которые должны предоставлять обновленные драйверы устройств для тестирования и общего использования с большим количеством ядер, также получают выгоду. Еще одним преимуществом DKMS является то, что разработчики могут тестировать код своего драйвера на разных машинах. На самом деле это ускоряет процесс разработки драйверов. С точки зрения системного администратора DKMS упрощает процесс установки обновлений драйверов устройств в активное ядро ​​без внесения в него каких-либо изменений. Следовательно, им не нужно ждать прибытия нового ядра. Выбранные исправления ошибок или исправления могут быть развернуты между крупными обновлениями. Новое оборудование, которое требует модификации в одном модуле, может быть легко интегрировано. Опять же, этого можно добиться без полного тестирования новых ядер.

РЕШЕНИЯ

Часто возникают проблемы при обновлении ядра системы, установленные через DKMS модули могут не пересобраться в автоматическом режиме из-за несовместимости с новым ядром. При этом с текущим ядром все работает.
Для решения данной проблемы есть много способов, в моем случае драйвер NVIDIA не собирался на ядре pve-kernel-6.8.8
в системе Proxmox 8.0 (поднят на Debian 12). При этом все обновления ядра pve-kernel-6.5.13-x - прекрасно обновляются.
Для того, что бы не получать постоянные ошибки о несовместимости драйвера с новым ядром в обновлениях есть параметры
в dkms.conf, которые должны решать эту проблему, но в Proxmox 8.0, мне это не помогло.
Пришлось внести небольшие изменения в скрипт /etc/kernel/postinst.d/dkms для решения этой проблемы:

#!/bin/sh

## manual add acl pve-kernel-6.5...
nvidia_kernel="^(6\.5\.)"
sw=$(bash -c "if awk '{print$3}')" =~ $nvidia_kernel ; then echo 1; fi")
if [ $sw = 1 ]; then
## 

# We're passed the version of the kernel being installed
inst_kern=$1

uname_s=$(uname -s)

_get_kernel_dir() {
    KVER=$1
    case ${uname_s} in
       Linux)          DIR="/lib/modules/$KVER/build" ;;
       GNU/kFreeBSD)   DIR="/usr/src/kfreebsd-headers-$KVER/sys" ;;
    esac
    echo "$DIR"
}

_check_kernel_dir() {
    DIR=$(_get_kernel_dir "$1")
    case ${uname_s} in
       Linux)          test -e "$DIR/include" ;;
       GNU/kFreeBSD)   test -e "$DIR/kern" && test -e "$DIR/conf/kmod.mk" ;;
       *)              false ;;
    esac
}

case "${uname_s}" in
    Linux)
        header_pkg="linux-headers-$inst_kern"
        kernel="Linux"
    ;;
    GNU/kFreeBSD)
        header_pkg="kfreebsd-headers-$inst_kern"
        kernel="kFreeBSD"
    ;;
esac

if [ -x /usr/lib/dkms/dkms_autoinstaller ] ; then
    exec /usr/lib/dkms/dkms_autoinstaller start "$inst_kern"
fi

if ! _check_kernel_dir "$inst_kern" ; then
    echo "dkms: WARNING: $kernel headers are missing, which may explain the above failures." >&2
    echo "      please install the $header_pkg package to fix this." >&2
fi

##
else
    exit
# добавить в конце скрипта окончание условия:
fi
  • Скрипт запускается на сборку модуля только если версия ядра соответствует заданной, иначе просто выход.

При обновлении вы не увидите сообщений об ошибке и сборка будет происходить только с указанной версией ядра.

  • Вставка параметра BUILD_EXCLUSIVE_KERNEL - как предлагал автор тут, проблему не решала,

так как при отказе сборки модуля aptitude / apt останавливал весь процесс обновления по ошибке сборки модуля.

ИСТОЧНИКИ