学习 eBPF 前的环境准备

1.升级内核

通过 yum 可以自动内核到特定版本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
yum remove kernel-lt-*  kernel-tools kernel-tools-libs kernel-headers -y

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 install kernel-ml kernel-ml-* perf -y

grep "^menuentry" /boot/grub2/grub.cfg | cut -d "'" -f2
grub2-set-default <内核版本>
grub2-editenv list
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot

2. 安装CLANG/LLVM

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 安装gcc
yum install centos-release-scl
yum install devtoolset-7
scl enable devtoolset-7 bash
source /opt/rh/devtoolset-7/enable

# 安装cmake
yum -y install openssl-devel
wget https://github.com/Kitware/CMake/releases/download/v3.22.4/cmake-3.22.4.tar.gz
tar -zxvf cmake-3.22.4.tar.gz && cmake-3.22.4
./bootstrap --prefix=/usr --datadir=share/cmake --docdir=doc/cmake && make
make install

# 安装python3.6
wget https://www.python.org/ftp/python/3.6.15/Python-3.6.15.tgz
tar -xf Python-3.6.15.tgz && cd Python-3.6.15
./configure --prefix=/usr/local --with-ssl
make altinstall
ln -s /usr/local/bin/python3.6 /usr/bin/python3
ln -s /usr/local/bin/pip3.6 /usr/bin/pip3
pip3 install --upgrade pip

# 安装llvm
curl -o llvm-project-14.0.3.src.tar.xz https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.3/llvm-project-14.0.3.src.tar.xz
tar -xvf llvm-project-14.0.3.src.tar.xz
cd llvm-project-14.0.3.src
cmake -S llvm -B build -G "Unix Makefiles" -DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_PROJECTS="clang" -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" -DCMAKE_BUILD_TYPE=Release
cd build && make
make install

3. 重新编译内核

通过 yum 等包工具直接安装编译好的内核时,可能部分 BPF 开关在编译时没有打开。因此,在一些情况下我们需要手工编译内核。

内核源码可以从 https://www.kernel.org/ 下载

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 安装 pahole 编译 BTF 依赖这个底层库
yum -y install elfutils-devel elfutils-libelf-devel flex bison bc
git clone https://git.kernel.org/pub/scm/devel/pahole/pahole.git
cd pahole
git checkout tags/v1.23 -b v1.23
git submodule update --init
mkdir build && cd build
cmake -D__LIB=lib -DCMAKE_INSTALL_PREFIX=/usr ..
make install
ln -sf /usr/lib/libdwarves_emit.so.1.0.0 /usr/lib64/libdwarves_emit.so.1
ln -sf /usr/lib/libdwarves_reorganize.so.1.0.0 /usr/lib64/libdwarves_reorganize.so.1
ln -sf /usr/lib/libdwarves.so.1.0.0 /usr/lib64/libdwarves.so.1
pahole --version
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 编译内核
scl enable devtoolset-7 bash
source /opt/rh/devtoolset-7/enable
yum -y install rsync
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.17.6.tar.xz
tar -xvf linux-5.17.6.tar.xz
cd linux-5.17.6
cp /boot/config-$(uname -r) .config
# 修改 .config CONFIG_DEBUG_INFO_BTF=y
make -j 4
make modules_install
make install

# 安装源码和头文件
ln -s /root/download/linux-5.17.6 /kernel-src
make headers_install

# 或者通过以下方式安装源码
yum --enablerepo=elrepo-kernel  install \
kernel-ml-headers-5.17.6 \
kernel-ml-devel-5.17.6 \
kernel-ml-tools-5.17.6 \
kernel-ml-tools-libs-devel-5.17.6 \
kernel-ml-tools-libs-5.17.6 \
kernel-ml-doc-5.17.6 \
perf

# 配置默认启动
grub2-set-default "Linux (5.17.6) 7 (Core)"
reboot

4. 安装libbpf

1
2
3
4
5
6
7
8
wget https://github.com/libbpf/libbpf/archive/refs/tags/v0.7.0.tar.gz

tar -zxvf v0.7.0.tar.gz
cd v0.7.0/
cd src
scl enable devtoolset-7 bash
source /opt/rh/devtoolset-7/enable
make && make install

5. VSCode远程开发

Windows 环境开发 linux 相关的项目非常不便,可以考虑使用 VSCode 连接 Linux 服务器进行远程开发。远程开发时代码、依赖库、编译环境等内容均部署在远程服务器上,VSCode 界面运行在本地客户端或者浏览器中。

VSCode 目前支持两种远程模式:

  • Remote SSH:客户端安装 VSCode 并通过 SSH 连接到 Linux 服务器。
  • Code Server:Linux 服务器上部署 Code Server 服务,以浏览器作为客户端进行开发。

使用 Remote SSH 连接到服务端时,VSCode-Server 会被安装在 ~/.vscode-server 目录中,如果 Linux 服务器无法直接安装插件,可以通过以下方式挂上代理进行安装:

1
2
3
4
5
6
7
8
9

export HTTPS_PROXY=<proxy-addr>
export HTTP_PROXY=<proxy-addr>

~/.vscode-server/<id>/bin/code-server --install-extension  ms-vscode.cpptools-extension-pack
~/.vscode-server/<id>/bin/code-server --install-extension  hediet.vscode-drawio
~/.vscode-server/<id>/bin/code-server --install-extension  yzhang.markdown-all-in-one
~/.vscode-server/<id>/bin/code-server --install-extension  alphabotsec.vscode-eclipse-keybindings

VSCode 的插件商店:https://marketplace.visualstudio.com/

6. 安装 BCC

参考:https://github.com/iovisor/bcc/blob/master/INSTALL.md#centos—source

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
scl enable devtoolset-7 bash
source /opt/rh/devtoolset-7/enable
yum install -y epel-release
ln -sf  /usr/local/lib/python3.6/site-packages site-packages
git clone https://github.com/iovisor/bcc.git && cd bcc
git checkout tags/v0.24.0 -b v0.24.0
git submodule update --init
yum install luajit luajit-devel ncurses-devel
mkdir build; cd build
cmake ..
make
make install

7. 编译BPFTool

1
2
3
cd linux-5.17.6/tools/bpf/bpftool
make && make install
./bpftool --version

常用命令

1
2
# 特征查看
bpftool feature 

99. 其他工具

在线源码阅读网站:https://elixir.bootlin.com/linux/v5.5-rc2/source