Я пытаюсь получить пространство имен монтирования текущей задачи в 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.
Я в недоумении относительно того, что Google мог изменить, чтобы вызвать такое поведение (я тестирую это на локальной виртуальной машине, поэтому единственное различие между этими двумя случаями заключается в ядре, с которого я загрузил виртуальную машинуи заголовки ядра, используемые для компиляции).
Кроме того, этот же код работал для ядра GCP 4.13 (uname -r
: 4.13.0-1008-gcp), поэтому кажется, что это недавнее изменение.
РЕДАКТИРОВАНИЕ:
Для ядра 4.15 GCP возвращаемые значения для вызовов к bpf_probe_read
следующие:
- 0
- 18446744073709551602
- 18446744073709551602
Как указано вВ комментариях ниже ненулевые возвращаемые значения соответствуют -EFAULT
.