DKMS软件包指南
在创建DKMS软件包时,请遵循以下指南。
软件包名称
DKMS软件包的命名方式是在原始软件包名称后附加“-dkms”。
变量$_pkgname通常在$pkgname下方使用,用于表示去掉“-dkms”后缀的软件包名称(例如:_pkgname="${pkgname%-*}")。
依赖
将dkms添加到depends数组中。这很重要,因为这将提供工具和钩子,以便在内核更新时自动重新构建-dkms软件包提供的内核驱动程序。
请勿在PKGBUILD中包含linux-headers或任何其他Linux头文件包。这些头文件已作为dkms的可选依赖项列出,并且每个内核包都有自己的头文件包,因此在-dkms软件包中包含头文件包依赖项是多余且不必要的限制。
源码位置
软件包应将内核模块的源码文件安装到
/usr/src/PACKAGE_NAME-PACKAGE_VERSION
其中PACKAGE_NAME和PACKAGE_VERSION是内核模块的名称和版本。
强烈建议将PACKAGE_NAME设置为$_pkgname的值(参见#软件包名称),并将PACKAGE_VERSION设置为$pkgver。
打补丁
源码可以直接在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 install和dkms remove,从而无需软件包维护者进行手动操作。
dkms install确保在流程结束时调用depmod。dkms 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