Dynamic Kernel Module Support (简体中文) - ArchWiki

Jump to content

# Dynamic Kernel Module Support (简体中文)

From ArchWiki
翻译状态：本文是 Dynamic Kernel Module Support 的翻译。上次翻译日期：2022-03-22。如果英文版本有所更改，则您可以帮助同步翻译。

摘自维基百科：

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

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

## 安装

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

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

## 升级

This article or section is out of date.

Reason: 这段提示在英文页面并未出现，可能已经过时 (Discuss in Talk:Dynamic Kernel Module Support (简体中文))
注意： Pacman 在重新编译 DKMS 模块时不会自动重新编译依赖，所以如果出现 dkms 模块之间的依赖，有可能出现编译错误，例如 zfs-dkmsAUR FS#52901. dkms-sortedAUR[损坏的链接：package not found] 软件包试图解决这个问题，此软件包可以直接替换 `dkms`，为了处理方便，请在安装任何 DKMS 模块前安装此软件包。

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

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

## 使用方法

如何手动调用DKMS：

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

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

### 列出内核模块

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

    # dkms status

### 重新构建模块

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

    # dkms autoinstall -k

或者重新构建某个特定的模块：

    # dkms autoinstall -k 3.16.4-1-ARCH

为当前内核构建一个特定的模块（例如: 对于当前内核）：

    # dkms install -m nvidia -v 334.21

或者简单地：

    # dkms install nvidia/334.21

构建一个可以兼容所有内核版本的模块：

    # dkms install nvidia/334.21 --all

### 移除模块

移除一个内核模块（旧的内核模块并不会被自动移除）：

    # 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 镜像。

例如，在 linux 和 mkinitcpio 环境下，在 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 钩子后运行。

## 相关链接

- Linux Journal: 探寻动态内核模块支持

Category:

- Kernel (简体中文)

Hidden categories:

- Pages or sections flagged with Template:Out of date
- Pages with broken package links