[megoldva] kprobe vagy trace funkcio parameter feldolgozas

Fórumok

Sziasztok,

A segitsegeteket szeretnem kerni, napok uta bujom a netet es nem talalok ertelmes peldat, amikkel meg probalkoztam eddig minden zsakutcanak bizonyult. Es rohadt szereny C ismeretem sem segit :)

Szoval adott mondjuk egy tracepoint (ami jelenleg csak szamlalja a hivasokat):


struct write_info {
	/* The first 8 bytes is not allowed to read */
	unsigned long pad;

	unsigned long file;

    // And a few others...
};

SEC("tracepoint/ext4/ext4_da_write_begin")

int ext4_da_write_begin(struct write_info *info) {

u32 key = 0;

u64 initval = 1, *valp;


valp = bpf_map_lookup_elem(&counting_map, &key);

if (!valp) {

    bpf_map_update_elem(&counting_map, &key, &initval, BPF_ANY);

    return 0;

}

__sync_fetch_and_add(valp, 1);

return 0;

}

Valahogy az write_info->file-bol szeretnem kinyerni ezt: $mountpoint = ((struct file *)write_info->file)->f_path.mnt->mnt_root->d_name.name;

Nem untatnalak benneteket, mivel probalkoztam, de megjartam mar a Linux kernel header bugyrot rendesen :D

Elore is koszi a segitseget.

Hozzászólások

Szerkesztve: 2021. 09. 25., szo – 23:30

Ha jól látom itt egy eBPF trace kódot írsz. Ha ez egy nagyobb program egyik eleme, akkor bele kell ásni magad a eBPF hell-be, nincs mese: alapból kell legyen egy kernel és userspace része ennek a kódnak, amit itt látok az a kernel része csak a dolognak (persze a mapet kiolvashatod bpftool-al is és akkor megspórolod az userspace részt). Ami segíthet a kiolvasásban az a BPF_CORE_READ újabb kernelekben amik BTF-et támogatnak. Erről itt: https://nakryiko.com/posts/libbpf-bootstrap/#bpf-co-re
De ajánlom a teljes posztot, valamint ezt is: https://facebookmicrosites.github.io/bpf/blog/2020/02/19/bpf-portabilit…

Ha csak az érték számlálása szükséges, pl. csak debugoláshoz (nem derült ki a kérdésedből) akkor nem feltétlen kell elmerülnöd a dologban, csak keress rá bpftrace szkriptekben hogy olvassák ki ezeket az értékeket: https://github.com/iovisor/bpftrace

Nem tudom mikbe futottál bele, de sajnos működő és mára legacy-vá vált megoládsok együttsen vannak fenn a neten, sajnos elfejlődget egymás mellett a kernel support, a libbpf, a bpftrace meg ezek dokumentációja plusz a blogok. Lehet 2-3 éves blogposztok már nem igazak vagy max az akkor legújabb kernellel és toolinggal. 

Koszi. Igen eBPF-el jatszom. Igazabol van egy rakas pelda a neten, de azok primitivekkel dolgoznak, es azzal nincs is gondd. En egy olyan megoldast szeretnek, hogy monitorozzam a top 5 legtobbet irt filet, de ehhez ki kell nyerni a nevet a fajlnak. Csakhogy a struct file { egy eleg bonyolult struktura. Amive lprobalkoztam, hogy berantom a teljes kernel headerst, de ertelem szeruen az magaval rantja a fel vilagot, raadasul egy rakas #ifdef-et is tudni kene. Szoval nem paja. Elkezdtem felepiteni csak a file-t, ezzel egeszen sokaig jutottam, de a) eleg serulekeny igy a kod es b) meg igy is vegelethatatlan a fuggosegek szama, Es c) az a gyanum, hogy a __randomize_layout miatt nem is fog mukodni a vegen, de ez meg nem bizonyitott. Szoval ez sem palya.

Igen azon agyalok, hogy megnezem a bpftrace hogyan csinalja, mert ott pl meg van ez oldva. Ezt irtam a scriptemben es mukodott: $mountpoint = ((struct file *)arg1)->f_path.mnt->mnt_root->d_name.name;

Kivancsi lennek a varazslatra :)

Kar, hogy a prezentaciom elkeszitesere szant idokeret lejart, szoval azt fogom prezentalni, hogy rohadt nagy sz0pa's :D