반응형

본 게시글은 개인적으로 공부하기 위해 작성된 글입니다.

 

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

+ Recent posts