14.2.2. 在节点中添加内核模块
对于大多数常用硬件,在计算机启动时,Linux 内核会包括使用这些硬件所需的设备驱动程序模块。但是对于一些硬件来说,在 Linux 中不提供它们的模块。因此,您必须找到一种方法来为每个主机计算机提供这些模块。此流程介绍了如何为 OpenShift Container Platform 集群中的节点进行此操作。
当首先按照这些说明部署了一个内核模块后,这个模块就可用于当前内核。如果安装了新内核,kmods-via-containers 软件将被重建并部署该模块,以便使新内核可使用该模块的兼容版本。
使这个功能可以在每个节点中保持模块最新状态的方法是:
- 在引导时启动的每个节点中添加 systemd 服务,以检测是否安装了新内核。
- 如果检测到一个新的内核,该服务会重建该模块并将其安装到内核中
有关此过程所需软件的详情,请查看 kmods-via-containers github 站点。
需要记住的几个重要问题:
- 这个过程是技术预览。
-
软件工具和示例还没有官方的 RPM,现只能从非官方的
github.com
站点获得。 - 红帽不支持您通过这些步骤添加的第三方内核模块。
-
在本流程中,构建您的内核模块所需的软件部署在 RHEL 8 容器中。请记住,当节点有新内核时,每个节点上会自动重新构建模块。因此,每个节点都需要访问一个
yum
存储库,该程序存储库包含重建该模块所需的内核和相关软件包。该内容最好由一个有效的 RHEL 订阅提供。
14.2.2.1. 构建并测试内核模块容器
在将内核模块部署到 OpenShift Container Platform 集群之前,您可以在单独的 RHEL 系统中测试此过程。收集内核模块的源代码、KVC 框架和 kmod-via-containers 软件。然后构建并测试模块。要在 RHEL 8 系统中做到这一点,请执行以下操作:
流程
注册 RHEL 8 系统:
# subscription-manager register
为 RHEL 8 系统添加订阅:
# subscription-manager attach --auto
安装构建软件和容器所需的软件:
# yum install podman make git -y
克隆
kmod-via-containers
存储库:为存储库创建一个文件夹:
$ mkdir kmods; cd kmods
克隆存储库:
$ git clone https://github.com/kmods-via-containers/kmods-via-containers
在 RHEL 8 构建主机上安装 KVC 框架实例来测试模块。这会添加一个
kmods-via-container
systemd 服务并加载它:进入
kmod-via-containers
目录:$ cd kmods-via-containers/
安装 KVC 框架实例:
$ sudo make install
重新载入 systemd 管理器配置:
$ sudo systemctl daemon-reload
获取内核模块源代码。通过源代码,可以构建一个您无法控制但由其他人提供的第三方模块。您需要类似
kvc -simple-kmod
示例中显示的内容 ,使用以下步骤将这些内容克隆到您的系统中:$ cd .. ; git clone https://github.com/kmods-via-containers/kvc-simple-kmod
编辑示例中的配置文件
simple-kmod.conf
,将 Dockerfile 的名称改为Dockerfile.rhel
:进入
kvc-simple-kmod
目录:$ cd kvc-simple-kmod
重命名 Dockerfile:
$ cat simple-kmod.conf
Dockerfile 示例
KMOD_CONTAINER_BUILD_CONTEXT="https://github.com/kmods-via-containers/kvc-simple-kmod.git" KMOD_CONTAINER_BUILD_FILE=Dockerfile.rhel KMOD_SOFTWARE_VERSION=dd1a7d4 KMOD_NAMES="simple-kmod simple-procfs-kmod"
为您的内核模块创建一个
kmods-via-containers@.service
实例(在这个示例中是simple-kmod
):$ sudo make install
启用
kmods-via-containers@.service
实例:$ sudo kmods-via-containers build simple-kmod $(uname -r)
启用并启动 systemd 服务:
$ sudo systemctl enable kmods-via-containers@simple-kmod.service --now
查看服务状态:
$ sudo systemctl status kmods-via-containers@simple-kmod.service
输出示例
● kmods-via-containers@simple-kmod.service - Kmods Via Containers - simple-kmod Loaded: loaded (/etc/systemd/system/kmods-via-containers@.service; enabled; vendor preset: disabled) Active: active (exited) since Sun 2020-01-12 23:49:49 EST; 5s ago...
要确认载入了内核模块,请使用
lsmod
命令列出模块:$ lsmod | grep simple_
输出示例
simple_procfs_kmod 16384 0 simple_kmod 16384 0
可选。使用其它方法检查
simple-kmod
是否正常工作:使用
dmesg
在内核环缓冲中查找 "Hello world" 信息:$ dmesg | grep 'Hello world'
输出示例
[ 6420.761332] Hello world from simple_kmod.
在
/proc
中检查simple-procfs-kmod
的值:$ sudo cat /proc/simple-procfs-kmod
输出示例
simple-procfs-kmod number = 0
运行
spkut
命令从模块中获取更多信息:$ sudo spkut 44
输出示例
KVC: wrapper simple-kmod for 4.18.0-147.3.1.el8_1.x86_64 Running userspace wrapper using the kernel module container... + podman run -i --rm --privileged simple-kmod-dd1a7d4:4.18.0-147.3.1.el8_1.x86_64 spkut 44 simple-procfs-kmod number = 0 simple-procfs-kmod number = 44
下一步,当系统引导这个服务时,会检查新内核是否在运行。如果有一个新内核,该服务会构建内核模块的新版本,然后载入它。如果已经构建了该模块,它将只载入该模块。