在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 |
kprobe | CONFIG_HAVE_KPROBES CONFIG_KPROBES CONFIG_KPROBE_EVENT |
kretprobe | CONFIG_KRETPROBES CONFIG_HAVE_KRETPROBES CONFIG_SHADOW_CALL_STACK CONFIG_ROP_PROTECTION_NONE |
uprobe | CONFIG_UPROBES CONFIG_UPROBE_EVENT CONFIG_BPF_EVENTS CONFIG_NET_ACT_POLICE CONFIG_NET_ACT_GACT |
network | CONFIG_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
git clone git@github.com:joelagnel/adeb.git
cd adeb
sudo ln -s $(pwd)/adeb /usr/bin/adeb
3.1.3 在android中编译安装根文件系统
可以通过如下方式编译安装:
adeb prepare --build --arch amd64 --bcc
这个方式需要从网络下载最小根文件系统,安装bcc,国内网络最好有梯子。
另外一种方式是使用一个下载好的根文件系统,去 ADEB RLEASE 下载一个编译好的文件系统 androdeb-fs.tgz ,然后
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源码的方式。
提示
欢迎评论、探讨,如果发现错误请指正。转载请注明出处! 探索者