본 게시글은 개인적으로 공부하기 위해 작성된 글입니다.
eBPF program은 tracing messages를 debugging 목적으로 작성할 수 있다./sys/kernel/debug/tracing/trace_pipe에서 읽을 수 있는 trace_pipe를 통해 일반적으로 수행되는 간단한 예이다.그러나 몇가지 제약사항들이 있따. 3 arg가 max이며, trace_pipe는 전역적으로 공유(동시출력되는 프로그램은 충돌 발생가능)되어야한다. 그렇기에 productive eBPF code를 사용하면 안된다고 한다.
===============================
productive code가 무엇을 의미하는 바인지는 잘 모르겠다..글의 맥락상 trace_pipe를 활용하면 안되는 것 같다.혹여 비슷한 뜻일까 하여 production code의 의미를 찾아보니 프로그램 구현을 담당하는 부분으로 사용자가 실제로 사용하는 code를 의미한다고 한다.
===============================BPF_PERF_OUTPUT() 인터페이스를 통해 수행해야 한다.본 실습에서는 실플함을 위해 trace_pipe를 통해 이를 수행하고 opensnoop에 자체 메시지를 추가한다.
기존의 opensnoop.bpf.c에 아래의 명령어가 line 119에 추가되어야한다.
bpf_printk("Hello world");
추가된 code의 snippet은 아래와 같다.
/* emit event */
bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU,
&event, sizeof(event));
bpf_printk("Hello world");
cleanup:
bpf_map_delete_elem(&start, &pid);
return 0;
}
이후에 다시 build하고 실행해준다.
make opensnoop
다른 터미널에서는 아래의 명령을 수행한다.
cat /sys/kernel/debug/tracing/trace_pipe
이제 make opensnoop했던 터미널에서 아래의 명령을 수행한다.
./opensnoop
이후에 editor로 아무 파일이나 접근해본다. editor에서 file을 load하는 것은 많은 이벤트들을 생성하고 이는 아래에서 확인가능하다.
다시 원래의 터미널에서 보면 출력의 결과로 엄청난 양의 파일들에 접근된 것을 볼 수 있다.
덧붙여 정의한 메시지 외에도 trace 출력문에는 다른 유용한 정보들(실행 파일 이름, 프로그램을 실행한 이벤트를 trigger한 process ID)이 포함되어 있다. 본 실습의 경우 PID: 1781로 실행되는 sandbox-agent이다.
이후에 다른 터미널에서 즉 cat명령 process가 여전히 수행되고 있는 터미널에서 tracing메시지가 출력되는 것을 확인할 수 있다.
'ebpf' 카테고리의 다른 글
Buzzer(eBPF fuzzer) build (0) | 2023.08.11 |
---|---|
eBPF references - Blackhat (0) | 2023.08.06 |
O’Reilly Report What is eBPF? - tutorial 3 (0) | 2023.07.21 |
O’Reilly Report What is eBPF? - tutorial 2 (0) | 2023.07.20 |
O’Reilly Report What is eBPF? - tutorial (0) | 2023.07.20 |