Skip to content
On this page

在Android中使用EBPF


软件版本硬件版本更新内容

1. 概述

BPF(Berkeley Packet Filter ),中文翻译为伯克利包过滤器,是类 Unix 系统上数据链路层的一种原始接口,提供原始链路层封包的收发。2014 年初,Alexei Starovoitov 实现了 eBPF(extended Berkeley Packet Filter),最早在linxu-3.15中引入。

2. 在android平台中使用方法

2.1 方法一:adeb

基本原理是基于一些linux的发行版的最小根文件系统来构建一个文件系统,里面包括了BCC工具链,然后adb push到android系统中,然后在chroot到构建的文件系统中,原理和docker是一样的,只是少了资源限制和隔离。

2.2 方法二:在android源码中编译使用

从android 9,Google官方就在逐步加入对ebfp的支持,在Soong编译系统中加入对bpf程序的编译支持,还提供了bpf的库等的支持。

方法一相对比较简单,本文从讲方法一,后期文章会详细解决方法二。

3. 通过adeb在android中使用bcc

BCC 是一个用于创建高效内核跟踪和操作程序的工具包,包括几个有用的工具和示例。它利用扩展的 BPF(Berkeley Packet Filters) BCC 使用的大部分内容都需要 Linux 4.1 及更高版本。 adeb(也称为androdeb)提供了一个强大的Linux shell环境,可以在现有的Android设备上运行流行和主流的Linux跟踪、编译、编辑等开发工具。 adeb 支持现代 Linux 系统上通常可用的所有命令。当然其中也包括BCC工具集。

3.1 在android上安装使用BCC

3.1.1 重新编译内核

重新编译内核,根据你的需要打如下的编译选项:

功能编译选项
基本CONFIG_DEBUG_FS CONFIG_BPF CONFIG_BPF_SYSCALL CONFIG_BPF_JIT CONFIG_HAVE_EBPF_JIT CONFIG_FTRACE_SYSCALLS CONFIG_FUNCTION_TRACER CONFIG_HAVE_DYNAMIC_FTRACE CONFIG_DYNAMIC_FTRACE
kprobeCONFIG_HAVE_KPROBES CONFIG_KPROBES CONFIG_KPROBE_EVENT
kretprobeCONFIG_KRETPROBES CONFIG_HAVE_KRETPROBES CONFIG_SHADOW_CALL_STACK CONFIG_ROP_PROTECTION_NONE
uprobeCONFIG_UPROBES CONFIG_UPROBE_EVENT CONFIG_BPF_EVENTS CONFIG_NET_ACT_POLICE CONFIG_NET_ACT_GACT
networkCONFIG_NET_CLS_BPF CONFIG_NET_ACT_BPF CONFIG_NET_SCH_SFQ CONFIG_NET_ACT_POLICE CONFIG_NET_ACT_GACT

还有一个必须的选项是CONFIG_IKHEADERS,这个选择必须是以CONFIG_IKHEADERS=m的方式编译,然后将生成的 .ko 文件 adb push到系统中 insmod。如果直接以 CONFIG_IKHEADERS=y 方式编译,会出现找不到头文件的错误,具体原因有待分析。

3.1.2 下载安装adeb

c
git clone git@github.com:joelagnel/adeb.git
cd adeb
sudo ln -s $(pwd)/adeb /usr/bin/adeb

3.1.3 在android中编译安装根文件系统

可以通过如下方式编译安装:

c
adeb prepare --build --arch amd64 --bcc

这个方式需要从网络下载最小根文件系统,安装bcc,国内网络最好有梯子。

另外一种方式是使用一个下载好的根文件系统,去 ADEB RLEASE 下载一个编译好的文件系统 androdeb-fs.tgz ,然后

c
adeb prepare --archive ./androdeb-fs.tgz

WARNING

这个有可能会失败,或者没有但是执行adeb shell提示need prepare等无法进入根文件系统,原因大概率是android中/data/分区空间不够,无法容纳整个最小根文件系统。

3.1.4 切换到最小根文件中

执行adeb shell,进行最小根文件系统,然后cd /usr/share/bcc/,就可能看到bcc的工具了。

4 小结

adeb是一种简单的bcc使用方式,但是目前作者已经停止更新了,未来最好的方式还是基于android源码的方式。


提示

欢迎评论、探讨,如果发现错误请指正。转载请注明出处! 探索者


Released under the MIT License.