正在学习 bpftrace,按照 bpftrace 使用入门 中的方法,用 snap 安装。
执行第一个命令的时候,遇到下面的错误:
$ bpftrace -e 'BEGIN { printf("hello world\n"); }'
Error creating printf map: Operation not permitted
Creation of the required BPF maps has failed.
Make sure you have all the required permissions and are not confined (e.g. like
snapcraft does). `dmesg` will likely have useful output for further troubleshooting
到网上搜索解决方法,找到的资料都说这是因为 kernel lockdown 特性,kernel localdown 是 kernel 新的安全机制,可以防止不安全的代码被注入 kernel 运行。
网上给出了解决方法大都是通过 sysrq 关闭 lockdown 特性:
sudo bash -c 'echo 1 > /proc/sys/kernel/sysrq'
sudo bash -c 'echo x > /proc/sysrq-trigger'
在 CentOS 7.6 上试了一下,没有用。
而且第二条命令,向 /proc/sysrq-trigger 写入 x
,完全是错误的!在 console 上(注意不是 ssh,是 console) 会打印出 sysrq-trigger 支持的字符,里面根本就没有 x
。
这个方法至少对 CentOS 无效的,我将 kernel 版本从 5.4 一路降低到 3.10,都是一样的结果。
执行失败的输出中有一个 like snapcraft does
字符,我总感觉和 snap 有关系。
运气比较好,在 bpftrace Install 中看到这样一句:
On Ubuntu 16.04 and later, bpftrace is also available as a snap package (https://snapcraft.io/bpftrace), however, the snap provides extremely limited file permissions so the –devmode option should be specified on installation in order avoid file access issues.
按到文档中的提示,执行下面的命令:
sudo snap install --devmode bpftrace
sudo snap connect bpftrace:system-trace
问题解决:
$ bpftrace -e 'BEGIN { printf("hello world\n"); }'
Attaching 1 probe...
hello world