跳转至内容

DKMS软件包指南

来自 ArchWiki
Arch 软件包指南

32位CLRCMake交叉编译DKMSEclipseElectron字体Free PascalGNOMEGoHaskellJavaKDE内核模块LispMesonMinGWNode.js非自由软件OCamlPerlPHPPythonRRubyRust - 安全ShellVCSWeb应用Wine

在创建DKMS软件包时,请遵循以下指南。

软件包名称

DKMS软件包的命名方式是在原始软件包名称后附加“-dkms”。

变量$_pkgname通常在$pkgname下方使用,用于表示去掉“-dkms”后缀的软件包名称(例如:_pkgname="${pkgname%-*}")。

依赖

dkms添加到depends数组中。这很重要,因为这将提供工具和钩子,以便在内核更新时自动重新构建-dkms软件包提供的内核驱动程序。

请勿在PKGBUILD中包含linux-headers或任何其他Linux头文件包。这些头文件已作为dkms的可选依赖项列出,并且每个内核包都有自己的头文件包,因此在-dkms软件包中包含头文件包依赖项是多余且不必要的限制。

源码位置

软件包应将内核模块的源码文件安装到

/usr/src/PACKAGE_NAME-PACKAGE_VERSION

其中PACKAGE_NAMEPACKAGE_VERSION是内核模块的名称和版本。

强烈建议将PACKAGE_NAME设置为$_pkgname的值(参见#软件包名称),并将PACKAGE_VERSION设置为$pkgver

注意:无需构建内核模块的源码文件或安装它们;这得益于dkms中的pacman钩子,每当Linux内核更新时,都会自动完成此操作。

打补丁

源码可以直接在PKGBUILD中打补丁,也可以通过dkms.conf进行。

如果通过dkms.conf打补丁,请确保将补丁安装到/usr/src/PACKAGE_NAME-PACKAGE_VERSION/patches/目录中,并为每个要应用的补丁添加PATCH[number]=patch_filename,将number替换为从0开始的递增值。有关更多信息,请参阅dkms(8) § DKMS.CONF

在.install中自动加载模块

不要使用.install文件来加载或卸载模块。将其留给用户,因为模块加载时可能会发生崩溃。

同样不要调用dkms,因为这会通过dkms提供的pacman钩子自动完成。此钩子会运行dkms installdkms remove,从而无需软件包维护者进行手动操作。

注意dkms install确保在流程结束时调用depmoddkms install依赖于dkms build(针对当前内核构建源码),而dkms build又依赖于dkms add(将符号链接从/var/lib/dkms/PACKAGE_NAME/PACKAGE_VERSION/source添加到/usr/src/PACKAGE_NAME-PACKAGE_VERSION)。

示例

下面是一个软件包示例,该示例根据软件包名称和版本编辑dkms.conf,并安装模块黑名单配置文件。

有关其他(真实)软件包的示例,请在官方仓库中搜索-dkms,并在AUR中搜索-dkms

PKGBUILD

PKGBUILD
# Maintainer: foo <foo(at)example(dot)org>
# Contributor: bar <bar(at)example(dot)org>

_pkgbase=example
pkgname=example-dkms
pkgver=1
pkgrel=1
pkgdesc="The Example kernel modules (DKMS)"
arch=('x86_64')
url="https://www.example.org/"
license=('GPL2')
depends=('dkms')
conflicts=("${_pkgbase}")
install=${pkgname}.install
source=("${url}/files/tarball.tar.gz"
        'dkms.conf'
        "${pkgname}.conf"
        'linux-3.14.patch')
md5sums=(use 'updpkgsums')

prepare() {
  cd ${_pkgbase}-${pkgver}

  # Patch
  patch -p1 -i "${srcdir}"/linux-3.14.patch
}

package() {
  # Copy dkms.conf
  install -Dm644 dkms.conf "${pkgdir}"/usr/src/${_pkgbase}-${pkgver}/dkms.conf

  # Set name and version
  sed -e "s/@_PKGBASE@/${_pkgbase}/" \
      -e "s/@PKGVER@/${pkgver}/" \
      -i "${pkgdir}"/usr/src/${_pkgbase}-${pkgver}/dkms.conf

  # Copy sources (including Makefile)
  cp -r ${_pkgbase}/* "${pkgdir}"/usr/src/${_pkgbase}-${pkgver}/

  # Blacklists conflicting module
  install -Dm644 ${pkgname}.conf "${pkgdir}/usr/lib/modprobe.d/${pkgname}.conf"
}

dkms.conf

dkms.conf
PACKAGE_NAME="@_PKGBASE@"
PACKAGE_VERSION="@PKGVER@"
MAKE[0]="make --uname_r=$kernelver"
BUILT_MODULE_NAME[0]="@_PKGBASE@"
DEST_MODULE_LOCATION[0]="/kernel/drivers/misc"
AUTOINSTALL="yes"

.install

此示例展示了在安装后和升级后显示一条消息,建议卸载冲突模块(example-conflicting-module),然后加载此软件包的模块(example)以立即使用,当用户此时不想重启系统时。

example.install
post_install() {
  cat<<EOF

Unload and load kernel modules:

  rmmod example-conflicting-module
  modprobe example

EOF
}

post_upgrade() {
  post_install
}

模块黑名单配置文件

当已知example-conflicting-module与此软件包的example模块冲突时,应将其列入黑名单。

example-dkms.conf
blacklist example-conflicting-module

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.