仅为特定内核版本构建 dkms 模块
Build dkms module for specific kernel versions only
如何定义 dkms.conf 以便仅为特定内核版本或版本范围构建 DKMS 模块?
背景:
我们正在使用的当前内核(例如 4.4)中存在错误的驱动程序,但已在 4.10 中修复。我生成了带有 4.10 源代码的 dkms 包,它在内核 4.4 上运行良好。但是当我们使用更高版本的内核版本更新到更高版本 OS 版本(或 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 平台上,如果这有什么不同的话。
好的 - 问题出在键盘和椅子之间 - 我的 BUILD_EXCLUSIVE_KERNEL
正则表达式中有一个错误 - .*
后缀与 \.
数字分隔符混合在一起。但我会在这里记录一个工作示例,因为 google 在我发布之前没有找到任何好的示例:
首先,我不确定我需要使用哪种正则表达式方言(grep、pcre 等..),尤其是因为混入了 shell 转义,所以我认为可能存在不匹配。
原来 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
文档的措辞表明,如果内核不匹配可能是一个错误,这可能是不可取的,但是如果您检查上面的输出,您会发现 "Error" 确实如此不会导致包安装失败,只是标记为已跳过。
如何定义 dkms.conf 以便仅为特定内核版本或版本范围构建 DKMS 模块?
背景:
我们正在使用的当前内核(例如 4.4)中存在错误的驱动程序,但已在 4.10 中修复。我生成了带有 4.10 源代码的 dkms 包,它在内核 4.4 上运行良好。但是当我们使用更高版本的内核版本更新到更高版本 OS 版本(或 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 平台上,如果这有什么不同的话。
好的 - 问题出在键盘和椅子之间 - 我的 BUILD_EXCLUSIVE_KERNEL
正则表达式中有一个错误 - .*
后缀与 \.
数字分隔符混合在一起。但我会在这里记录一个工作示例,因为 google 在我发布之前没有找到任何好的示例:
首先,我不确定我需要使用哪种正则表达式方言(grep、pcre 等..),尤其是因为混入了 shell 转义,所以我认为可能存在不匹配。
原来 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
文档的措辞表明,如果内核不匹配可能是一个错误,这可能是不可取的,但是如果您检查上面的输出,您会发现 "Error" 确实如此不会导致包安装失败,只是标记为已跳过。