我正在尝试在BPF 程序中检索当前任务的挂载命名空间,如下所示:
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
工作,并为主机挂载命名空间中的任务获取值 4026531840,但使用 GCP 的内核(uname -r
:4.15.0-1019-gcp)运行相同的代码总是设置mnt_ns_inum
为 0。
我不知道谷歌可能会改变什么来导致这种行为(我正在本地虚拟机上测试这个,所以这两种情况之间的唯一区别是我启动虚拟机的内核和用于编译的内核头文件) .
此外,同样的代码适用于 GCP 4.13 内核(uname -r
:4.13.0-1008-gcp),所以这似乎是最近的变化。
编辑:
对于 4.15 GCP 内核,调用的返回值bpf_probe_read
如下:
- 0
- 18446744073709551602
- 18446744073709551602
正如下面评论中提到的,非零返回值对应于-EFAULT
.