1.3. 在节点中添加内核模块
对于大多数常见硬件,Linux 内核包含了计算机启动时使用该硬件所需的设备驱动程序模块。然而,对于某些硬件,Linux 中无法使用模块。因此,您必须找到一种方法来为每个主机计算机提供这些模块。此流程描述了如何为 OpenShift Container Platform 集群中的节点执行此操作。
当首先按照这些说明部署内核模块时,该模块将提供给当前内核。如果安装了新内核,kmods-via-containers 软件将重建并部署该模块,以便新内核可以使用该模块的兼容版本。
使这个功能能够在每个节点中保持模块最新的方法是:
- 在引导时启动的每个节点中添加 systemd 服务,以检测是否安装了新内核。
- 如果检测到新内核,该服务会重建该模块并将其安装到内核中
有关此流程所需软件的详情,请查看 kmods-via-containers github 站点。
需要记住的几个重要问题:
- 这个过程是技术预览。
-
软件工具和示例还没有官方的 RPM,现只能从非官方的
github.com
站点获得。 - 红帽不支持您通过这些步骤添加的第三方内核模块。
-
在此过程中,构建内核模块所需的软件部署在 RHEL 8 容器中。请记住,当节点有新内核时,每个节点上会自动重新构建模块。因此,每个节点都需要访问
yum
存储库,该存储库包含重建该模块所需的内核和相关软件包。该内容最好由有效的 RHEL 订阅提供。
1.3.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 Manager 配置:
$ 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
下一步,当系统引导此服务时,将检查新内核是否在运行。如果有新的内核,该服务会构建内核模块的新版本,然后载入它。如果已经构建了该模块,它将只加载它。
1.3.2. 为 OpenShift Container Platform 置备内核模块
根据 OpenShift Container Platform 集群首次引导时是否必须存在内核模块,您可以使用以下两种方式之一设置内核模块部署:
-
在 集群安装时(day-1)置备内核模块 :您可以通过一个
MachineConfig
对象创建内容,并通过包括一组清单文件来将其提供给openshift-install
。 - 通过 Machine Config Operator(day-2)置备内核模块: 如果您可以等到集群启动并运行后再添加内核模块,您可以通过 Machine Config Operator(MCO)部署内核模块软件。
在这两种情况下,每个节点都需要能够在检测到新内核时获取内核软件包和相关软件包。您可以通过几种方法设置每个节点来获取该内容。
- 为每个节点提供 RHEL 权利。
-
从现有 RHEL 主机获取 RHEL 权利,从
/etc/pki/entitlement
目录中获取,并将它们复制到与您构建 Ignition 配置时提供的其他文件相同的位置。 -
在 Dockerfile 中,添加指针到包含内核和其他软件包的
yum
存储库。这必须包括新内核包,因为它们需要与新安装的内核相匹配。
1.3.2.1. 通过 MachineConfig 对象置备内核模块
通过将内核模块软件与 MachineConfig
对象一起打包,您可以在安装时或通过 Machine Config Operator 向 worker 或 control plane 节点提供该软件。
流程
注册 RHEL 8 系统:
# subscription-manager register
为 RHEL 8 系统附加订阅:
# subscription-manager attach --auto
安装构建软件所需的软件:
# yum install podman make git -y
创建托管内核模块和工具的目录:
$ mkdir kmods; cd kmods
获取
kmods-via-containers
软件:克隆
kmods-via-containers
存储库:$ git clone https://github.com/kmods-via-containers/kmods-via-containers
克隆
kvc-simple-kmod
存储库:$ git clone https://github.com/kmods-via-containers/kvc-simple-kmod
-
获取您的模块软件。本例中使用
kvc-simple-kmod
。 使用之前克隆的存储库,创建一个 fakeroot 目录,并在其中填充您要通过 Ignition 提供的文件:
创建目录:
$ FAKEROOT=$(mktemp -d)
进入
kmod-via-containers
目录:$ cd kmods-via-containers
安装 KVC 框架实例:
$ make install DESTDIR=${FAKEROOT}/usr/local CONFDIR=${FAKEROOT}/etc/
进入
kvc-simple-kmod
目录:$ cd ../kvc-simple-kmod
创建实例:
$ make install DESTDIR=${FAKEROOT}/usr/local CONFDIR=${FAKEROOT}/etc/
运行以下命令,克隆 fakeroot 目录,将任何符号链接替换为目标副本:
$ cd .. && rm -rf kmod-tree && cp -Lpr ${FAKEROOT} kmod-tree
创建一个 Butane 配置文件
99-simple-kmod.bu
,它嵌入内核模块树并启用 systemd 服务。注意如需有关 Butane 的信息,请参阅"使用 Butane 创建机器配置"。
variant: openshift version: 4.13.0 metadata: name: 99-simple-kmod labels: machineconfiguration.openshift.io/role: worker 1 storage: trees: - local: kmod-tree systemd: units: - name: kmods-via-containers@simple-kmod.service enabled: true
- 1
- 要在 control plane 节点上部署,请将
worker
改为master
。要在 control plane 和 worker 节点上部署,请对每个节点类型执行一次这些指令的其余部分。
使用 Butane 生成机器配置 YAML 文件
99-simple-kmod.yaml
,其中包含要交付的文件和配置:$ butane 99-simple-kmod.bu --files-dir . -o 99-simple-kmod.yaml
如果集群还没有启动,生成清单文件并将该文件添加到
openshift
目录中。如果集群已在运行,按如下所示应用该文件:$ oc create -f 99-simple-kmod.yaml
您的节点将启动
kmods-via-containers@simple-kmod.service
服务,并将载入内核模块。要确认内核模块已加载,您可以登录到节点(使用
oc debug node/<openshift-node>
,然后chroot /host
)。要列出模块,请使用lsmod
命令:$ lsmod | grep simple_
输出示例
simple_procfs_kmod 16384 0 simple_kmod 16384 0