DKMS

来自 Arch Linux 中文维基

摘自维基百科

动态内核模块支持(DKMS)是用来生成 Linux 的内核模块的一个框架,这种模块的源代码一般不在 Linux 内核源代码树中。当新的内核安装时,DKMS 支持的内核模块会自动重建。

这意味着你不再需要等待某个公司、项目组或者包维护者释出新版本的内核模块。自从 pacman 支持钩子之后,内核更新时就会自动重新构建模块。

安装[编辑 | 编辑源代码]

安装 dkms 包和目标内核的头文件。例如,标准 linux 内核的头文件可以用软件包 linux-headers 安装。其他内核也有其相应的头文件包。

有许多位于内核源码树之外的内核模块都有 DKMS 变体;有一些位于官方软件仓库,大多数可以在 AUR 找到。

升级[编辑 | 编辑源代码]

虽然在内核升级时,DKMS 的编译自动执行,但是依然有可能编译报错。所以需要特别注意 pacman 的输出。当系统需要这些模块才能启动,或者使用不在 官方软件仓库 中的内核时,需要额外注意。

若要应用内核中的变化、修复 bug、或是添加特性,请在重启前先升级 DKMS 包。

使用方法[编辑 | 编辑源代码]

如何手动调用DKMS:

可以通过执行以下命令来使能使用DKMS时的Tab补全:

# source /usr/share/bash-completion/completions/dkms

列出内核模块[编辑 | 编辑源代码]

列出当前模块的状态,版本,包括源码树内的模块:

# dkms status

重新构建模块[编辑 | 编辑源代码]

为当前内核重新构建所有的模块:

# dkms autoinstall

或者为指定版本的内核构建:

# dkms autoinstall -k 3.16.4-1-ARCH

为当前内核构建一个特定的模块(例如: 对于当前内核):

# dkms install -m nvidia -v 334.21

或者简单地:

# dkms install nvidia/334.21

移除模块[编辑 | 编辑源代码]

移除一个内核模块(旧的内核模块并不会被自动移除):

# dkms remove -m nvidia -v 331.49 --all

或者简单的:

# dkms remove nvidia/331.49 --all

如果你卸载了 dkms 包,那么以前构建内核模块使用的相关文件信息就会丢失。如果这样,去 /usr/lib/modules/kernel_release/var/lib/dkms/package_name 下删除不再需要的文件和目录。

创建 DKMS 包[编辑 | 编辑源代码]

请参见 DKMS 包指南

Initial ramdisk[编辑 | 编辑源代码]

若以 DKMS 安装了 initial ramdisk,例如 zfs-dkmsAUR,你也许想要写一个 pacman 钩子来自动重建 initramfs 镜像。

例如,在 linuxmkinitcpio 环境下,在 zfs-dkmsAUR 更新后自动更新 ZFS

/etc/pacman.d/hooks/90-mkinitcpio-dkms-linux.hook
[Trigger]
Operation=Install
Operation=Upgrade
Operation=Remove
Type=Package
Target=zfs-dkms
Target=linux

[Action]
Description=Update dkms modules in Linux initcpio
Depends=mkinitcpio
When=PostTransaction
NeedsTargets
Exec=/bin/sh -c 'while read -r trg; do case $trg in linux) exit 0; esac; done; /usr/bin/mkinitcpio -p linux'

如果安装了多个内核,可以在钩子里加入更多目标,复制多份钩子。注意 90- 前缀是必要的,以确保它在 DKMS 钩子后运行。

相关链接[编辑 | 编辑源代码]