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

Как вы определяете dkms.conf таким образом, чтобы модуль DKMS создавался только для конкретной версии ядра или диапазона версий?

Фон:

Глючный драйвер присутствует в текущих ядрах, которые мы используем (например, 4.4), но исправлен в 4.10. Я создал пакет dkms с исходным кодом 4.10, который прекрасно работает на ядре 4.4. Но по мере того, как мы обновляемся до более поздних выпусков ОС (или выпусков HWE) с более поздними выпусками ядра - например, 4.15 - я хочу избежать пересоздания (теперь возможно более старого) драйвера ядра 4.10, когда версия ядра 4.10 или выше.

Вот моя база dkms.conf файл

PACKAGE_NAME="cp210x"
PACKAGE_VERSION="#MODULE_VERSION#"
BUILT_MODULE_NAME[0]="$PACKAGE_NAME"
DEST_MODULE_LOCATION[0]="/updates/dkms"
AUTOINSTALL="YES"
REMAKE_INITRD="YES"

Я старался BUILD_EXCLUSIVE_KERNEL соответствует версии ядра 4.N

BUILD_EXCLUSIVE_KERNEL="^4\.[0-9]\.*"

Ожидаемое поведение - не установит модуль ядра для ядра 4.15.0-43-generic, Актуальное поведение - устанавливается как обычно

Мое чтение предполагает, что альтернатива может сработать (для этого теста я просто сопоставляю свою текущую версию ядра), чтобы изменить правило компиляции, чтобы оно было неактивным.

MAKE_MATCH[1]="^4\.15\.*"
MAKE[1]=":"

Я работаю на платформах Debian/Ubuntu, если это что-то меняет.

1 ответ

Хорошо - проблема была между клавиатурой и стулом - мой BUILD_EXCLUSIVE_KERNEL в регулярном выражении была ошибка - .* суффикс смешался с \. разделитель чисел. Но я приведу здесь рабочий пример, так как Google не нашел хороших примеров, прежде чем я разместил здесь:

Во-первых, я не был уверен, какой диалект регулярных выражений мне нужно было использовать (grep, pcre и т. Д.), Тем более, что в него перепуталась оболочка, поэтому подумал, что, возможно, было несоответствие.

Оказывается dkms это bash сценарий и так использует [[ $ver =~ $match_regexp ]], Чтобы проверить соответствие, это сработало:

re="^(3\.[0-9]+\.|4\.[0-9]\.)" ; [[ "4.15.0-43-generic" =~ $re ]] && echo true
# but this didn't
[[ "4.15.0-43-generic" =~ "^(3\.[0-9]+\.|4\.[0-9]\.)" ]] && echo true

Вот файл конфигурации, который я в итоге использовал:

PACKAGE_NAME="cp210x"
PACKAGE_VERSION="#MODULE_VERSION#"
BUILT_MODULE_NAME[0]="$PACKAGE_NAME"
DEST_MODULE_LOCATION[0]="/updates/dkms"
AUTOINSTALL="YES"
REMAKE_INITRD="YES"
# Since this code comes from 4.10 only update kernels 4.9 and earlier
BUILD_EXCLUSIVE_KERNEL="^(3\.[0-9]+\.|4\.[0-9]\.)"

Который выглядит так при установке через dpkg,

First Installation: checking all kernels...
Building only for 4.15.0-43-generic
Building initial module for 4.15.0-43-generic
Error!  The dkms.conf for this module includes a BUILD_EXCLUSIVE directive which
does not match this kernel/arch.  This indicates that it should not be built.
Skipped.

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

Дополнительно формулировка BUILD_EXCLUSIVE_KERNEL Документация предполагает, что это ошибка в случае несоответствия ядра, что может быть нежелательно, однако, если вы посмотрите на вывод выше, вы увидите, что "Ошибка" не вызывает сбой установки пакета, просто помеченный как пропущенный.

Другие вопросы по тегам