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