1.eBPF 入门实践教程二十:使用 eBPF 进行 tc 流量控制
2.eBPF 入门开发实践教程零:eBPF 的内核内核基本概念、常见的源码开发工具
3.linux跟踪技术之ebpf
4.eBPF 实践教程: 通过 socket 或 syscall 追踪 HTTP 等七层协议
5.eBPF使用libbpf开发eBPF程序
6.神奇的Linux技术:BPF
eBPF 入门实践教程二十:使用 eBPF 进行 tc 流量控制
eBPF,即扩展的内核内核伯克利数据包过滤器,是源码Linux内核的强大网络和性能分析工具,允许开发者动态加载、内核内核更新并运行用户自定义代码,源码小额贷款免费源码无需重启内核或修改内核源代码。内核内核Linux的源码流量控制子系统(Traffic Control, tc)自内核早期存在,与iptables和netfilter并存,内核内核主要用于控制数据包的源码发送和接收速率与顺序。从Linux 4.1开始,内核内核tc添加了新挂载点,源码并支持将eBPF程序作为过滤器加载到这些挂载点上。内核内核
tc位于协议栈的源码链路层,其工作位置在sk_buff分配之后,内核内核晚于xdp。其核心功能通过队列结构实现,即qdisc(队列纪律),该结构对外提供数据包入队和出队的回调接口,内部隐藏具体的排队算法实现。通过filter和class,tc可以构建复杂的树形结构,用于数据包的分类和处理。
现有的tc为eBPF提供了直接动作模式,允许eBPF程序返回tc动作返回值,而不只是将数据包分类到特定的class。这意味着eBPF程序可以直接在特定的qdisc上运行,执行数据包分类和处理。
以下是一个简单的eBPF程序示例,用于捕获IPv4协议的数据包,并打印出数据包的总长度和Time-To-Live(TTL)字段的值。程序中使用了BPF库函数进行网络字节序和主机字节序之间的转换,以及注释提供了TC的附加点和选项信息。程序通过容器编译、ecc编译,并使用ecli运行。
总结,本文阐述了如何将eBPF过滤器应用于TC流量控制子系统,以实现链路层数据包的排队处理。通过eunomia-bpf提供的参数传递方案,可以将自定义的tc BPF程序以特定选项加载到目标网络设备上,并利用内核的sk_buff结构进行数据包过滤。欲深入了解eBPF知识与实践,可访问教程代码仓库github.com/eunomia-bpf/...获取更多示例和教程。微信小程序模版源码
eBPF 入门开发实践教程零:eBPF 的基本概念、常见的开发工具
eBPF是Linux内核中的一项革命性技术,它允许在沙盒中运行程序,从而安全且有效地扩展内核功能,无需修改内核源代码或加载内核模块。eBPF程序能在不同内核版本间移植,自动更新,避免工作负载中断和节点重启。它在现代数据中心、云原生环境、应用程序性能监控、安全执行等方面得到广泛应用。eBPF的未来正朝着内核的JavaScript可编程接口方向发展。
理解eBPF对Linux内核的可编程性影响,需要对Linux内核结构及它与应用和硬件交互有一个高层次的理解。Linux内核的目标是抽象硬件,并提供一致的API,允许应用程序运行和共享资源。为了实现这一目标,内核维护了多个子系统,每个子系统都允许一定程度的配置,以满足用户需求。改变内核行为的传统方法成本高且缺乏可移植性。而eBPF提供了一种新的选择,允许用户定义的应用程序在内核态和用户态同时执行,而不需要修改内核源代码或加载内核模块,同时保证不同内核版本之间的行为一致性、安全性和可移植性。
为了在内核中运行沙盒程序,eBPF需要提供一套与系统调用类似的应用程序API。通过eBPF与用户态通信的机制,Wasm虚拟机和用户态应用可以访问这套“系统调用”,实现对系统功能的可编程扩展,包括网络、文件系统等层次的高效可编程IO处理。
目前的eBPF仍处于早期阶段,但已提供大量内核接口和用户态交互能力,如访问系统调用、网络操作数据包和套接字级别的数据、添加网络包处理解决方案等。eBPF还允许向用户空间任意进程的任意地址写入数据、修改内核函数返回值等高级操作,同时对字节码进行严格的免费手游联运平台源码安全检查,确保操作安全。
对于学习eBPF开发,推荐从eBPF入门教程开始,了解如何编写eBPF程序。可以使用多种工具和库,如BCC、eunomia-bpf等,这些工具帮助简化eBPF程序的开发、编译、加载和管理过程。学习资源包括官方项目库、教程代码仓库等,提供详细教程和示例代码。
总结,eBPF技术为内核可编程性带来了革命性的变化,通过提供一套API和工具链,使得开发者能够安全地扩展内核功能,而无需修改内核源代码。随着eBPF的不断发展,未来将提供更多功能和更友好的开发体验,帮助开发者在现代数据中心、云原生环境等场景中实现高效、安全的系统级编程。
linux跟踪技术之ebpf
eBPF,一项革命性的技术,源于Linux内核,允许在特权上下文内运行沙盒程序,安全地扩展内核功能。借助eBPF,开发者能追踪内核函数的参数、返回值,实现内核钩子效果;还能在网络封包到达内核协议栈之前进行处理,用于流量控制和隐蔽通信。
要发挥eBPF的强大能力,通常需要与Linux内核自带的追踪功能相结合。这里有三种常用的工具可以帮助使用eBPF:BCC、libbpf、以及bpftrace。
BCC工具包提供了用于创建高效内核追踪和操作程序的功能,包括kprobe和kretprobe,这些工具能跟踪系统调用的进入和退出事件。安装BCC时,通过克隆仓库、文华程序化交易源码更新子模块、安装依赖,并编译源码,即可在Python环境中使用BCC模块。例如,execsnoop工具可以跟踪execv系统调用,输出进程名、参数、PID、PPID以及返回代码。
利用BCC跟踪用户函数,则可使用uprobe技术跟踪glibc malloc函数,并统计内存分配总量。
libbpf是Linux内核源码树中的eBPF开发包,同时在GitHub上也有独立代码仓库。libbpf-bootstrap项目提供了使用libbpf和BPF CO-RE进行BPF应用程序开发的脚手架。通过克隆仓库、同步子模块,并在example/c目录下编译示例工具,开发者可以轻松实现eBPF追踪功能。
例如,bootstrap程序追踪exec和exit系统调用,输出运行程序的信息,而minimal程序则追踪所有的write系统调用,并打印出调用write的进程PID。通过分析minimal源码,我们可以看到它主要包含两个C文件,其中minimal.c负责生成ebpf程序,minimal.bpf.c则为加载到内核中的ebpf代码。此ebpf程序通过bpf_printk输出内容至debugFS中的trace_pipe,允许用户通过命令查看追踪信息。
bpftrace则提供了一种类似awk的脚本语言,通过编写脚本配合追踪点,实现强大的追踪功能。安装bpftrace并使用命令行参数,如追踪openat系统调用、计算系统调用计数或每秒发生的系统调用数量,以及将bpftrace程序作为脚本文件运行,均可实现灵活的追踪需求。
总之,eBPF技术提供了强大的内核扩展能力,通过结合BCC、libbpf、牛贝淘宝客5.0源码bpftrace等工具,开发者能够实现复杂且高效的追踪功能,满足各种应用场景需求。
eBPF 实践教程: 通过 socket 或 syscall 追踪 HTTP 等七层协议
在现代技术环境中,可观测性对确保微服务和云原生应用的健康、性能和安全至关重要。特别是随着服务组件分布于多容器和服务器,传统的监控手段难以全面掌握系统行为。因此,追踪HTTP、gRPC、MQTT等七层协议变得至关重要,因为它们揭示了应用间的交互细节。
eBPF技术在此时崭露头角,它允许开发者和运维人员深入内核层面,实时分析系统行为,而无需在应用代码中插入额外的监控代码,实现了无侵入式的可观测性。通过本实践教程,我们将探讨如何使用eBPF的socket filter和syscall追踪技术,有效监控七层协议,尤其是在微服务架构中。
eBPF的socket filter是内核级的数据包过滤工具,适合直接操作套接字数据,而syscall追踪则关注系统调用,提供更全面的交互上下文。这两种方法各有优势,socket filter更直接,而syscall追踪则揭示更广泛的应用行为。
通过eBPF的socket filter,我们可以编写内核代码来捕获HTTP流量,示例代码展示了如何解析以太网、IP和TCP头部,以识别HTTP请求。尽管存在跨数据包URL处理的挑战,但通过缓存和组装逻辑,可以解决这个问题。
用户态代码则通过创建raw socket并附加eBPF程序来集成这些功能,例如创建web服务器并使用curl发送请求,eBPF程序会捕获并打印出HTTP请求内容。
eBPF的syscall追踪则涉及hook系统调用如accept和read,以获取更全面的请求追踪。完整的代码示例和源码可以在GitHub仓库中获取。
总结来说,本文详细介绍了如何利用eBPF技术来追踪七层协议,包括其在微服务环境中的应用和实践中可能遇到的问题。通过学习和实践,开发者可以提升对网络流量和系统行为的理解,从而优化应用程序性能和安全。访问我们的教程代码或网站获取更多资源。
eBPF使用libbpf开发eBPF程序
libbpf是内核提供的功能库,学习它有助于理解如bcc/bpftrace等工具。eBPF程序的运行流程包括生成字节码、加载字节码到内核中,并将其attach到特定事件或函数。此外,创建map实现内核态与用户态间的数据交互。当事件或TP点触发时,调用attach的eBPF字节码执行其功能。
本文示例为统计一段时间内syscall调用次数,包含如下项目文件结构:
在字节码生成阶段,有多种方式实现。本文采用clang进行编译,创建eBPF程序。在编译过程中,需注意几个关键点:内核源码的使用、单独构建的libbpf库和bpftool,以及使用-g -O2选项以避免加载时的错误。
使用libbpf库加载eBPF程序的步骤如下:需要内核头文件支持,从内核源码中安装至当前目录。整个工程目录应包含libbpf库依赖的libelf和libz库,因此需要进行交叉编译相关库。编译用户态eBPF加载程序时,需链接之前编译好的依赖库。在内核开启相关功能的情况下,加载程序后,即可启动虚拟机并运行,以开始调试内核bpf模块功能。
神奇的Linux技术:BPF
面对编程中的性能瓶颈和系统优化难题,通常受限于对内核的深入理解。然而,有一种神奇的技术BPF(Berkeley Packet Filter和eBPF),为了解决这些问题提供了新的视角。BPF最初作为性能极佳的包过滤器,因工作在内核层面而速度飞快。Alexei Starovoitov在年的贡献使其演变成通用执行引擎,BPF也因此得以广泛应用。
BPF的核心功能是当内核或应用遇到特定事件时,能在不改动内核源码的情况下执行预定义的代码。它像一个内核层面的监听器,能监控系统调用、内核函数、用户函数和网络活动等,具有强大的诊断、优化、安全和监控能力。例如,它能实时检测故障、优化网络性能、拦截非法连接,并通过透视内核分析性能瓶颈。
BPF的工作原理是用户编写BPF指令,由内核解释器在内核态运行,避免数据在用户态和内核态间频繁切换,提高了效率。随着Linux 3.0的JIT即时编译器加入,执行速度进一步提升。通过BPF,我们可以观察和优化TCP网络,甚至获得代码的“上帝视野”,实现深入的系统洞察。
BPF与内核模块相比,有安全性和功能限制的优势,如有限的栈空间和调用限制。开发者通常利用C/C++和BPF工具,如BCC(BPF Compiler Collection)和bpftrace,来编写和加载BPF程序。对于初学者,BCC提供了高级编程环境,而bpftrace则适合编写简单脚本。
在使用BPF时,可能遇到的问题如磁盘空间不足、编译错误等,可以通过调整配置或安装相关库来解决。例如,对于找不到BTF文件的问题,可能需要更新内核配置或安装额外的依赖。通过BPF的学习和实践,程序员可以更好地理解并优化系统的运行,提升代码的性能和安全性。
sysctl 参数防篡改 - 基于 ebpf 的实现 [一]
系统调用参数防篡改 - 基于ebpf的实现
本文基于内核代码版本5..0进行讨论。
ebpf能够修改某些函数的返回值,但仅限于允许错误注入的函数,这限制了其应用范围。系统tap能够作用于几乎任何函数,但由于内核API的不稳定,它在不同内核上可能无法运行。
ebpf的优势在于其与内核交互的API保持稳定,特别是用于“系统调用参数防篡改”的一组helper函数。在阅读代码实现时,发现中段插入了一个“BPF_CGROUP_RUN_PROG_SYSCTL”。
这一功能源于v5.2-rc1的commit,旨在限制容器对sysctl的错误写入,要求内核版本不低于5.2,且配置项包含“CONFIG_CGROUP_BPF”。
配套的4个helper函数记录在内核文档“Documentation/bpf/prog_cgroup_sysctl.rst”中,用于读取sysctl参数名称和值、在参数修改时获取写入的值以及覆盖准备写入的值。这些helper与内核原生路径中的过滤函数交互。
使用示例
通过Linux内核源码中的“tools/testing/selftests/bpf”目录下的测试用例可以学习ebpf的使用。在源码根目录下执行make命令编译。
针对sysctl部分,测试用例主体为“test_sysctl.c”,用于将ebpf程序加载至内核,并在对应的点位上附加。ebpf程序可以是直接以ebpf汇编语法写的,也可以是C文件编译成.o二进制文件的形式。
当判断为write操作时,返回0,内核源码中决定sysctl参数读写结果的点位返回“-EPERM”,使得修改不成功。
ebpf prog源文件中的“SEC”宏定义用于指示编译器将函数/变量放在特定的section中,便于用户态loader查找和解析。
为了实现加载和附加程序,使用了“sysctl_write_deny_prog.o”作为附加程序,类型为“BPF_CGROUP_SYSCTL”,方式为“BPF_F_ALLOW_OVERRIDE”。借助“fd”这样的整形数字,用户态程序可以深入内核态获取对应的结构体实例。
最终通过libbpf封装系统调用接口,用户态程序可以通过“bpf”系统调用入口与内核交互。使用strace工具可以追踪这一过程。
了解ebpf helper函数的使用,可以借助现成的工具进行学习,更多详情请参考后续文章。
eBPF on Android之编译内核与打补丁(解决触摸和WIFI失效问题)
本文为看雪论坛优秀文章 看雪论坛作者ID:seeeseee一、前言 在之前尝试ptach内核时,配置CONFIG_KRETPROBES后遇到了触摸和WIFI失效的问题。后经missking指导,发现修改内核编译选项的操作不正确。正确的步骤如下:cd private/msm-google
make ARCH=arm floral_defconfig
make ARCH=arm menuconfig
make ARCH=arm savedefconfig
cp defconfig arch/arm/configs/floral_defconfig
rm .config
但即便如此,编译出的内核仍然导致触摸和WIFI失效。后续参考多个帖子,解决了触摸问题,但WIFI问题未能解决。 刷自编译内核导致的触摸屏失灵问题、正确的自编译内核操作及解决触摸屏问题的步骤、内核编译问题、单独编译内核的方法、解决触摸屏失灵问题的实践篇、内核编译内文以及相关补丁操作等,均被提及。在一系列操作后,触摸功能得以修复,但WIFI问题仍然悬而未决。 经过进一步探索,发现单独编译内核且包含boot.img的正确方式,这与之前的操作有所区别。对于BUILD_BOOT_IMG的设定和其中的GKI_RAMDISK_PREBUILT_BINARY、VENDOR_RAMDISK_BINARY的理解,以及boot.img解包和生成所需文件的过程,都有了更深入的了解。 通过分析build/build.sh脚本,明确当BOOT_IMAGE_HEADER_VERSION为3时,需指定GKI_RAMDISK_PREBUILT_BINARY和KERNEL_VENDOR_CMDLINE。解包boot.img后,根据文件信息调整BUILD_BOOT_IMG、BASE_ADDRESS、PAGE_SIZE、KERNEL_CMDLINE和KERNEL_BINARY的值,确保正确生成initramfs.cpio和VENDOR_RAMDISK_BINARY。补丁添加bpf_probe_read_user功能,确保内核能正常读取用户空间数据。 进行内核编译配置调整,包括修改内核编译配置选项,确保触摸屏和WIFI功能正常。操作步骤包括进入内核源码目录、生成floral_defconfig、打开内核编译配置界面、保存并退出配置、覆盖floral_defconfig文件、删除.config文件等。最终,通过正确编译命令生成可正常使用的boot.img文件,解决触摸屏和WIFI失效问题。二、环境 搭建环境时,请根据需要添加代理连接。首先,根据官方指南安装所需库和软件,并创建工作目录。选择与手机内核版本对应的分支(如Pixel 4XL对应的android-msm-coral-4.-android),同步内核源代码并使用官方说明操作。注意,如果没有设置编译工具,可手动同步代码或使用官方提供的工具。三、步骤 操作步骤包括:根据官方指南准备环境并同步代码
创建工作目录,存放后续操作文件
选择与手机内核版本对应的分支,同步代码并检查是否已包含编译工具
进入private/msm-google文件夹,切换到与手机内核版本一致的commit
修改编译脚本和准备文件,包括脚本分析、文件准备及补丁操作
编译命令执行
添加bpf_probe_read_user补丁,确保内核读取用户空间数据功能
修改内核编译配置并编译
四、总结
通过解决触摸屏失灵和WIFI失效问题,了解到单独编译内核并生成boot.img的正确方法。在内核编译过程中,明确相关选项和参数的重要性,确保生成的内核能正常运行触摸和WIFI功能。通过实践操作,内核可实现正常启动、触摸和WIFI功能正常,同时支持eBPF设定。