一、ubuntu 直接自带内核开发环境??我试过,编写内核模块代码可以直接make通过,但CentOS就不一样了(我测试的是CentOS 7),make会提示没有文件目录错误。
二、CentOS默认不带内核开发环境
需要自己手动安装:
(1)uname –r 查看当前内核版本
(2)yum list | grep kernel 查看当前可以直接用yum更新的内核相关包

@anaconda 表示安装内核的时候已经带的包
updates表示可以从yum更新的包
(3)yum install kernel-headers-$(uname –r) 安装内核开发需要的包头 ---提示我已经有了

但 ls /usr/src/kernels 仍然没有任何内容,内核相关的开发文件没有。编译自己写的内核模块hello-1.c的时候会提示错误:make: *** /lib/modules/3.10.0-957.el7.x86_64/build/: No such file or directory.
参考解决文章:https://blog.youkuaiyun.com/qq_21111579/article/details/49337191
这时还是需要安装kernel-devel内核开发包。但发现本地内核的版本和yum上面的devel版本不一样。按理说不能直接yum install kernel-devel.x86_64。
但很多人也直接这么安装了,并改一下 /lib/modules/3.10.0.957.el7.x86_64/build 的软连接。并且可以使用。
cd /lib/modules/3.10.0.957.el7.x86_64/
rm build
ln -s /usr/src/kernels/3.10.0-1062.4.1.el7.x86_64/ build
![]()
![]()
上面步骤完了,再测试一下我的hello-1.c代码的编译,可以成功。不敢保证后面会有啥问题!!


版本不一致,也有的文章说会引起内核版本不一致导致错误。

关于kernel-devel、kernel-header和kernel src的区别
https://www.cnblogs.com/zhaoxuguang/p/7810611.html
1) 'kernel-header' package :
Providing /usr/include/linux:/usr/include/asm*, etc. kernel headers.
Description :
Kernel-headers includes the C header files that specify the interface between the Linux kernel and userspace libraries and programs. The header files define structures and constants that are needed for building most standard programs and are also needed for rebuilding the glibc package.
2) 'kernel-devel' package : /usr/src/kernels/`uname -r`/include/*
Description :
This package provides kernel headers and makefiles sufficient to build modules against the kernel package.
kernel-devel包只包含用于内核开发所需的内核头文件以及Makefile,而kernel-souce包含所有内核源代码。
如果仅仅是用你自己编写的模块开发的话,因为只需引用相应的内核头文件,所以只有devel包即可,如果你要修改现有的内核源代码并重新编译,那必须是kernel-souce。
kernel-souce在RH某些版本之后不再附带在发行版中了,必须自己通过kernel-XXX.src.rpm做出来。
kernel-devel是用做内核的一般开发的,比如编写内核模块,原则上,可以不需要内核的原代码。kernel则是专指内核本身的开发,因此需要内核的原代码。
关于kernel source的有kernel和kernel-devel两个rpm,其中kernel rpm包含源文件和头文件(就像2.4下的kernel-source rpm),而kernel-devel则主要是头文件。
关于版本不一致的问题也是有解决方法的:
https://blog.youkuaiyun.com/weixin_42651205/article/details/100160509
这边文章内容:
编译dpdk-1.8时候报错‘PCI_MSIX_ENTRY_CTRL_MASKBIT’ undeclared (first use in this function)
原因是安装服务器操作系统centos6.5的时候装的是简化版,不带开发环境包
ls /usr/src/kernels/ 显示为空
于是直接在线安装了kernel-devel和gcc。
下面的做法是错误的:
sudo yum install “kernel-devel-uname-r == $(uname -r)”
会提示找不到 kernel-devel-2.6.32-431.el6.x86_64.rpm,去kernel-devel的站点也没有这个版本了。
sudo yum install kernel-devel
安装的是kernel-devel-2.6.32-745.el6.x86_64.rpm,于是安装完后再装gcc,编译就会报这个错,内核开发环境和内核版本不一致。
只能卸载kernel-devel,重新装和内核版本一致的开发环境。可能也不需要卸载,再装一个就可以;但会报有更高的版本,安装不了;实际上是可以多个kernel-devel版本并存的。需要先装低版本再装高版本,然后需要使用哪个版本的话再执行以下操作,我是全部删掉了之前的内核开发环境。
#cd /lib/modules/2.6.32-431.el6.x86_64
#ln -s ../../../usr/src/kernels/2.6.32-431.el6.x86_64 build
#ln -s build source
正确的安装步骤:
1、查看和下载kernel-devel版本
#uname –a
查看内核的版本为:
Linux bogon 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
下载内核开发环境rpm安装包,google一个可下载的rpm包:
#wget ftp://ftp.pbone.net/mirror/ftp.scientificlinux.org/linux/scientific/6.0/x86_64/updates/security/kernel-devel-2.6.32-431.el6.x86_64.rpm
##这个网站必须重点介绍下,我找了很多镜像网站,都没有我想要的安装包rpm,它这边居然有。厉害了!!
2、查看是否已经安装了内核开发环境包:
#uname -a ; rpm -qa kernel\* | sort
kernel-2.6.32-431.el6.x86_64
kernel-devel-2.6.32-745.el6.x86_64
kernel-firmware-2.6.32-745.el6.noarch
之前使用yum instaill直接安装的kernel-devel版本跟内核版本对不上,如果已经安装了执行:
#yum remove kernel-devel-2.6.32-745.18.2.el6.x86_64
卸载安装
3、安装下载好的内核版本对应的开发包:
#rpm -ivh kernel-devel-2.6.32-431.el6.x86_64.rpm
4、安装gcc和g++
#yum install gcc
#yum install gcc-c++
看下记录,我是直接先下载到windows然后rz上传到服务器,并且安装的。

3.10.0-957.e17.x86_64目录即是我rpm命令后新出现的。
内核开发环境搭建,很多都要对CentOS7内核进行重新编译
https://blog.youkuaiyun.com/nnaiwa/article/details/81706448
###命令剪辑###
cd /usr/src/kernels/
sudo tar -zxvf ~/installer/linux/src/linux-4.1.16.tar.gz #源码需要下载
cd /usr/src/kernels/linux-4.1.16/
sudo cp /boot/config-3.10.0-327.el7.x86_64 ./.config
make oldconfig
cat /proc/cpuinfo #查看CUP核数,编译的时候可以开多核同时工作
#cd /usr/src/kernels/linux-4.1.16/
sudo make -j16 all
sudo make modules_install
sudo make install
编译完的数据十分巨大,花的时间也很长啊~~


本文详细介绍了在CentOS系统上搭建内核模块开发环境的过程,包括查看和安装kernel-headers、kernel-devel包,解决版本不一致的问题,以及内核开发包的作用和区别。在遇到yum安装的kernel-devel版本与内核不匹配时,通过下载对应版本的rpm包进行手动安装,并调整软链接,确保编译内核模块的成功。
3206

被折叠的 条评论
为什么被折叠?



