Centos7 eBPF开发环境搭建

最近在做可观测性分析的项目,所以准备研究下ebpf。因为生产环境用的比较多的环境是Centos7,所以在Centos7下尝试搭建eBPF开发环境。在网上找了个《Linux内核观测技术BPF》第一个例子跑了一下。

1 内核升级

CentOS 升级内核的三种方式(yum/rpm/源码),这个网上有很多,我直接用的yum方式。

检查内核版本

uname -r

导入仓库源

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

查看可安装的软件包

yum --enablerepo="elrepo-kernel" list --showduplicates | sort -r | grep kernel-ml.x86_64

安装版本,ML或者LT自己选

yum --enablerepo=elrepo-kernel install kernel-lt-devel kernel-lt -y

查看现有内核启动顺序

awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg

修改默认启动项

grub2-set-default xxxx

重启

reboot

2 gcc升级

centos7 默认clang llvm版本较低(只有3.4.2),不识别-target=bpf命令,因此需要进行升级。

error: unknown target triple 'bpf', please use -triple or -arch

centos默认安装的是 gcc 4.8.5,版本过低。

yum install centos-release-scl 
yum install devtoolset-7 
当前登陆session生效 
scl enable devtoolset-7 
bash source /opt/rh/devtoolset-7/enable
echo "source /opt/rh/devtoolset-7/enable" >> ~/.bash_profile 
source /opt/rh/devtoolset-7/enable

3 cmake升级

下载cmake-3.14.0.tar.gz

tar -zxvf cmake-3.14.0.tar.gz
cd cmake-3.14.0
./bootstrap
make
make install

4 llvm升级

llvm官网从9.0版本开始打包了一个包含所有组件源码的大项目 llvm-project。地址

https://github.com/llvm/llvm-project

直接通过git clone,由于项目文件非常多,所以size很大。试了几次一直超时失败,无奈只能下载压缩包。

解压:xz -d llvm-project-11.0.0.tar.xz,生成了一个 tar包。
再解:tar -xvf llvm-project-11.0.0.tar ,生成一个 ./llvm-project-11.0.0 目录

cd llvm-project-11.0.0
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi" -G "Unix Makefiles" ../llvm
make
make install

注意:make的过程需要很长时间。另外,如果使用虚拟机,内存一定要分配大一些,我开始设置2G内存,make在74%卡住长时间不动,之后设置为4G才成功。

5 libbpf

#如果git用不了,也可以用gitee
git clone https://github.com/libbpf/libbpf
cd libbpf/src
make
make install

6 内核头文件升级

# make bpfload
clang -O2 -target bpf -c bpf_program.c -I/home/kernel-src/linux-5.4.210/tools/testing/selftests/bpf -o bpf_program.o
clang -DHAVE_ATTR_TEST=0 -o monitor-exec -lelf -I/home/kernel-src/linux-5.4.210/samples/bpf -I/home/kernel-src/linux-5.4.210/tools/lib -I/home/kernel-src/linux-5.4.210/tools/perf -I/home/kernel-src/linux-5.4.210/tools/include -L/usr/local/lib64 -lbpf \
        /home/kernel-src/linux-5.4.210/samples/bpf/bpf_load.c loader.c
/home/kernel-src/linux-5.4.210/samples/bpf/bpf_load.c:108:15: error: use of undeclared identifier 'BPF_PROG_TYPE_RAW_TRACEPOINT'; did you mean 'BPF_PROG_TYPE_TRACEPOINT'?
                prog_type = BPF_PROG_TYPE_RAW_TRACEPOINT;
                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
                            BPF_PROG_TYPE_TRACEPOINT
/usr/include/linux/bpf.h:122:2: note: 'BPF_PROG_TYPE_TRACEPOINT' declared here
        BPF_PROG_TYPE_TRACEPOINT,
        ^
/home/kernel-src/linux-5.4.210/samples/bpf/bpf_load.c:120:15: error: use of undeclared identifier 'BPF_PROG_TYPE_SK_SKB'
                prog_type = BPF_PROG_TYPE_SK_SKB;
                            ^
/home/kernel-src/linux-5.4.210/samples/bpf/bpf_load.c:122:15: error: use of undeclared identifier 'BPF_PROG_TYPE_SK_MSG'; did you mean 'BPF_PROG_TYPE_SOCK_OPS'?
                prog_type = BPF_PROG_TYPE_SK_MSG;
                            ^~~~~~~~~~~~~~~~~~~~
                            BPF_PROG_TYPE_SOCK_OPS
/usr/include/linux/bpf.h:130:2: note: 'BPF_PROG_TYPE_SOCK_OPS' declared here
        BPF_PROG_TYPE_SOCK_OPS,
        ^
3 errors generated.
make: *** [Makefile:45: bpfload] Error 1

按照网上能搜到的说明,安装完libbpf就能正常运行程序了,但是试跑代码的时候提示头文件“/usr/include/linux/bpf.h”中bpf_map_type部分类型没有定义,原因是头文件并没有升级,需要手动安装头文件。

直接安装 kernel-ml-headers,但会出现和原版内核 headers 冲突的问题。

Error: kernel-ml-headers conflicts with kernel-headers-3.10.0-693.17.1.el7.x86_64

需要先卸载原版内核 headers ,然后再安装最新版内核 headers。

yum remove kernel-headers

确认无误后,输入 y,回车开始卸载。注意,有时候这么操作还会卸载一些对内核 headers 依赖的安装包,比如 gcc、gcc-c++ 之类的。不过不要紧,可以在安装完最新版内核 headers 后再重新安装回来即可。
卸载完成后,再次执行安装命令。

yum –enablerepo=elrepo-kernel -y install kernel-ml-headers

成功安装后,再把那些之前对内核 headers 依赖的安装包,比如 gcc、gcc-c++ 之类的再安装一次即可。

7 试跑代码

linux-observability-with-bpf 项目中能够找到《Linux内核观测技术 BPF》一 书中的配套代码,它的 git 项目地址如下:

https://github.com/bpftools/linux-observability-with-bpf

直接使用 git 进行克隆即可,在运行代码前,建议先阅读 README.md

使用yum升级Centos不会安装代码,所以需要你单独下载一份内核源码,同时需要对Makefile做相应的改变

比如我把5.4.210源码放在/home/kernel-src目录下,需要修改Makefile如下:

CLANG = clang

EXECABLE = monitor-exec

BPFCODE = bpf_program

BPFTOOLS = /home/kernel-src/linux-5.4.210/samples/bpf
BPFLOADER = $(BPFTOOLS)/bpf_load.c

CCINCLUDE += -I/home/kernel-src/linux-5.4.210/tools/testing/selftests/bpf

LOADINCLUDE += -I/home/kernel-src/linux-5.4.210/samples/bpf
LOADINCLUDE += -I/home/kernel-src/linux-5.4.210/tools/lib
LOADINCLUDE += -I/home/kernel-src/linux-5.4.210/tools/perf
LOADINCLUDE += -I/home/kernel-src/linux-5.4.210/tools/include
LIBRARY_PATH = -L/usr/local/lib64
BPFSO = -lbpf

# Setting -DHAVE_ATTR_TEST=0 for the kernel containing below patch:
# 06f84d1989b7 perf tools: Make usage of test_attr__* optional for perf-sys.h
#
# The patch was included in Linus's tree starting v5.5-rc1, but was also included
# in stable kernel branch linux-5.4.y. So it's hard to determine whether a kernel
# is affected based on the kernel version alone:
# - for a v5.4 kernel from Linus's tree, no;
# - for a v5.4 kernel from the stable tree (used by many distros), yes.
#
# So let's look at the actual kernel source code to decide.
#
# See more context at:
# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=06f84d1989b7e58d56fa2e448664585749d41221
# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=fce9501aec6bdda45ef3a5e365a5e0de7de7fe2d
CFLAGS += $(shell grep -q "define HAVE_ATTR_TEST 1" /home/kernel-src/linux-5.4.210/tools/perf/perf-sys.h \
                  && echo "-DHAVE_ATTR_TEST=0")

.PHONY: clean $(CLANG) bpfload build

clean:
	rm -f *.o *.so $(EXECABLE)

build: ${BPFCODE.c} ${BPFLOADER}
	$(CLANG) -O2 -target bpf -c $(BPFCODE:=.c) $(CCINCLUDE) -o ${BPFCODE:=.o}

bpfload: build
	clang $(CFLAGS) -o $(EXECABLE) -lelf $(LOADINCLUDE) $(LIBRARY_PATH) $(BPFSO) \
        $(BPFLOADER) loader.c

$(EXECABLE): bpfload

.DEFAULT_GOAL := $(EXECABLE)

好了,现在可以运行第一个用例hello world了。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wufeng无峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值