OpenCloudOS / nettrace

nettrace is a eBPF-based tool to trace network packet and diagnose network problem.
Other
305 stars 76 forks source link

failed to load kprobe-based eBPF #89

Closed vincent5753 closed 6 months ago

vincent5753 commented 7 months ago

您好,我在 Kernel 版本為 5.4.0-144 的 Ubuntu 20.04 安裝 deb 後 執行 sudo nettrace -p icmp 時出現以下錯誤

sudo nettrace -p icmp
ERROR: failed to load kprobe-based eBPF
ERROR: failed to load kprobe-based bpf

並且這是 Kernel 的 CONFIG_DEBUG_INFO

cat /boot/config-5.4.0-144-generic | grep "CONFIG_DEBUG_INFO"
CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_INFO_REDUCED is not set
# CONFIG_DEBUG_INFO_SPLIT is not set
CONFIG_DEBUG_INFO_DWARF4=y
CONFIG_DEBUG_INFO_BTF=y
menglongdong commented 7 months ago

请使用命令sudo nettrace -p icmp --debug来查看错误日志,这个可能会提供一些帮助:

image
menglongdong commented 7 months ago

看起来像是libbpf的BUG,它在加载kprobe.rodata的时候会加上BPF_F_MMAPABLE标志,而这个标准这个版本的内核不支持:

bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_ARRAY, key_size=4, value_size=2, max_entries=1, map_flags=BPF_F_RDONLY_PROG|BPF_F_MMAPABLE, inner_map_fd=0, map_name="kprobe.rodata", map_ifindex=0, btf_fd=3, btf_key_type_id=0, btf_value_type_id=1614}, 72) = -1

使用clang14编译没有这个问题,看起来和编译器版本还相关。后续统一采用docker中的编译环境来进行编译发版。

感谢反馈~

menglongdong commented 6 months ago

最新的版本应该解决了这个问题