Сборка модуля 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
Документация предполагает, что это ошибка в случае несоответствия ядра, что может быть нежелательно, однако, если вы посмотрите на вывод выше, вы увидите, что "Ошибка" не вызывает сбой установки пакета, просто помеченный как пропущенный.