首先,对于 CentOS 来说,根据官方文档,CentOS 8 已在 2021 年底被放弃,所以不再推荐将其作为生产环境继续使用。对于已有的用户来说,可以升级到 CentOS Stream 或 Rocky Linux 继续获得开源社区的支持。比如,你可以执行下面的命令,把 CentOS 8 升级为 CentOS Stream 8:
sudo dnf --disablerepo '*' --enablerepo extras swap centos-linux-repos centos-stream-repos -y sudo dnf distro-sync -y
打开一个终端,SSH 连接到 CentOS Stream 8 系统后,执行 dnf info bcc-tools 查询 BCC 的版本,你会看到如下的输出:
Available Packages Name : bcc-tools Version : 0.19.0 Release : 5.el8 Architecture : x86_64 Size : 448 k Source : bcc-0.19.0-5.el8.src.rpm Repository : appstream Summary : Command line tools for BPF Compiler Collection (BCC) URL : https://github.com/iovisor/bcc License : ASL 2.0 Description : Command line tools for BPF Compiler Collection (BCC)
为了使用较新的 BCC,从源码编译安装就是比直接使用 dnf 安装更好的选择。
在终端中执行下面的命令,我们就可以从源码编译和安装 BCC 0.24.0 版本:
# 第一步,安装必要的开发工具和开发库 sudo dnf makecache --refresh sudo dnf groupinstall -y "Development tools" sudo dnf install -y git bison flex cmake3 clang llvm bpftool elfutils-libelf-devel clang-devel llvm-devel ncurses-devel # 第二步,从源码编译安装BCC git clone -b v0.24.0 https://github.com/iovisor/bcc.git mkdir bcc/build; cd bcc/build cmake -DENABLE_LLVM_SHARED=1 .. make sudo make install cmake -DPYTHON_CMD=python3 .. # build python3 binding pushd src/python/ make sudo make install popd
命令执行成功后,所有的 BCC 工具都会安装到 /usr/share/bcc/tools 目录下。比如,你可以执行 sudo python3 /usr/share/bcc/tools/execsnoop 命令来运行 BCC 自带的 execsnoop 工具。
从 bpftrace 预先编译好的容器镜像中复制二进制文件。
我们执行下面的命令,安装容器工具 podman 之后,借助 podman 拉取 bpftrace 容器镜像,再将其中的 bpftrace 二进制文件复制出来,就可以把 bpftrace 安装到当前目录了:
# 第一步,安装podman sudo dnf install -y podman # 第二步,下载镜像后从中复制bpftrace二进制文件 podman pull quay.io/iovisor/bpftrace:master-vanilla_llvm_clang_glibc2.23 podman run --security-opt label=disable -v $(pwd):/output quay.io/iovisor/bpftrace:master-vanilla_llvm_clang_glibc2.23 /bin/bash -c "cp /usr/bin/bpftrace /output"
这里需要你留意一点:在上面的命令中,我们使用了 podman 工具来拉取镜像并运行容器,这是因为 CentOS Stream 自带的软件包中不包含 Docker。
安装成功后,你可以执行下面的命令验证 bpftrace 的功能:
sudo ./bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args->filename)); }'
如果一切正常,你将会看到类似下面的输出:
Attaching 1 probe... vmstats /proc/meminfo vmstats /proc/stat vminfo /var/run/utmp ...
到这里,我们就完成了 CentOS Stream 开发环境的配置。
接下来从内核源码编译安装 bpftool 的第一步是下载内核的源码。根据发行版的不同,内核源码的下载方法可以分为三种:
- 利用发行版自带的工具,下载安装发行版提供的内核源码包。比如 RHEL、CentOS、Ubuntu 等,都可以使用这种方法。
- 直接从内核网站 kernel.org 下载内核源码,注意下载前要先执行 uname -r 查询系统的内核版本。
- 发行版提供的代码仓库下载内核源码,比如对于 WSL2,就可以到 GitHub 下载。
后两种方法比较简单,只要从相关的网站中找到链接就可以直接下载了;而对于第一种方法,你可以执行下面的步骤,借助 yumdownloader 或 apt 工具下载发行版提供的内核源码包。
比如,在 CentOS Stream 8 系统中,你可以执行下面的命令,下载内核源码并安装内核编译所需的开发工具和开发库:
# 第一步,开启必需的软件包仓库 sudo dnf -y install dnf-plugins-core sudo dnf config-manager --set-enabled powertools # 第二步,下载内核源码 yumdownloader --source kernel rpm -ivh kernel-*.src.rpm # 第三步,安装依赖包 cd rpmbuild/SPECS/ sudo dnf builddep kernel.spec # 第四步,解压内核源码并切换到解压后的内核源码目录(注意替换为你的内核版本) rpmbuild -bp --target=x86_64 kernel.spec cd ../BUILD/kernel-4.18.0-373.el8/linux-4.18.0-373.el8.x86_64/
内核源码下载成功后,它的 tools/bpf/bpftool 目录就包含了 bpftool 工具的源代码,因而你就可以从这个目录重新编译和安装 bpftool。
不过在编译之前要注意,libbfd 库包含在 binutils 开发库中,因而你还需要先安装 binutils 开发包。具体的安装和编译步骤如下所示:
# 第一步,安装binutils开发库 ## CentOS执行dnf命令 sudo dnf install -y binutils-devel ## Ubuntu执行apt命令 sudo apt install -y binutils-dev # 第二步,从源码编译并安装bpftool make -C tools/bpf/bpftool sudo make install -C tools/bpf/bpftool/
上述命令执行成功后,再次执行 sudo bpftool prog dump jited id 2 之后,你可以发现,现在已经可以正常看到 eBPF 程序的指令了。