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 - # subscription-manager register- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 为 RHEL 8 系统附加订阅: - subscription-manager attach --auto - # subscription-manager attach --auto- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 安装构建软件和容器所需的软件: - yum install podman make git -y - # yum install podman make git -y- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 克隆 - kmod-via-containers存储库:- 为存储库创建一个文件夹: - mkdir kmods; cd kmods - $ mkdir kmods; cd kmods- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 克隆存储库: - git clone https://github.com/kmods-via-containers/kmods-via-containers - $ git clone https://github.com/kmods-via-containers/kmods-via-containers- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
 
- 在 RHEL 8 构建主机上安装 KVC 框架实例来测试模块。这会添加 - kmods-via-containersystemd 服务并加载它:- 进入 - kmod-via-containers目录:- cd kmods-via-containers/ - $ cd kmods-via-containers/- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 安装 KVC 框架实例: - sudo make install - $ sudo make install- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 重新载入 systemd Manager 配置: - sudo systemctl daemon-reload - $ sudo systemctl daemon-reload- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
 
- 获取内核模块源代码。源代码可用于构建您无法控制但由其他人提供的第三方模块。您需要类似 - kvc-simple-kmod示例中显示的内容,该示例可克隆到您的系统中,如下所示:- cd .. ; git clone https://github.com/kmods-via-containers/kvc-simple-kmod - $ cd .. ; git clone https://github.com/kmods-via-containers/kvc-simple-kmod- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 编辑本例中的配置文件 - simple-kmod.conf,并将 Dockerfile 的名称改为- Dockerfile.rhel:- 进入 - kvc-simple-kmod目录:- cd kvc-simple-kmod - $ cd kvc-simple-kmod- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 重命名 Dockerfile: - cat simple-kmod.conf - $ cat simple-kmod.conf- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 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" - 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"- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
 
- 为您的内核模块创建一个 - kmods-via-containers@.service实例,- 本例中为 simple-kmod:- sudo make install - $ sudo make install- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 启用 - kmods-via-containers@.service实例:- sudo kmods-via-containers build simple-kmod $(uname -r) - $ sudo kmods-via-containers build simple-kmod $(uname -r)- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 启用并启动 systemd 服务: - sudo systemctl enable kmods-via-containers@simple-kmod.service --now - $ sudo systemctl enable kmods-via-containers@simple-kmod.service --now- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 查看服务状态: - sudo systemctl status kmods-via-containers@simple-kmod.service - $ sudo systemctl status kmods-via-containers@simple-kmod.service- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 输出示例 - ● 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...- ● 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...- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
 
- 要确认载入了内核模块,使用 - lsmod命令列出模块:- lsmod | grep simple_ - $ lsmod | grep simple_- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 输出示例 - simple_procfs_kmod 16384 0 simple_kmod 16384 0 - simple_procfs_kmod 16384 0 simple_kmod 16384 0- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 可选。使用其他方法检查 - simple-kmod是否正常工作:- 使用 - dmesg在内核环缓冲中查找 "Hello world" 信息:- dmesg | grep 'Hello world' - $ dmesg | grep 'Hello world'- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 输出示例 - [ 6420.761332] Hello world from simple_kmod. - [ 6420.761332] Hello world from simple_kmod.- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 检查 - /proc中的- simple-procfs-kmod值:- sudo cat /proc/simple-procfs-kmod - $ sudo cat /proc/simple-procfs-kmod- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 输出示例 - simple-procfs-kmod number = 0 - simple-procfs-kmod number = 0- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 运行 - spkut命令从模块中获取更多信息:- sudo spkut 44 - $ sudo spkut 44- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 输出示例 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
 
下一步,当系统引导此服务时,将检查新内核是否在运行。如果有新的内核,该服务会构建内核模块的新版本,然后载入它。如果已经构建了该模块,它将只加载它。
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 - # subscription-manager register- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 为 RHEL 8 系统附加订阅: - subscription-manager attach --auto - # subscription-manager attach --auto- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 安装构建软件所需的软件: - yum install podman make git -y - # yum install podman make git -y- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 创建托管内核模块和工具的目录: - mkdir kmods; cd kmods - $ mkdir kmods; cd kmods- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 获取 - kmods-via-containers软件:- 克隆 - kmods-via-containers存储库:- git clone https://github.com/kmods-via-containers/kmods-via-containers - $ git clone https://github.com/kmods-via-containers/kmods-via-containers- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 克隆 - kvc-simple-kmod存储库:- git clone https://github.com/kmods-via-containers/kvc-simple-kmod - $ git clone https://github.com/kmods-via-containers/kvc-simple-kmod- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
 
- 
								获取您的模块软件。本例中使用 kvc-simple-kmod。
- 使用之前克隆的存储库,创建一个 fakeroot 目录,并在其中填充您要通过 Ignition 提供的文件: - 创建目录: - FAKEROOT=$(mktemp -d) - $ FAKEROOT=$(mktemp -d)- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 进入 - kmod-via-containers目录:- cd kmods-via-containers - $ cd kmods-via-containers- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 安装 KVC 框架实例: - make install DESTDIR=${FAKEROOT}/usr/local CONFDIR=${FAKEROOT}/etc/- $ make install DESTDIR=${FAKEROOT}/usr/local CONFDIR=${FAKEROOT}/etc/- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 进入 - kvc-simple-kmod目录:- cd ../kvc-simple-kmod - $ cd ../kvc-simple-kmod- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 创建实例: - make install DESTDIR=${FAKEROOT}/usr/local CONFDIR=${FAKEROOT}/etc/- $ make install DESTDIR=${FAKEROOT}/usr/local CONFDIR=${FAKEROOT}/etc/- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
 
- 运行以下命令,克隆 fakeroot 目录,将任何符号链接替换为目标副本: - cd .. && rm -rf kmod-tree && cp -Lpr ${FAKEROOT} kmod-tree- $ cd .. && rm -rf kmod-tree && cp -Lpr ${FAKEROOT} kmod-tree- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 创建一个 Butane 配置文件 - 99-simple-kmod.bu,它嵌入内核模块树并启用 systemd 服务。注意- 如需有关 Butane 的信息,请参阅"使用 Butane 创建机器配置"。 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 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 - $ butane 99-simple-kmod.bu --files-dir . -o 99-simple-kmod.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 如果集群还没有启动,生成清单文件并将该文件添加到 - openshift目录中。如果集群已在运行,按如下所示应用该文件:- oc create -f 99-simple-kmod.yaml - $ oc create -f 99-simple-kmod.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 您的节点将启动 - kmods-via-containers@simple-kmod.service服务,并将载入内核模块。
- 要确认内核模块已加载,您可以登录到节点(使用 - oc debug node/<openshift-node>,然后- chroot /host)。要列出模块,请使用- lsmod命令:- lsmod | grep simple_ - $ lsmod | grep simple_- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 输出示例 - simple_procfs_kmod 16384 0 simple_kmod 16384 0 - simple_procfs_kmod 16384 0 simple_kmod 16384 0- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow