Bcache Ko编译

简介: 解决bcache的ko编译问题,尝试编译kernel modules以及完成对ko编译流程的梳理

下载kernel源码包

wget http://vault.centos.org/7.9.2009/updates/Source/SPackages/kernel-3.10.0-1160.66.1.el7.src.rpm
#安装源码包
rpm -ivh kernel-3.10.0-1160.66.1.el7.src.rpm

修改config文件,打开bcache支持

vim rpmbuild/SOURCES/kernel-3.10.0-x86_64.config

# CONFIG_MD_MULTIPATH is not set
CONFIG_MD_FAULTY=m
# CONFIG_BCACHE is not set
CONFIG_BCACHE=m
CONFIG_BLK_DEV_DM_BUILTIN=y
CONFIG_BLK_DEV_DM=m

#kernel config文件,y 表示 是 (相应功能将直接编译进内核),m 表示 模块 (相应功能将编译为一个模块,在需要时加载)

修改spec文件重新加载kernel config文件

# Should make listnewconfig fail if there's config options
# printed out?
%define listnewconfig_fail 0

#修改listnewconfig_fail为0,重新加载config文件,spec文件后面有检查,当修改listnewconfig_fail为01时,有配置更新时,编译退出

执行kernel编译

rpmbuild -bb rpmbuild/SPECS/kernel.spec

ko加载失败1

[root@vm-complie ~]# insmod bcache.ko
[root@vm-complie ~]# insmod /lib/modules/3.10.0-1160.66.1.el7.x86_64/kernel/drivers/md/bcache/bcache.ko
insmod: ERROR: could not insert module /lib/modules/3.10.0-1160.66.1.el7.x86_64/kernel/drivers/md/bcache/bcache.ko: Invalid module format
[root@vm-complie ~]# dmseg -T
[Mon Jul  4 02:04:17 2022] bcache: disagrees about version of symbol module_layout
[Mon Jul  4 02:09:11 2022] bcache: disagrees about version of symbol module_layout
[Mon Jul  4 02:25:57 2022] bcache: disagrees about version of symbol module_layout
[Mon Jul  4 02:26:02 2022] bcache: disagrees about version of symbol module_layout
[Mon Jul  4 02:26:05 2022] bcache: disagrees about version of symbol module_layout
[root@vm-complie ~]# rpm -qa | grep kernel
kernel-3.10.0-1160.66.1.el7.x86_64
kernel-tools-libs-3.10.0-1160.66.1.el7.x86_64
kernel-devel-3.10.0-1160.71.1.el7.x86_64
kernel-tools-3.10.0-1160.66.1.el7.x86_64
kernel-headers-3.10.0-1160.71.1.el7.x86_64

问题分析

通过message消息分析可知,ko中的module_layout和系统中的module_layout不匹配,通过make编译ko需要先生成 /root/rpmbuild/BUILD/kernel-3.10.0-1160.66.1.el7/linux-3.10.0-1160.66.1.el7.x86_64/Module.symvers ,然后通过Makefile执行/root/rpmbuild/BUILD/kernel-3.10.0-1160.66.1.el7/linux-3.10.0-1160.66.1.el7.x86_64/scripts/mod/modpost生成/root/rpmbuild/BUILD/kernel-3.10.0-1160.66.1.el7/linux-3.10.0-1160.66.1.el7.x86_64/drivers/md/bcache/bcache.mod.c 文件。bcache.mod.c文件包含了所有ko所需要的参数配置

#include <linux/module.h>
#include <linux/vermagic.h>
#include <linux/compiler.h>

MODULE_INFO(vermagic, VERMAGIC_STRING);

struct module __this_module
__attribute__((section(".gnu.linkonce.this_module"))) = {
        .name = KBUILD_MODNAME,
        .init = init_module,
#ifdef CONFIG_MODULE_UNLOAD
        .exit = cleanup_module,
#endif
        .arch = MODULE_ARCH_INIT,
};

MODULE_INFO(intree, "Y");

static const struct modversion_info ____versions[]
__used
__attribute__((section("__versions"))) = {
        { 0x5c1f381e, __VMLINUX_SYMBOL_STR(module_layout) },
        { 0x61b7b126, __VMLINUX_SYMBOL_STR(simple_strtoull) },
        { 0x54554948, __VMLINUX_SYMBOL_STR(kobject_put) },

编译生成的module_layout和系统的中的/usr/src/kernels/3.10.0-1160.66.1.el7.x86_64/Module.symvers(需要安装kernel-devel-3.10.0-1160.66.1.el7.x86_64)的不匹配了

可以通过系统的/usr/src/kernels/3.10.0-1160.66.1.el7.x86_64/Module.symvers配置编译ko,则需要进入对应的module路径然后执行编译

[root@vm-complie ~]# cd /root/rpmbuild/BUILD/kernel-3.10.0-1160.66.1.el7/linux-3.10.0-1160.66.1.el7.x86_64/drivers/md/bcache/
[root@vm-complie bcache]# make -C  /usr/src/kernels/3.10.0-1160.66.1.el7.x86_64/ M=$(pwd) modules

#编译需要修改Makefile,CONFIG_BCACHE需要修改为对应的值,例如m或者y
[root@vm-complie bcache]# cat Makefile 

obj-$(CONFIG_BCACHE)    += bcache.o

bcache-y        := alloc.o btree.o bset.o io.o journal.o writeback.o\
    movinggc.o request.o super.o sysfs.o debug.o util.o trace.o stats.o closure.o

CFLAGS_request.o    += -Iblock

编译成功后可得ko文件

[root@vm-complie bcache]# ll bcache.ko 
-rw-r--r--. 1 root root 6377456 Jul  7 12:19 bcache.ko

ko 加载失败2

[root@vm-complie ~]# insmod bcache.ko
insmod: ERROR: could not insert module bcache.ko: Invalid module format
[root@vm-complie ~]# dmseg -T
[Sat Jul  9 17:37:25 2022] bcache: no symbol version for module_layout

问题分析

通过message报错信息可知,当前ko文件缺少参数module_layout,也就是make modules时/Module.symvers没有产生module_layout的配置,编译ko需要先执行make产生系统的环境变量以及配置,然后执行make modules -j12 编译对应模块的ko

开机自动加载ko,需要编辑/etc/modules-load.d/目录,创建加载ko的配置

[root@vm-complie bcache]# cat /etc/modules-load.d/bcache.conf
bcache
[root@vm-complie bcache]# 
相关文章
|
Linux 编译器 C语言
Linux(3)Device Tree概念1(上)
Linux(3)Device Tree概念1
302 0
|
存储 关系型数据库 Java
红黑树,B+树,B树的原理
红黑树(Red-Black Tree)、B树(B-Tree)和 B+树(B+ Tree)都是自平衡的树结构,用于高效地进行查找、插入和删除操作。它们在数据库和文件系统等应用中有广泛的应用。
481 2
|
8月前
|
人工智能 负载均衡 调度
COMET:字节跳动开源MoE训练加速神器,单层1.96倍性能提升,节省百万GPU小时
COMET是字节跳动推出的针对Mixture-of-Experts(MoE)模型的优化系统,通过细粒度的计算-通信重叠技术,显著提升分布式训练效率,支持多种并行策略和大规模集群部署。
372 9
|
存储 Ubuntu Linux
ceph的rbd块设备的使用指南
这篇文章介绍了如何在CentOS和Ubuntu环境下使用Ceph的RBD(Rados Block Device)进行块设备的创建、修改、删除和挂载操作。
620 3
|
9月前
|
缓存 Linux
Linux查看内存命令
1. free free命令是最常用的查看内存使用情况的命令。它显示系统的总内存、已使用内存、空闲内存和交换内存的总量。 free -h • -h 选项:以易读的格式(如GB、MB)显示内存大小。 输出示例: total used free shared buff/cache available Mem: 15Gi 4.7Gi 4.1Gi 288Mi 6.6Gi 9.9Gi Swap: 2.0Gi 0B 2.0Gi • to
643 2
|
9月前
|
机器学习/深度学习 存储 算法
DeepSeek多智能体强化学习
多智能体强化学习(MARL)是强化学习的重要分支,专注于训练多个智能体在复杂环境中协同或竞争。与单智能体不同,MARL需考虑智能体间的交互与协作,更具挑战性。DeepSeek提供强大工具和API,助力高效构建和训练MARL模型。本文将详细介绍使用DeepSeek进行MARL的方法,并通过代码示例帮助读者掌握相关技巧。内容涵盖多智能体环境的构建、Q学习和DQN智能体的定义与训练,以及常见问题的解决方案。
|
前端开发 虚拟化 内存技术
SPDK vhost target
SPDK vhost target
|
10月前
|
SQL 分布式计算 Java
Spark SQL向量化执行引擎框架Gluten-Velox在AArch64使能和优化
本文摘自 Arm China的工程师顾煜祺关于“在 Arm 平台上使用 Native 算子库加速 Spark”的分享,主要内容包括以下四个部分: 1.技术背景 2.算子库构成 3.算子操作优化 4.未来工作
1114 0
|
12月前
|
Docker 容器
marco-o1 + ollama + Open-WebUI 实现 o1 的折叠推理效果
marco-o1 + ollama + Open-WebUI 实现 o1 的折叠推理效果
1181 2
加载模型出现-RuntimeError: Error(s) in loading state_dict for Net:unexpected key(s) in state_dict: XXX
加载模型出现-RuntimeError: Error(s) in loading state_dict for Net:unexpected key(s) in state_dict: XXX
870 0