1.5. 构建和测试内核模块容器
在将内核模块部署到 OpenShift Container Platform 集群之前,您可以在单独的 RHEL 系统上测试该过程。
在测试这个过程前,收集 kernal 模块、KVC 框架和 kmod-via-containers 软件的源代码。然后您可以在 RHEL 系统中构建和测试模块。
流程
注册 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-containersystemd 服务并加载它:进入
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.confDockerfile 示例
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.22.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.22.0-147.3.1.el8_1.x86_64 spkut 44 simple-procfs-kmod number = 0 simple-procfs-kmod number = 44
结果
系统启动后,服务会检查是否在运行新内核。如果有新的内核,该服务会构建内核模块的新版本,然后载入它。如果已经构建了该模块,它将只加载它。