我试图在BPF program中检索当前任务的安装命名空间,如下所示:
task = (struct task_struct *)bpf_get_current_task();
bpf_probe_read(&nsproxy, sizeof(nsproxy), (void *)&task->nsproxy);
bpf_probe_read(&mnt_ns, sizeof(mnt_ns), (void *)&nsproxy->mnt_ns);
bpf_probe_read(&ns, sizeof(ns), (void *)&mnt_ns->ns);
mnt_ns_inum = ns.inum;
使用Ubuntu内核(uname -r
:4.15.0-13-generic)可以很好地工作,并且mnt_ns_inum
可以为主机的mount命名空间中的任务获取值4026531840,但可以使用GCP的相同代码运行内核(uname -r
:4.15.0-1019-gcp)始终将mnt_ns_inum
设置为0。
我对Google可能更改为导致此行为的内容不知所措(我正在本地VM上进行测试,因此这两种情况之间的唯一区别是启动了VM的内核和使用的内核标头进行编译。)
此外,该代码同样适用于GCP 4.13内核(uname -r
:4.13.0-1008-gcp),因此看来这是最近的更改。
编辑:
对于4.15 GCP内核,对bpf_probe_read
的调用的返回值如下:
如以下评论中所述,非零返回值对应于-EFAULT
。