전공영역 공부 기록

공식문서로 이해하는 eBPF 입문

악분 2025. 12. 23. 22:12
반응형

안녕하세요. 악분입니다!

 

이 글은 eBPF 공식문서 중 "What is eBPF" 문서를 간단히 이해하는 것이 목표입니다.

 

What is eBPF? An Introduction and Deep Dive into the eBPF Technology

A detailed step by step introduction to the eBPF technology with lots of references for further reading.

ebpf.io

 

 

eBPF 실습을 원하시는 분은 아래 글을 읽어보시는 것을 추천드립니다.

 

From Zero to Your First eBPF Program | iximiuz Labs

In this first tutorial, you’ll run a pre-coded eBPF program and see it in action without writing any code yourself. We’ll walk through the important parts of the program so you understand how eBPF hooks and runs in the kernel. The goal is to get famili

labs.iximiuz.com

 

 

eBPF란?

제가 이해한 eBPF는 "kernel 소스 코드를 바꾸거나 kernel 모듈을 로드하지 않고도, 개발자가 작성한 코드를 안전하게 kernel 공간에서 실행"합니다.

 

말이 어려운데 핵심 키워드는 2개입니다.

  1. kernel 소스 코드를 바꾸거나 kernel 모듈을 로드하지 않고도
  2. 개발자가 작성한 코드를 안전하게 kernel 공간에서 실행

 

kernel 소스 코드 수정 없이 실행한다는 의미

일반 프로그램은 user space에서 실행됩니다. User space 프로그램은 하드웨어나 kernel 리소스에 직접 접근할 수 없습니다. 그래서 syscall을 통해 kernel 함수를 호출해야 합니다.

 

예를 들어, stdout으로 문자열을 출력하려면 write kernel 함수를 syscall로 호출해야 합니다.

 

반면 eBPF 코드는 kernel space에서 직접 실행되기 때문에 kernel 함수를 직접 호출할 수 있습니다. 위 예시의 bpf_printk는 user space의 printf와 유사한 함수입니다.

 

안전하게 실행한다는 의미

eBPF 코드는 kernel 공간에 실행되기 전에 검증(Verification) 과정을 거칩니다. eBPF는 헬퍼 함수 등 허락된 kernel 함수만 호출할 수 있도록 제한됩니다. 검증과정은 아래 상황 등을 막습니다.

  • NULL pointer exception 등 시스템 크래시를 유발할 수 있는 코드
  • 무한 루프 등 종료되지 않는 코드
  • 허락되지 않은 kernel 함수 호출

 

eBPF의 특징

1. 동작 시점: Event hook 방식

eBPF는 kernel의 특정 event가 발생할 때만 실행됩니다. 일반 프로그램처럼 독립적으로 실행되는 것이 아니라, webhook처럼 event 발생 시 트리거되는 방식입니다.

 

eBPF 공식문서나 아키텍처 다이어그램을 보면 eBPF가 여러 과정 중간에 실행되는 것으로 표현되는데, 이는 event hook 방식이기 때문입니다.

출처: https://ebpf.io/ko-kr/what-is-ebpf/

 

Event hook 설정은 user space에서 이루어집니다. 아래 예제는 execve syscall event 발생 시 eBPF를 실행하도록 hook을 설정한 코드입니다.

출처: https://github.com/dorkamotorka/ebpf-hello-world/blob/main/lab1/main.go

 

2. eBPF bytecode와 JIT compiler

eBPF 코드의 빌드 결과는 bytecode입니다. bytecode는 JVM과 같은 특정 머신에서 해석 가능한 중간 코드입니다.

kernel 공간에서 eBPF를 실행할 때, IT compiler(Just-in-Time compiler)가 bytecode를 기계어로 변환합니다.

출처: https://ebpf.io/ko-kr/what-is-ebpf/

 

 

bytecode와 기계어 코드의 차이는 다음과 같습니다.

 

3. Verifier를 통한 검증

eBPF bytecode가 JIT compiler로 기계어로 번역되기 전, Verifier를 통해 검증 단계를 거칩니다.

 

Verifier가 검증하는 내용 일부:

  • NULL pointer exception 등 시스템 크래시 가능성
  • 무한 루프 등 종료되지 않는 코드
  • 허락되지 않은 kernel 함수 사용 여부

https://ebpf.io/ko-kr/what-is-ebpf/

 

4. eBPF map: 상태 저장 공간

eBPF로 실행된 코드의 상태를 영구 저장하고 공유하려면 저장 공간이 필요합니다. 이 저장 공간을 eBPF map이라고 합니다.

출처: https://ebpf.io/ko-kr/what-is-ebpf/

 

 

eBPF map은 bpftool 명령어로 확인할 수 있습니다.

bpftool map list
bpftool map dump id {map id}

 

bpftools: eBPF CLI 도구

Linux netfilter를 CLI로 설정하는 도구가 iptables라면, eBPF를 CLI로 관리하는 도구는 bpftools입니다. 이 섹션에서는 주요 조회 명령어를 소개합니다.

 

로그 조회

bpf 로그는 trace 버퍼에서 확인할 수 있습니다. bpf_printk() 함수로 출력한 로그는 다음 명령어로 확인합니다.

sudo bpftool prog trace

 

eBPF 프로그램 목록 조회

eBPF 목록 전체를 조회하려면 prog list로 확인할 수 있습니다.

$ sudo bpftool prog list
27: lsm  name restrict_filesystems  tag aae89fa01fe7ee91  gpl
	loaded_at 2025-12-23T01:37:43+0000  uid 0
	xlated 560B  jited 300B  memlock 4096B  map_ids 11
	btf_id 17

 

 

특정 eBPF만 조회하고 싶으면 prog list 뒤에 eBPF 이름을 적으면 됩니다.

# handle_execve_tp ebpf를 조회
sudo bpftool prog show name handle_execve_tp

 

eBPF map

eBPF map list를 사용하면 됩니다.

sudo bpftool map list

 

 

eBPF map 데이터를 확인하려면 map dump id를 사용하면 됩니다.

sudo bpftool map dump {map id}

 

바이트 코드 확인

eBPF 바이트 코드를 확인하려면 prog dump xlated를 사용하면 됩니다.

$ sudo bpftool prog dump xlated id <ID>
; bpf_printk("Hello world");
   0: (18) r1 = map[id:447][0]+0
   2: (b7) r2 = 12
   3: (85) call bpf_trace_printk#-61296
; return 0;
   4: (b7) r0 = 0
   5: (95) exit

 

기계어 코드 확인

eBPF 기계어 코드를 확인하려면 prog dump jited를 사용하면 됩니다.

sudo bpftool prog dump jited id <ID>
반응형