手动添加内核模块

本指南介绍如何手动添加内核模块。

概述

某些内核模块在 Clear Linux* OS 中默认启用。要使用不属于 Linux 源代码树的其他内核模块,您可能需要构建树外内核模块。请使用本指南手动添加内核模块,或参阅 使用 DKMS 添加内核模块

描述

内核模块是能够插入到 Linux 内核中以增加功能的附加软件,例如硬件驱动程序。内核模块可能已经是 Linux 源代码树的一部分(树内),也可能来自外部来源,例如直接来自供应商(树外)。

内核模块可用性

Clear Linux OS 附带了许多上游内核模块以备使用。使用现有模块时,维护和保留 Clear Linux OS 内核的签名验证要容易得多。有关 Clear Linux OS 安全实践的更多信息,请参阅 操作系统安全性 页面。

继续之前,请检查您正在寻找的内核模块是否已经在 Clear Linux OS 中可用,或者提交添加该模块的请求。

检查模块是否已经可用

您可以使用 swupd search 命令搜索以 .ko 文件扩展名结尾的内核模块文件名,如下例所示。有关详细信息,请参阅 swupd

sudo swupd search ${module_name}.ko

提交添加模块的请求

如果您需要的内核模块已经开源(例如在 Linux 上游),并且可能对其他人也有用,可考虑提交在 Clear Linux OS 内核中添加或启用该模块的请求。

向 GitHub 上的 Clear Linux OS ‘Distribution Project’_ 提出增强请求。

构建、安装和加载树外模块

如果您是个人用户或测试人员,并且您需要 Clear Linux OS 并未提供的树外内核模块,请按照本节中的步骤操作。如需使用可扩展性和可自定义性更好的方法,我们建议使用 mixer 来提供自定义内核和更新。

必备条件

开始之前,您必须:

  • 禁用安全引导。
  • 禁用内核模块完整性检查。
  • 有一个以源代码形式存在的内核模块包。
  • 针对新版本 Linux 内核重新构建模块。

注解

每当在 Clear Linux 系统上升级内核时,您都必须重新构建树外模块。

构建和安装内核模块

  1. 确定 Clear Linux OS 上正在运行的内核变体。下面的示例中使用了原生内核。

    $ uname -r
    5.XX.YY-ZZZZ.native
    
  2. 安装与已安装内核相对应的内核开发捆绑包。内核开发捆绑包含编译内核模块所需的内核头文件。例如:

    • linux-dev 用于针对原生内核进行开发。
    • linux-lts-dev 用于针对 LTS 内核进行开发。
    sudo swupd bundle-add linux-dev
    
  3. 按照内核模块源代码中的说明编译内核模块。例如:

    curl -O http://<URL-TO-KERNEL-MODULE-SOURCE>.tar.gz
    tar -xvf <KERNEL-MODULE-SOURCE>.tar.gz
    cd <KERNEL-MODULE-SOURCE>/
    cat README
    

加载内核模块

  1. 如果安全引导已启用,请在系统的 UEFI 设置中禁用安全引导。加载新的树外模块会修改安全引导所依赖的信任签名。

  2. 修改内核引导参数禁用内核签名检查,然后重启系统。

    Clear Linux OS 中的所有内核模块都已签名以加强内核安全。但是,树外模块打破了信任链,因此需要禁用该机制。

    sudo mkdir -p /etc/kernel/cmdline.d
    echo "module.sig_unenforce" | sudo tee /etc/kernel/cmdline.d/allow-unsigned-modules.conf
    
  3. 更新引导管理器并重启系统,以实现修改后的内核参数。

    sudo clr-boot-manager update
    sudo reboot
    

    注解

    如果修改成功,clr-boot-manager update 命令不会返回任何控制台输出。

  4. 重启后,使用 insmod 命令手动加载树外模块。

    sudo insmod </PATH/TO/MODULE.ko>
    

示例

可选:指定模块选项和别名

使用 modprobe 命令加载模块并设置选项。

modprobe 可能会因为模块相互依赖关系添加或移除多个模块。您可以使用 /etc/modprobe.d 目录下的配置文件来指定各个模块要使用的选项。

sudo mkdir /etc/modprobe.d

/etc/modprobe.d 目录下以 .conf 扩展名结尾的所有文件会指定加载时要使用的模块选项。您可以使用 .conf 文件为模块创建方便使用的别名,或者为有特殊要求的模块完全覆盖正常的加载行为。

参阅 modprobe.d 手册页详细了解 modprobe

man modprobe.d

可选:配置引导时要加载的内核模块

使用 /etc/modules-load.d 配置目录指定引导时自动加载的内核模块。

sudo mkdir /etc/modules-load.d

/etc/modules-load.d 目录下以 .conf 扩展名结尾的所有文件包含引导时要加载的模块别名列表(每行一个)。

参阅 modules-load.d 手册页详细了解模块加载:

man modules-load.d