Сборка модуля dkms только для определенных версий ядра - PullRequest
0 голосов
/ 31 января 2019

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

Справочная информация:

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

Вот моя база dkms.conf file

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 Ответ

0 голосов
/ 31 января 2019

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

Во-первых, я не был уверен, какой диалект regexp мне нужно было использовать (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 документации предполагает, что это ошибка, если ядро ​​не соответствует, что может быть нежелательным, однако, если вы посмотрите вывод вышевы увидите, что «Ошибка» не вызывает сбой установки пакета, просто помеченный как пропущенный.

...