Linux BPF技术深度解析(3):jetson agx orin使用BPF(第一部分)

部署运行你感兴趣的模型镜像

一、目的

在jetson agx orin上构建内核编译环境(便于实时修改和测试),同时以源码形式编译安装bcc-tools工具,使用bcc-tools工具中BPF应用实例调试orin。

二、硬件配置

三、agx orin的BPF配置

3.1 默认的BPF配置

配置项是否启用功能说明
CONFIG_CGROUP_BPF未启用(n)控制是否允许在 cgroup(控制组)上附加 BPF 程序,用于对 cgroup 内的进程进行资源管控、行为监控等。未启用则无法通过 BPF 扩展 cgroup 功能。
CONFIG_BPF启用(y)启用 BPF 基础设施的核心支持,是所有 BPF 功能的基础。该选项开启后,内核才能识别和处理 BPF 字节码。
CONFIG_BPF_SYSCALL启用(y)启用 BPF 系统调用(bpf()),允许用户空间程序通过系统调用与内核交互(如加载、验证、附着 BPF 程序,操作 BPF 映射等),是用户态使用 BPF 功能的核心入口。
CONFIG_ARCH_WANT_DEFAULT_BPF_JIT启用(y)表示当前架构(如 ARM、x86 等)倾向于默认启用 BPF JIT 编译器(将 BPF 字节码编译为机器码以加速执行),是架构层面的偏好设置。
CONFIG_BPF_JIT_ALWAYS_ON未启用(n)控制是否强制始终启用 BPF JIT 编译器。未启用时,JIT 可能根据系统配置或场景动态开关(而非强制启用)。
CONFIG_BPF_JIT_DEFAULT_ON启用(y)设置系统默认启用 BPF JIT 编译器,启动时自动使用 JIT 加速 BPF 程序执行(而非解释执行),提升 BPF 程序运行效率。
CONFIG_BPF_UNPRIV_DEFAULT_OFF未启用(n)控制非特权用户(无 CAP_BPF 权限)是否默认允许使用 BPF 功能。未启用时,非特权用户可能默认拥有部分 BPF 使用权限(受内核其他安全策略限制)。
CONFIG_BPF_PRELOAD未启用(n)启用 BPF 程序预加载功能,允许系统启动时自动加载预设的 BPF 程序(如基础监控、安全策略程序)。未启用则无预加载机制。
CONFIG_NETFILTER_XT_MATCH_BPF未启用(n)启用 Netfilter 框架中基于 BPF 的匹配模块,允许在防火墙规则(如 iptables)中使用 BPF 程序作为匹配条件(如过滤特定特征的数据包)。未启用则无法在 Netfilter 中用 BPF 做匹配。
CONFIG_BPFILTER未启用(n)启用 BPFILTER 框架,这是一个基于 BPF 的网络过滤框架,可替代部分传统 Netfilter 功能(如数据包过滤、NAT 等)。未启用则不使用该框架。
CONFIG_NET_CLS_BPF未启用(n)启用流量控制(TC)子系统中基于 BPF 的分类器,允许用 BPF 程序对网络流量进行分类(如按端口、协议、应用标识流量)。未启用则 TC 无法使用 BPF 分类逻辑。
CONFIG_NET_ACT_BPF未启用(n)启用流量控制(TC)子系统中基于 BPF 的动作器,允许用 BPF 程序定义对网络流量的处理动作(如限速、转发、丢弃)。未启用则 TC 无法使用 BPF 动作逻辑。
CONFIG_BPF_JIT启用(y)明确启用 BPF JIT 编译器,将 BPF 字节码编译为机器码,大幅提升 BPF 程序的执行效率(相比解释执行),是高性能 BPF 应用的基础。
CONFIG_HAVE_EBPF_JIT启用(y)标识当前架构(如 Jetson 的 ARM 架构)支持 eBPF JIT 编译器,是架构层面对 JIT 功能的硬件 / 指令集支持声明,为CONFIG_BPF_JIT提供基础。

3.2 配置启用BPF

打开如下两个配置

# CONFIG_NET_CLS_BPF is not set
# CONFIG_NET_ACT_BPF is not set

3.2.1 方式1

3.2.2 方式2

vim .config

将“# CONFIG_NET_ACT_BPF is not set”改为“CONFIG_NET_ACT_BPF=y”

将“# CONFIG_NET_CLS_BPF is not set”改为“CONFIG_NET_CLS_BPF=y”

四、目标机编译内核

sudo apt-get update

sudo apt-get install build-essential bc git libncurses5-dev bison flex libssl-dev

wget https://developer.nvidia.com/downloads/embedded/l4t/r35_release_v4.1/sources/public_sources.tbz2

tar  -xvf  public_sources.tbz2

cd Linux_for_Tegra/source/public/

tar  -xvf  kernel_src.tbz2

cd  kernel

zcat /proc/config.gz > .config

cp .config kernel-5.10/

cd kernel-5.10

make menuconfig

cp .config .config.modified

export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-gnu-

make -j$(nproc) Image make -j$(nproc) modules make -j$(nproc) dtbs

make modules_install   #cp -r ../kernel_modules/lib/modules/$(uname -r)/kernel /lib/modules/$(uname -r)/

cp arch/arm64/boot/Image /boot/Image

cp arch/arm64/boot/dts/*.dtb /boot/

reboot

验证BPF部分选项是否开启成功:

五、源码形式安装bcc-tools

BCC安装教程:

https://github.com/iovisor/bcc/blob/master/INSTALL.md

默认使用“sudo apt-get install bpfcc-tools linux-headers-$(uname -r)”命令安装,但是没有linux-headers-5.10.120对应版本,需要使用源码安装。

第一步:安装依赖项

pip3 install --upgrade setuptools

sudo apt install -y zip bison build-essential cmake flex git libedit-dev \
  libllvm12 llvm-12-dev libclang-12-dev python zlib1g-dev libelf-dev libfl-dev python3-setuptools \
  liblzma-dev arping netperf iperf

第二步:下载bcc-tools源码并编译

git clone https://github.com/iovisor/bcc.git
mkdir bcc/build; cd bcc/build

root@tegra-ubuntu:/nvidia/bcc/build# cmake ..
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
Submodule 'libbpf-tools/blazesym' (https://github.com/libbpf/blazesym) registered for path 'libbpf-tools/blazesym'
Cloning into '/nvidia/bcc/libbpf-tools/blazesym'...
Submodule path 'libbpf-tools/blazesym': checked out 'd954f73867527dc75025802160c759d0b6a0641f'
Submodule 'libbpf-tools/bpftool' (https://github.com/libbpf/bpftool) registered for path 'libbpf-tools/bpftool'
Submodule 'src/cc/libbpf' (https://github.com/libbpf/libbpf.git) registered for path 'src/cc/libbpf'
Cloning into '/nvidia/bcc/libbpf-tools/bpftool'...
Cloning into '/nvidia/bcc/src/cc/libbpf'...
Submodule path 'libbpf-tools/bpftool': checked out '6eb3e20583da834da18ea3011dcefd08b3493f8d'
Submodule 'libbpf' (https://github.com/libbpf/libbpf.git) registered for path 'libbpf-tools/bpftool/libbpf'
Cloning into '/nvidia/bcc/libbpf-tools/bpftool/libbpf'...
Submodule path 'libbpf-tools/bpftool/libbpf': checked out '7984737fbf3b2a14a86321387bb62abb16cfc4ed'
Submodule path 'src/cc/libbpf': checked out '02bdeb7a2c2e7cb2c9cecb125527a9c5a6bbf139'
-- Latest recognized Git tag is v0.35.0
-- Git HEAD is f55a2f67e05d7cea44f3d850000fd6123caeeda0
-- Revision is 0.35.0+f55a2f67 (major 0, minor 35, patch 0)
-- Performing Test HAVE_NO_PIE_FLAG
-- Performing Test HAVE_NO_PIE_FLAG - Success
-- Performing Test HAVE_REALLOCARRAY_SUPPORT
-- Performing Test HAVE_REALLOCARRAY_SUPPORT - Success
-- Kernel release: 5.10.120
-- Kernel headers: KERNELHEADERS_DIR-NOTFOUND
-- Found ZLIB: /usr/lib/aarch64-linux-gnu/libz.so (found version "1.2.11") 
-- Found LLVM: /usr/lib/llvm-12/include 12.0.0 (Use LLVM_ROOT envronment variable for another version of LLVM)
-- Found BISON: /usr/bin/bison (found version "3.5.1") 
-- Found FLEX: /usr/bin/flex (found version "2.6.4") 
-- Found LibElf: /usr/lib/aarch64-linux-gnu/libelf.so  
-- Performing Test ELF_GETSHDRSTRNDX
-- Performing Test ELF_GETSHDRSTRNDX - Success
-- Could NOT find LibDebuginfod (missing: LIBDEBUGINFOD_LIBRARIES LIBDEBUGINFOD_INCLUDE_DIRS) 
-- Found LibLzma: /usr/lib/aarch64-linux-gnu/liblzma.so  
-- Using static-libstdc++
-- Could NOT find LuaJIT (missing: LUAJIT_LIBRARIES LUAJIT_INCLUDE_DIR) 
-- Configuring done
-- Generating done
-- Build files have been written to: /nvidia/bcc/build
 

root@tegra-ubuntu:/nvidia/bcc/build# make

root@tegra-ubuntu:/nvidia/bcc/build# make install

root@tegra-ubuntu:/nvidia/bcc/build# cmake -DPYTHON_CMD=python3 ..
-- Latest recognized Git tag is v0.35.0
-- Git HEAD is f55a2f67e05d7cea44f3d850000fd6123caeeda0
-- Revision is 0.35.0+f55a2f67 (major 0, minor 35, patch 0)
-- Kernel release: 5.10.120
-- Kernel headers: KERNELHEADERS_DIR-NOTFOUND
-- Found LLVM: /usr/lib/llvm-12/include 12.0.0 (Use LLVM_ROOT envronment variable for another version of LLVM)
-- Could NOT find LibDebuginfod (missing: LIBDEBUGINFOD_LIBRARIES LIBDEBUGINFOD_INCLUDE_DIRS) 
-- Using static-libstdc++
-- Could NOT find LuaJIT (missing: LUAJIT_LIBRARIES LUAJIT_INCLUDE_DIR) 
-- Configuring done
-- Generating done
-- Build files have been written to: /nvidia/bcc/build

root@tegra-ubuntu:/nvidia/bcc/build# pushd src/python/
/nvidia/bcc/build/src/python /nvidia/bcc/build
root@tegra-ubuntu:/nvidia/bcc/build/src/python# make
Built target bcc_py_python3
root@tegra-ubuntu:/nvidia/bcc/build/src/python# make install

Built target bcc_py_python3
Install the project...
-- Install configuration: "Release"
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
   or: setup.py --help [cmd1 cmd2 ...]
   or: setup.py --help-commands
   or: setup.py cmd --help

error: option --install-layout not recognized
 

上述报错解决:

执行:export SETUPTOOLS_USE_DISTUTILS=stdlib

说明:

  • distutils 是 Python 标准库中用于构建、打包和安装 Python 模块的基础工具;
  • 较新的 setuptools 版本(约 49.0.0+ 之后)默认使用自己内置的 distutils 替代方案(而非标准库中的版本),以解决旧版 distutils 的一些缺陷;
  • 但在某些场景下(例如安装旧版 Python 包、或依赖 distutils 标准库行为的脚本),setuptools 自带的 distutils 可能与目标包存在兼容性问题,导致安装报错(如语法错误、功能缺失)。

通过 export SETUPTOOLS_USE_DISTUTILS=stdlib,可以强制 setuptools 回退到使用 Python 标准库原生的 distutils,从而规避因 setuptools 内置版本导致的兼容性问题。

root@tegra-ubuntu:/nvidia/bcc/build/src/python# make install

第三步:测试安装情况

# python3
Python 3.8.10 (default, Mar 18 2025, 20:04:55) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from bcc import BPF
>>>

六、bcc-tools的案例

/usr/share/bcc/examples/或/nvidia/bcc/examples/

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

坏一点

您的鼓励是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值