CentOS 7 eBPF 环境编译安装


CentOS 7 eBPF 环境 bcc-tools 编译安装

一、环境说明

下面部署过程在 CentOS 7.6、7.9 均顺利通过,主要参考官方文档,不过中间踩了几个小坑,特此记录下,避免后续自己和他人再跟这儿浪费时间

二、升级内核

如果操作系统内核版本是 3.10.x,那么没的说,升级就完事了,毕竟版本太低,很多内核特性都不支持

升级内核的过程比较简单,这里选择的是 kernel-lt 长期支持版,没有选择 kernel-ml 主线最新版本,毕竟新就意味着坑多,先让大佬们趟一趟吧

$ yum -y install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
$ yum-config-manager --enable elrepo-kernel
$ yum -y install --disablerepo="*" --enablerepo="elrepo-kernel" kernel-lt kernel-lt-devel kernel-lt-headers perf
$ grub2-set-default 0 && grub2-mkconfig -o /boot/grub2/grub.cfg

重启系统,检查内核版本

$ reboot
$ uname -r

如果本身系统已经升级过内核,但是没有安装过 kernel-lt-devel,那么可以按照下面的方式来补救

# 检查是否安装 kernel-lt-devel
$ rpm -qa | grep kernel-lt-devel
# 安装 kernel-lt-devel-${version} 版本号
$ yum -y install "kernel-devel-uname-r == $(uname -r)"
# rpm -ivh http://download.yo-yo.fun/bcc/kernel-lt-devel-5.4.221-1.el7.elrepo.x86_64.rpm

如果提示 No package 见最下方 常见错误

三、编译依赖

安装依赖项

$ yum -y install epel-release centos-release-scl
$ yum -y install devtoolset-8-gcc-c++ devtoolset-8-gcc iperf elfutils-libelf-devel cmake3 git bison flex ncurses-devel luajit luajit-devel zip
$ rpm -ivh http://download.yo-yo.fun/bcc/netperf-2.7.0-1.el7.lux.x86_64.rpm

下载 llvm、clang 源码

# 避免 github gfw 问题,下载已打包好的文件
$ wget http://download.yo-yo.fun/bcc/llvm-10.0.0.src.tar.xz
$ wget http://download.yo-yo.fun/bcc/cfe-10.0.0.src.tar.xz

解压 llvm、clang 源码

$ for f in *.xz; do tar xf "$f"; done

创建编译目录

$ mkdir clang-build; mkdir llvm-build

临时更改使用 gcc 版本

$ scl enable devtoolset-8 zsh

执行编译 llvm-build

$ cd llvm-build
$ cmake3 -G "Unix Makefiles" -DLLVM_TARGETS_TO_BUILD="BPF;X86" \
  -DCMAKE_BUILD_TYPE=Release ../llvm-10.0.0.src

# 加速编译
$ make -j`nproc`
$ make install

执行编译 clang

$ cd ../clang-build
$ cmake3 -G "Unix Makefiles" -DLLVM_TARGETS_TO_BUILD="BPF;X86" \
  -DCMAKE_BUILD_TYPE=Release ../clang-10.0.0.src

$ make -j`nproc`
$ make install

三、编译 bcc

下载解压 bcc 代码

# 避免 github gfw 问题,下载已打包好的文件,文件内预先拉取所有子模块,加速自检编译
$ wget http://download.yo-yo.fun/bcc/bcc.tgz
$ tar xf bcc.tgz

编译 bcc

$ cd bcc/build
$ cmake3 ..
$ make -j`nproc`
$ make install

四、检查确认

运行 hello_world.py 检查安装情况

$ python ../examples/hello_world.py
b'         systemd-1       [000] .... 39841.246643: 0: Hello, World!'

测试常用 bcc tools 工具

$ python3 ../tools/cachestat.py

HITS   MISSES  DIRTIES HITRATIO   BUFFERS_MB  CACHED_MB
12     0       0       100.00%    27          2118
1      0       0       100.00%    27          2118
0      0       0       0.00%      27          2118

将 tools 添加进 PATH 变量

$ echo "export PATH=$PATH:/root/bcc/tools" >> /etc/profile
$ . /etc/profile

修改默认 python 版本

# alternatives --install <link>          <name> <path>      <priority>
# 50、60 是优先级,也可以改用其他数值
$ alternatives --install /usr/bin/python python /usr/bin/python2 50
$ alternatives --install /usr/bin/python python /usr/bin/python3 60

# alternatives --config python 切换版本

尝试执行

$ cachestat.py
HITS   MISSES  DIRTIES HITRATIO   BUFFERS_MB  CACHED_MB
2      0       2       100.00%    183         515
0      0       0         0.00%    183         515
5      0       1       100.00%    183         515

五、常见错误

No module named bcc

该错误常见于系统中存在多个 Python 版本,执行 make install 会输出文件安装到那个 Python 版本,如果没有留心,也可以通过下面的命令查看

执行下面的命令,查看 bcc 包安装到那个 Python 版本

$ updatedb
$ locate site-packages/bcc/

如下,我在安装 bcc 时相关的库就被安装到 3.6 目录下

$ locate site-packages/bcc
/usr/lib/python3.6/site-packages/bcc

No package kernel-devel available

通常来说,如果升级内核、安装 kernel-devel 这两个工作是同一时间进行的,那么基本上是不会遇到这个问题

$ yum install "kernel-devel-uname-r == $(uname -r)"
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * elrepo: mirrors.tuna.tsinghua.edu.cn
 * elrepo-kernel: mirrors.tuna.tsinghua.edu.cn
base       | 3.6 kB  00:00:00     
epel       | 4.7 kB  00:00:00     
extras     | 2.9 kB  00:00:00     
updates    | 2.9 kB  00:00:00     
No package kernel-devel-uname-r == 5.4.221-1.el7.elrepo.x86_64 available.
Error: Nothing to do

不过,在某些场景下,出于各种原因(主要是标准化没做好),不排除部分节点升级了内核,但是未安装 kernel-devel,这时就会遇到这个问题

处理这个问题也比较简单

# 由于 mirror 节点是境外的,建议使科学上网下载、上传到服务器节点,再进行安装
$ rpm -ivh https://linux.cc.iitk.ac.in/mirror/centos/elrepo/kernel/el7/x86_64/RPMS/kernel-lt-devel-`uname -r`.rpm

本地安装也不难,首先获取当前系统内核版本

$ uname -r
5.4.221-1.el7.elrepo.x86_64

打开 elrepo 镜像地址,页面搜索 内核版本,复制链接,节点执行下载安装

# 如下,我这边就是先下载好,再上传到服务器上供以其他节点安装,不过这里只有少数几个版本的包,建议自行下载
# rpm -ivh http://download.yo-yo.fun/bcc/kernel-lt-devel-5.4.221-1.el7.elrepo.x86_64.rpm

文章作者: Da
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Da !
  目录