参考:CentOS7编译自己的内核模块 - 简书

一、安装内核源码树步骤

1、按照上述帖子操作之前,如果你的OS不是安装的开发版本,需要先安装kernel-devel

(1)可以使用命令sudo yum install kernel-devel安装;

(2)或者到如下网站下载对应的rpm包安装http://vault.centos.org/7.3.1611/updates/Source/SPackages/kernel-3.10.0-514.26.2.el7.src.rpm

rpm -ivh xxx.rpm  --nodeps --force

2、官方强烈建议不要以root身份编译内核源码,其实关系不大,不需要去新创建用户

3、查看OS的版本

[root@localhost host]#  rpm -q centos-release
centos-release-7-9.2009.1.el7.centos.x86_64

[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

二、安装过程中遇到的问题

/// 错误1:直接使用rpm安装的话,会提示一个错误:
#rpm -i kernel-3.10.0-862.el7.src.rpm
Warning: user mockbuild does not exist. using root
...
这时需要安装一个mock,并新建一个mockbuild用户:
#yum install mock
#useradd -s /sbin/nologin mockbuild
https://blog.csdn.net/weixin_50886514/article/details/115468624
https://vault.centos.org/7.9.2009/os/Source/SPackages/


/// 错误2:安装源码需要依赖的包
[root@localhost SPECS]# rpmbuild -bp --target=$(uname -m) kernel.spec
构建目标平台:x86_64
为目标x86_64构建

错误:构建依赖失败:
    net-tools 被 kernel-3.10.0-1160.el7.x86_64 需要
    bison 被 kernel-3.10.0-1160.el7.x86_64 需要
    java-devel 被 kernel-3.10.0-1160.el7.x86_64 需要
    python-docutils 被 kernel-3.10.0-1160.el7.x86_64 需要

[root@localhost SPECS]# yum install java-devel
[root@localhost SPECS]# yum install python-docutils

[root@localhost linux-3.10.0-1160.el7.x86_64]# pwd
/root/rpmbuild/BUILD/kernel-3.10.0-1160.el7/linux-3.10.0-1160.el7.x86_64

/// 错误3:执行编译命令后,insmod nvme-core.ko报错:
[root@localhost host]# make -C /usr/src/kernels/3.10.0-1160.83.1.el7.x86_64/ M=/root/rpmbuild/BUILD/kernel-3.10.0-1160.el7/linux-3.10.0-1160.el7.x86_64/drivers/nvme/host modules

[ 6241.247315] nvme_core: loading out-of-tree module taints kernel.
[ 6241.248204] nvme_core: module verification failed: signature and/or required key missing - tainting kernel

//按下面帖子应该可以解决上面2个错误,不过报这两个错误貌似也不影响KO加载
https://blog.csdn.net/u011050845/article/details/125699924        再自己的Makefile中加CONFIG_MODULE_SIG=n
https://blog.csdn.net/gzxb1995/article/details/105407014/        MODULE_INFO(intree, "Y");

///下面这个错误没有解决掉,是比较老的内核代码retpoline.S中的一个汇编符号
[ 6241.248558] nvme_core: Unknown symbol __x86_return_thunk (err 0)

重新安装一个比较新的OS镜像,按上面的步骤再执行一遍后,编译出来的KO可以加载:

make -C /root/rpmbuild/BUILD/kernel-3.10.0-1127.el7/linux-3.10.0-1127.el7.x86_64/ M=/root/rpmbuild/BUILD/kernel-3.10.0-1127.el7/linux-3.10.0-1127.el7.x86_64/drivers/nvme/host/

[root@localhost host]# insmod nvme-core.ko
[root@localhost host]# insmod nvme.ko
[root@localhost host]# lsmod |grep nvme
nvme                   32382  0 
nvme_core              63547  1 nvme

补充:

在qemu上装的centos8的虚拟机,安装python-devel时报错:

 需要换一个安装包:

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐