lx200916 / kill_probe_eBPF

0 stars 0 forks source link

Comments on your eBPF blog post #1

Closed l2dy closed 1 month ago

l2dy commented 1 month ago

Aya库并不支持这个特性(猜测可能是Rust语法层面的问题).

Aya 是支持 BPF CO-RE 的,README 里有写 “Support for the BPF Type Format (BTF), which is transparently enabled when supported by the target kernel. This allows eBPF programs compiled against one kernel version to run on different kernel versions without the need to recompile.”

当你使用 aya-tool generate 生成 bindings 时就在用 BTF 了,它有一个 --btf 的参数默认指向 /sys/kernel/btf/vmlinux。

线上内核没有那么新(18.04 with 5.4.0)

可以使用 BTFhub 提供的 btf 文件,或者自行从 .ddeb 文件生成。 https://github.com/aquasecurity/btfhub/blob/main/docs/supported-distros.md#ubuntu

Bpf::load() 只会读取 /sys/kernel/btf/vmlinux,所以要自定义路径的话可以用 Loader 的 .btf() 指定。

https://docs.rs/aya/0.11.0/aya/struct.BpfLoader.html#example

use aya::{BpfLoader, Btf, Endianness};

let bpf = BpfLoader::new()
    // load the BTF data from a custom location
    .btf(Btf::parse_file("/custom_btf_file", Endianness::default()).ok().as_ref())
    .load_file("file.o")?;

P.S. 在你的博客提交评论的时候提示 Captcha verification failed.,没找到其他联系方式就发到 GitHub 这边了,如有打扰请见谅。

lx200916 commented 1 month ago

首先非常感谢阅读和反馈😂 没想到一篇一年之前的博客还能被人读到hhhh 其次没有用BTF可能是Aya库的版本问题(和我当时的眼界所限).印象中Aya在我编写这个Demo的时候就已经支持BTF,但是Aya-ebpf库(即编写eBPF程序所引用的库)似乎尚未支持CO-RE(IIRC). (我当时在20.04上编译的二进制在18.04上似乎并没有起效, 和这个Issue https://github.com/aya-rs/aya/issues/722 情况类似.) 很遗憾当时孤陋寡闻没有找到像BTFHub这种可以为旧系统内核提供支持的方案,所以最后选择了在目标机器上重新编译这种不太优雅的方案. 虽然我没有机会再去尝试运行时加载BTF的方案(当时的服务器和系统已经被替换掉了 =.=),但是本着方便其他可能读到博客的读者的想法,能否允许我把您的这篇留言(保留对您Github ID和这篇post的引用)append到博客正文中?

l2dy commented 1 month ago

首先非常感谢阅读和反馈😂 没想到一篇一年之前的博客还能被人读到hhhh 其次没有用BTF可能是Aya库的版本问题(和我当时的眼界所限).印象中Aya在我编写这个Demo的时候就已经支持BTF,但是Aya-ebpf库(即编写eBPF程序所引用的库)似乎尚未支持CO-RE(IIRC). (我当时在20.04上编译的二进制在18.04上似乎并没有起效, 和这个Issue情况类似.)

感谢回复。我是最近刚开始学习 BPF 和 Aya,对细节还不够了解。从你的描述以及链接的 issue 看,应该是 aya 库(用户空间侧)可以用来加载有 relocations 的 BPF 程序,但用 Rust 语言编写 BPF 程序的 aya-ebpf 库(内核侧)还不支持 relocations 相关的 bpf_core_read 或编译器的 __builtin_preserve_access_index 函数,所以如果无法避免 relocations 的话只能像这个测试用例一样用 C 写内核部分,一半 Rust 一半 C。

很遗憾当时孤陋寡闻没有找到像BTFHub这种可以为旧系统内核提供支持的方案,所以最后选择了在目标机器上重新编译这种不太优雅的方案. 虽然我没有机会再去尝试运行时加载BTF的方案(当时的服务器和系统已经被替换掉了 =.=),但是本着方便其他可能读到博客的读者的想法,能否允许我把您的这篇留言(保留对您Github ID和这篇post的引用)append到博客正文中?

当然可以,本来也是想在博客上用评论交流的。