编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

BFP&XDP指南-工具链(bp工具箱)

wxchong 2024-10-27 15:41:33 开源技术 12 ℃ 0 评论

工具链

本节介绍 BPF 相关的用户态工具、内省设施(introspection facilities)和内核控制选项。 注意,围绕 BPF 的工具和基础设施还在快速发展当中,因此本文提供的内容可能只覆盖了其中一部分。

Fedora

Fedora 25+:

$ sudo dnf install -y git gcc ncurses-devel elfutils-libelf-devel bc \
  openssl-devel libcap-devel clang llvm graphviz bison flex glibc-static

如果你使用的是其他Fedora发行版,请试着使用yum来安装工具链

Ubuntu

Ubuntu 17.04+:

$ sudo apt-get install -y make gcc libssl-dev bc libelf-dev libcap-dev \
  clang gcc-multilib llvm libncurses5-dev git pkg-config libmnl-dev bison flex \
  graphviz

openSUSE Tumbleweed

openSUSE Tumbleweed 和 openSUSE Leap 15.0+:

$ sudo zypper install -y git gcc ncurses-devel libelf-devel bc libopenssl-devel \
libcap-devel clang llvm graphviz bison flex glibc-devel-static

编译 Linux 内核

新的 BPF 特性都是在内核 net-next 源码树中开发的。获取 net-netxt 源码树:

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git 

如果不关心提交历史,可以指定 --depth 1,这会下载当前最新的版本,节省大量时间和磁盘空间。

最新的 BPF fix 都在 net 源码树:

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git 

网络已经有大量关于如何编译 Linux 内核的教程,推荐 Kernel Newbies website

要运行 BPF,需要确保生成的 .config 文件包含下列配置(Cilium 也需要这些配置):

CONFIG_CGROUP_BPF=y
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_NET_SCH_INGRESS=m
CONFIG_NET_CLS_BPF=m
CONFIG_NET_CLS_ACT=y
CONFIG_BPF_JIT=y
CONFIG_LWTUNNEL_BPF=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_BPF_EVENTS=y
CONFIG_TEST_BPF=m

以上的某些配置项是无法通过 make menuconfig 修改的。例如, CONFIG_HAVE_EBPF_JIT 是根据当前架构是否支持 eBPF JIT 自动设置的。在本节中, CONFIG_HAVE_EBPF_JIT 是可选但强烈推荐的配置。没有 eBPF JIT 编译器的架构只能降级到内核解释器,执行效率会大大降低。

验证编译好的内核

用编译好的内核启动之后,进入 BPF 测试目录来验证 BPF 的功能:

$ cd tools/testing/selftests/bpf/ $ make $ sudo ./test_verifier 

正常的话,会打印如下类似的结果:

Summary: 847 PASSED, 0 SKIPPED, 0 FAILED 

注意:对于内核版本4.16+,BPF自测依赖于LLVM 6.0+,这是由于BPF函数调用不再需要内联。请参阅“BPF to BPF的调用”一节或内核补丁中的的信息(https://lwn.net/Articles/741773/)了解更多信息。如果不使用此新功能,并非每个BPF程序都依赖LLVM 6.0+。如果您的发行版没有提供LLVM 6.0+,您可以按照LLVM部分中的文档进行编译。


运行所有 BPF selftests:

$ sudo make run_tests 


编译 iproute2

与 net (fixes only) 和 net-next (new features) 内核树类似, iproute2 源码树有两个分支:master 和 net-next。

  • master 分支基于 net 内核源码树,
  • net-next 分支基于 net-next 源码树。这样,头文件的改动就会同步到 iproute2 源码树。

下载 iproute2 master 分支代码:

$ git clone https://git.kernel.org/pub/scm/network/iproute2/iproute2.git 


下载 net-next 分支代码:

$ git clone -b net-next https://git.kernel.org/pub/scm/network/iproute2/iproute2.git 

编译和安装:

$ cd iproute2/
$ ./configure --prefix=/usr
TC schedulers
 ATM    no

libc has setns: yes
SELinux support: yes
ELF support: yes
libmnl support: no
Berkeley DB: no

docs: latex: no
 WARNING: no docs can be built from LaTeX files
 sgml2html: no
 WARNING: no HTML docs can be built from SGML
$ make
[...]
$ sudo make install


确保 configure 脚本打印出了 ELF support: yes,这样 iproute2 才能处理 LLVM BPF 后端产生的 ELF 文件。

编译 bpftool

bpftool 对调试和检视(introspect)BPF 程序及 BPF map 非常有用。它是内核源码树的 一部分,代码位于 tools/bpf/bpftool/。

确保已克隆net或net-next内核树,如前所述。为了构建和安装bpftool,需要以下步骤:

$ cd <kernel-tree>/tools/bpf/bpftool/
$ make
Auto-detecting system features:
...                        libbfd: [ on  ]
...        disassembler-four-args: [ OFF ]

  CC       xlated_dumper.o
  CC       prog.o
  CC       common.o
  CC       cgroup.o
  CC       main.o
  CC       json_writer.o
  CC       cfg.o
  CC       map.o
  CC       jit_disasm.o
  CC       disasm.o
make[1]: Entering directory '/home/foo/trees/net/tools/lib/bpf'

Auto-detecting system features:
...                        libelf: [ on  ]
...                           bpf: [ on  ]

  CC       libbpf.o
  CC       bpf.o
  CC       nlattr.o
  LD       libbpf-in.o
  LINK     libbpf.a
make[1]: Leaving directory '/home/foo/trees/bpf/tools/lib/bpf'
  LINK     bpftool
$ sudo make install

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表