如何在 Linux 上使用 DKMS 构建内核模块如何在 Linux 上使用 DKMS 构建内核模块如何在 Linux 上使用 DKMS 构建内核模块如何在 Linux 上使用 DKMS 构建内核模块
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Linux 上使用 DKMS 构建内核模块

假设您想要为您购买的新显卡、WiFi 适配器或网络接口卡安装设备驱动程序,并且出于某种原因(例如,缺少预构建驱动程序、过时的驱动程序版本、非通用构建选项),您决定从源代码编译并安装驱动程序模块。因此,您继续下载设备驱动程序的官方源代码,针对内核对其进行编译,安装并激活它。新硬件已成功识别,一切正常。

现在考虑一下如果稍后升级到较新的内核,驱动程序会发生什么情况。该驱动程序是在库存内核源代码树之外构建的,因此一旦您的系统升级到较新的内核,您构建的驱动程序将无法正常工作。

如何解决这个问题呢?那么,您需要针对较新的内核重新编译驱动程序并重新安装它。显然,如果每次升级内核时都必须手动重新构建驱动程序,这会变得相当麻烦。

这就是动态内核模块支持(DKMS)派上用场的时候。 DKMS 框架使您能够在升级内核时自动将内核模块重新构建到当前内核树中。硬件供应商通常将其硬件的设备驱动程序作为 DKMS 包分发,以便用户在升级到较新的内核时可以自动更新已安装的驱动程序。作为最终用户,您可以轻松配置 DKMS 以自动更新驻留在库存内核树之外的任何自定义设备驱动程序或内核模块。

在本教程中,我将演示如何在 Linux 上使用 DKMS 自动构建内核模块。

在 Linux 上安装 DKMS

您可以按如下方式在各种 Linux 发行版上安装 DKMS。作为 DKMS 安装的一部分,必要的构建工具(例如,gcc、make)和内核头文件也将由发行版的包管理器安装。

在 Ubuntu、Debian 或 Linux Mint 上安装 DKMS


$ sudo apt-get install dkms

在 Fedora 上安装 DKMS


$ sudo dnf install dkms

在 CentOS 或 RHEL 上安装 DKMS

首先启用 EPEL 存储库并继续:


$ sudo yum install dkms

在 Arch Linux 上安装 DKMS


$ sudo pacman -S dkms

使用 DKMS 自动构建内核模块

现在让我展示如何配置 DKMS 以自动为新内核重新构建内核模块。简而言之,您需要为内核模块创建 DKMS 配置,并使用 DKMS 安装该模块。然后任何后续的内核升级都会触发 DKMS 重新构建模块。

在本教程中,我将使用 ixgbe Intel NIC 驱动程序作为示例内核模块。

首先,在 /usr/src/- 下下载并安装驱动程序的源代码。


$ wget http://tenet.dl.sourceforge.net/project/e1000/ixgbe%20stable/4.3.15/ixgbe-4.3.15.tar.gz
$ sudo tar -xf ixgbe-4.3.15.tar.gz -C /usr/local/src
$ sudo mv /usr/local/src/ixgbe-4.3.15/src /usr/src/ixgbe-4.3.15

在此目录下创建以下dkms.conf文件,如下所示。


$ sudo vi /usr/src/ixgbe-4.3.15/dkms.conf

PACKAGE_NAME="ixgbe"
PACKAGE_VERSION="4.3.15"
BUILT_MODULE_NAME[0]="ixgbe"
DEST_MODULE_LOCATION[0]="/kernel/drivers/net/ethernet/intel/ixgbe/"
AUTOINSTALL="yes"

接下来,将该模块添加到内核树中。


$ sudo dkms add -m ixgbe -v 4.3.15

或者简单地:


$ sudo dkms add ixgbe/4.3.15

针对当前运行的内核构建指定的模块。


$ sudo dkms build -m ixgbe -v 4.3.15

或者:


$ sudo dkms build ixgbe/4.3.15

最后,将该模块安装在当前内核树下。


$ sudo dkms install -m ixgbe -v 4.3.15

或者:


$ sudo dkms install ixgbe/4.3.15

至此,内核模块应该已成功安装。您可以通过以下方式检查模块的状态:


$ dkms status | grep ixgbe

验证内核升级期间内核模块的自动构建

为 ixgbe 驱动程序配置 DKMS 后,让我们看看升级到新内核时已安装的驱动程序会发生什么情况。在本次测试中,我将把内核从 3.10.0-229 升级到 3.10.0-327。使用的测试环境是CentOS 7,因此我将使用yum升级到新内核。请注意,还需要安装新内核的匹配内核头文件,以便 DKMS 重新构建设备驱动程序。

升级内核前,请检查ixgbe驱动和内核的版本。


$ modinfo ixgbe

我们可以看到DKMS为内核3.10.0-229安装了设备驱动程序4.3.15。

现在继续安装更新的内核和匹配的头文件。


$ sudo yum install kernel kernel-devel

重启进入新内核后,再次检查ixgbe驱动的模块信息。

您应该看到相同版本的 ixgbe 驱动程序已自动为新内核 3.10.0-327 构建。

请注意,如果您升级到新内核而没有安装匹配的内核头文件,则不会触发 DKMS,并且不会从其源代码重新构建驱动程序。相反,将使用新内核附带的库存内核驱动程序(如果可用)。

例如,以下是在不匹配内核头的情况下升级到新内核的结果,您可以看到新内核加载了一个版本有点过时的库存 ixgbe 驱动程序。

您始终可以通过手动触发 DKMS 随时重新构建自定义驱动程序,如下所示。确保首先安装匹配的内核头文件。


$ sudo yum install kernel-devel
$ sudo dkms build ixgbe/4.3.15
$ sudo dkms install ixgbe/4.3.15

结论

在这篇文章中,我演示了如何使用 DKMS 自动构建内核模块。当然,DKMS 可能并不总是首选,尤其是在通常不允许开发包和构建工具的生产 Linux 环境中。但对于开发环境或个人桌面,如果您有任何定制的内核模块,DKMS 会根据新内核更新模块,从而让您的生活变得轻松。

©2015-2025 艾丽卡 support@alaica.com