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 系统中做到这一点,请执行以下操作:

流程

  1. 注册 RHEL 8 系统:

    # subscription-manager register
  2. 为 RHEL 8 系统附加订阅:

    # subscription-manager attach --auto
  3. 安装构建软件和容器所需的软件:

    # yum install podman make git -y
  4. 克隆 kmod-via-containers 存储库:

    1. 为存储库创建一个文件夹:

      $ mkdir kmods; cd kmods
    2. 克隆存储库:

      $ git clone https://github.com/kmods-via-containers/kmods-via-containers
  5. 在 RHEL 8 构建主机上安装 KVC 框架实例来测试模块。这会添加 kmods-via-container systemd 服务并加载它:

    1. 进入 kmod-via-containers 目录:

      $ cd kmods-via-containers/
    2. 安装 KVC 框架实例:

      $ sudo make install
    3. 重新载入 systemd Manager 配置:

      $ sudo systemctl daemon-reload
  6. 获取内核模块源代码。源代码可用于构建您无法控制但由其他人提供的第三方模块。您需要类似 kvc-simple-kmod 示例中显示的内容,该示例可克隆到您的系统中,如下所示:

    $ cd .. ; git clone https://github.com/kmods-via-containers/kvc-simple-kmod
  7. 编辑本例中的配置文件 simple-kmod.conf,并将 Dockerfile 的名称改为 Dockerfile.rhel

    1. 进入 kvc-simple-kmod 目录:

      $ cd kvc-simple-kmod
    2. 重命名 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"

  8. 为您的内核模块创建一个 kmods-via-containers@.service 实例,本例中为 simple-kmod

    $ sudo make install
  9. 启用 kmods-via-containers@.service 实例:

    $ sudo kmods-via-containers build simple-kmod $(uname -r)
  10. 启用并启动 systemd 服务:

    $ sudo systemctl enable kmods-via-containers@simple-kmod.service --now
    1. 查看服务状态:

      $ 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...

  11. 要确认载入了内核模块,使用 lsmod 命令列出模块:

    $ lsmod | grep simple_

    输出示例

    simple_procfs_kmod     16384  0
    simple_kmod            16384  0

  12. 可选。使用其他方法检查 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 节点提供该软件。

流程

  1. 注册 RHEL 8 系统:

    # subscription-manager register
  2. 为 RHEL 8 系统附加订阅:

    # subscription-manager attach --auto
  3. 安装构建软件所需的软件:

    # yum install podman make git -y
  4. 创建托管内核模块和工具的目录:

    $ mkdir kmods; cd kmods
  5. 获取 kmods-via-containers 软件:

    1. 克隆 kmods-via-containers 存储库:

      $ git clone https://github.com/kmods-via-containers/kmods-via-containers
    2. 克隆 kvc-simple-kmod 存储库:

      $ git clone https://github.com/kmods-via-containers/kvc-simple-kmod
  6. 获取您的模块软件。本例中使用 kvc-simple-kmod
  7. 使用之前克隆的存储库,创建一个 fakeroot 目录,并在其中填充您要通过 Ignition 提供的文件:

    1. 创建目录:

      $ FAKEROOT=$(mktemp -d)
    2. 进入 kmod-via-containers 目录:

      $ cd kmods-via-containers
    3. 安装 KVC 框架实例:

      $ make install DESTDIR=${FAKEROOT}/usr/local CONFDIR=${FAKEROOT}/etc/
    4. 进入 kvc-simple-kmod 目录:

      $ cd ../kvc-simple-kmod
    5. 创建实例:

      $ make install DESTDIR=${FAKEROOT}/usr/local CONFDIR=${FAKEROOT}/etc/
  8. 运行以下命令,克隆 fakeroot 目录,将任何符号链接替换为目标副本:

    $ cd .. && rm -rf kmod-tree && cp -Lpr ${FAKEROOT} kmod-tree
  9. 创建一个 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 节点上部署,请对每个节点类型执行一次这些指令的其余部分。
  10. 使用 Butane 生成机器配置 YAML 文件 99-simple-kmod.yaml,其中包含要交付的文件和配置:

    $ butane 99-simple-kmod.bu --files-dir . -o 99-simple-kmod.yaml
  11. 如果集群还没有启动,生成清单文件并将该文件添加到 openshift 目录中。如果集群已在运行,按如下所示应用该文件:

    $ oc create -f 99-simple-kmod.yaml

    您的节点将启动 kmods-via-containers@simple-kmod.service 服务,并将载入内核模块。

  12. 要确认内核模块已加载,您可以登录到节点(使用 oc debug node/<openshift-node>,然后 chroot /host)。要列出模块,请使用 lsmod 命令:

    $ lsmod | grep simple_

    输出示例

    simple_procfs_kmod     16384  0
    simple_kmod            16384  0

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.