Ebpf на NFS, верификатор не принимает программуLinux

Ответить
Anonymous
 Ebpf на NFS, верификатор не принимает программу

Сообщение Anonymous »

Я новичок в ebpf, и мне нужна помощь.
Я пытаюсь воспроизвести поведение недавно созданного сценария bpftrace:

Код: Выделить всё

fentry:nfsd:nfsd4_write {
$dentry = args->cstate->current_fh.fh_dentry;
$ino = $dentry->d_inode->i_ino;

$uid = args->rqstp->rq_cred.cr_uid.val;

$p = args->cstate->current_fh.fh_export->ex_path;
$export_name = str($p.dentry->d_name.name);

printf("UID: %u, Write to Inode: %lu, Filename: %s/%s, Export: %s, Filepath: %s\n",
$uid,
$ino,
str($dentry->d_parent->d_name.name),
str($dentry->d_name.name),
$export_name,
@paths[$ino]
);
}
Сейчас я использую ebpf-go. Тем не менее, я продолжаю получать сообщение Загрузка объектов eBPF: поле WriteOps: программа write_ops: загрузка программы: разрешение отклонено: 0: (bf) r3 = r2: R2 !read_ok (3 строки опущены), что я интерпретирую как верификатор, не принимающий мою программу.
Ниже приведен скелет моего кода C, и я опишу странное поведение, которое наблюдаю.

Код: Выделить всё

#include "nfsd-btf.h"
#include "vmlinux.h"
#include 
#include 

SEC("fentry/nfsd4_write")
int write_ops(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
union nfsd4_op_u *u) {

....

}
Примечание: я генерирую vmlinux.h через файл дампа bpftool btf /sys/kernel/btf/vmlinux в формате c > vmlinux.h и генерирую nfsd-btf.h через файл дампа bpftool btf /sys/kernel/btf/nfsd в формате c > nfsd-btf.h
Вот что я наблюдаю:
  • Если я ничего не делаю с аргументами, то он загружается без проблем.
  • Если я пытаюсь получить доступ к rqstp, то он загружается без проблем, хотя при ближайшем рассмотрении я могу получить мусорные значения (?). Например, я могу сделать

    Код: Выделить всё

    bpf_printk("nfs write %u\n", BPF_CORE_READ(rqstp, rq_cred.cr_uid.val));
    
    но напечатанное значение не является моим фактическим uid (оно дает мне 3243852586, независимо от пользователя или даже root)
  • Если я попытаюсь получить доступ к cstate, я получаю отказ в разрешении: 0: (bf) r3 = r2: R2 !read_ok ошибка (или подобные ошибки). Например, я попробовал (весь остальной код закомментировал)

    Код: Выделить всё

    struct dentry *dentry_ptr = BPF_CORE_READ(cstate, current_fh.fh_dentry);
    

    Код: Выделить всё

    bpf_printk("%p\n", cstate);
    

    Код: Выделить всё

    if (!cstate) {
    bpf_printk("cstate NULL");
    return 0;
    } else {
    bpf_printk("cstate valid");
    }
    
И я не могу загрузить его в ядро ​​(я использую ebpf-go).
Я попробовал миллион вещей, но не могу заставить его работать. Буду очень признателен за любой вклад. Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/798 ... pt-program
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»