背景介绍
最近在进行eBPF相关的尝试,在centos7中执行eBPF脚本时遇到如下错误:
modprobe: FATAL: Module kheaders not found.
chdir(/lib/modules/3.10.0-1062.9.1.el7.x86_64/build): No such file or directory
Traceback (most recent call last):
File "./test.py", line 104, in <module>
b = BPF(text=bpf_program)
File "/usr/lib/python2.7/site-packages/bcc/__init__.py", line 325, in __init__
raise Exception("Failed to compile BPF text")
Exception: Failed to compile BPF text
从网上找到原因,是因为kernel和kernel-devel工具版本不一致导致的。
解决问题
查看当前内核版本:
命令:uname -r
结果:3.10.0-1062.9.1.el7.x86_64
查看devel工具版本:
命令:rpm -qa|grep -i kernel | grep -i devel
结果:kernel-devel-3.10.0-1160.83.1.el7.x86_64
这里的版本一致性需要完全一致,小版本不一致也不行。
两种解决思路:devel降级或者kernel升级。
先尝试降级,安装一个低版本的devel。
命令:yum install "kernel-devel-uname-r == $(uname -r)"
结果:
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
No package kernel-devel-uname-r == 3.10.0-1062.9.1.el7.x86_64 available.
Error: Nothing to do
说明没有该kernel版本的devel,所以只能尝试升级kernel的方案了。
查看现在系统可用内核版本 rpm -qa | grep kernel
kernel-headers-3.10.0-1062.9.1.el7.x86_64
kernel-devel-3.10.0-1160.83.1.el7.x86_64
kernel-debug-devel-3.10.0-1062.12.1.el7.x86_64
kernel-tools-libs-3.10.0-1062.9.1.el7.x86_64
kernel-3.10.0-957.12.2.el7.x86_64
kernel-3.10.0-1062.9.1.el7.x86_64
kernel-tools-3.10.0-1062.9.1.el7.x86_64
没有安装我们想要的版本,所以需要先安装。
查看内核仓库中可安装的内核包
yum list --showduplicate kernel*
能找得到kernel.x86_64 3.10.0-1160.83.1.el7,就看怎么来安装了。
6、安装指定版本kernel
yum -y install "kernel-uname-r == 3.10.0-1160.83.1.el7.x86_64"
7、查看内核版本的启动顺序
awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
找到自己新安装的版本,一般最新安装的会是第一行
8、修改内核启动顺序
sudo vim /etc/default/grub
把GRUB_DEFAULT=saved改成GRUB_0=saved
运行命令重新生成内核配置
grub2-mkconfig -o /boot/grub2/grub.cfg
9、reboot重启,当前内核uname -r
3.10.0-1160.83.1.el7.x86_64