eBPF:不允许操作
使用eBPF时,有几种可能的原因导致权限错误(
-EPERM由返回
bpf(),您可以通过观察到
strace -e bpf<command>)。但是没有那么多。通常,它们属于以下项目之一:
用户没有所需的功能 (
CAP_SYS_ADMIN
,,CAP_NET_ADMIN
…,通常取决于所使用程序的类型)。通常可以通过 运行root
具有所有必要功能的来解决。在您的情况下,您可以使用sudo
,因此可以满足要求。创建BPF对象(新映射或加载程序)将 超出用户可以在内核中锁定的内存量的限制 。这通常可以
root
通过ulimit -l<something_big>
在终端或setrlimit()
C程序中使用来解决。在您的情况下,您的程序非常小,并且您没有提到在系统上加载了很多BPF对象。还有更多的可能性,例如 尝试在“冻结”或只读 等的 地图上进行写操作 ,或 尝试对非
root
用户使用函数调用。这些通常用于更高级的用例,不应被像您这样简单的程序所破坏。
锁定,安全启动,EFI和(不幸的)反向端口的bpf()
限制
但是,您似乎遇到的问题可能与其他原因有关。“锁定”是一个安全模块,已合并到Linux
5.5内核中。它旨在防止用户修改正在运行的Linux映像。事实证明,有几个发行版决定将Lockdown移植到他们的内核中,有时他们选择了在最终版本合并到主线Linux之前的补丁。
例如,Ubuntu和Fedora有许多自定义补丁程序可以向后移植,以适应Disco / 19.04和Eoan /
19.10(后者为5.3,我不记得Disco的内核)中使用的内核。它包含一个修补程序,当锁定功能被激活时,该修补程序将完全禁用
bpf()系统调用,这意味着无法创建地图或加载BPF程序。另外,它们在激活安全启动时默认情况下启用了锁定,我认为这是使用EFI引导的计算机的默认设置。
另请参见此博客文章:检查锁定是否影响您的BPF使用的一种好方法是尝试加载最少的程序,或者运行
dmesg |grep Lockdown以查看是否显示类似以下内容:
Lockdown: systemd: BPF is restricted; see man kernel_lockdown.7
因此 ,例如 对于 Ubuntu 19.04和19.10, 必须 禁用Lockdown才能与eBPF一起使用
。可以通过
SysRq按键+
x的物理笔划来完成此操作(我尚未测试),但不能通过写操作来完成
/proc/sysrq-trigger。另外,您可以禁用安全启动(在BIOS中或通过
mokutil,在Internet上搜索相关选项,并且不要忘记检查安全隐患)。
需要注意的是Linux内核5.4或最新的有主线限制的
bpf(),不取消的系统调用,所以焦/
20.04和最新不会受到影响。 因此,升级到新内核可能是另一个解决方法
。我几天前提交了一份票证,要求将此更改回移植(而不是停用
bpf()),并且该工作正在进行中,因此,到新读者看到答案时,锁定对eBPF的影响可能会得到缓解(编辑:应该已在内核5.3.0-43的Ubuntu19.10上修复)。不确定其他发行版如何处理此问题。但是,它对于使用eBPF进行跟踪仍然具有重要意义。



