liminfo

eBPF Reference

eBPF 프로그램 타입, 맵, 헬퍼 함수 빠른 참조

17개 결과

eBPF Reference 소개

eBPF Reference는 Extended Berkeley Packet Filter 프로그래밍의 핵심 영역을 망라한 검색 가능한 가이드입니다. Programs 카테고리는 주요 프로그램 타입을 모두 다룹니다. 커널 함수 진입점에 연결하는 kprobe와 반환 시점에 연결하는 kretprobe, 안정적인 커널 트레이스 이벤트 훅을 위한 tracepoint(sys_enter_openat 같은 시스콜 트레이스포인트 포함), 네트워크 드라이버 수준의 고성능 패킷 처리를 위한 XDP(eXpress Data Path), 커널 트래픽 제어 훅을 위한 TC(Traffic Control), 소켓 레벨 패킷 필터링을 위한 socket_filter가 포함됩니다. 모든 항목은 libbpf 스타일의 BPF_KPROBE와 SEC() 매크로를 사용하며 실제 C 코드 예제를 제공합니다.

Maps 카테고리는 가장 중요한 4가지 BPF 맵 타입을 다룹니다. 임의 키/값 타입을 가진 키-값 해시 저장소인 BPF_MAP_TYPE_HASH, 고정 인덱스 배열 저장소인 BPF_MAP_TYPE_ARRAY, bpf_ringbuf_output을 사용한 효율적인 커널-유저스페이스 이벤트 전달을 위한 BPF_MAP_TYPE_RINGBUF, CPU별 perf 이벤트 스트리밍을 위한 BPF_MAP_TYPE_PERF_EVENT_ARRAY가 포함됩니다. 모든 맵 정의는 __uint와 __type 매크로를 사용하는 현대적인 BTF 스타일 맵 선언을 따릅니다. Tools 카테고리는 주요 eBPF 개발 및 관찰성 도구를 소개합니다. 고수준 원라이너 트레이싱용 bpftrace, Python 기반 eBPF 프로그램 개발용 BCC(BPF Compiler Collection), 프로덕션급 C 스켈레톤 기반 개발용 libbpf, 프로그램 목록 조회·맵 덤프·BTF 검사를 위한 bpftool이 포함됩니다.

Concepts 카테고리는 세 가지 핵심 개념을 설명합니다. 재컴파일 없이 서로 다른 커널 버전에서 커널 구조체 필드에 안전하게 접근하기 위해 BPF_CORE_READ를 사용하는 CO-RE(Compile Once — Run Everywhere), CO-RE 이식성과 풍부한 인트로스펙션을 가능하게 하는 vmlinux.h를 통해 커널 타입 메타데이터를 제공하는 BTF(BPF Type Format), 그리고 무한 루프·범위 외 메모리 접근·안전하지 않은 포인터 산술을 거부하기 위해 모든 BPF 프로그램을 로드 전에 정적 분석하는 eBPF 검증기가 포함됩니다. 커널 개발자, 보안 연구원, 관찰성 엔지니어를 위한 4개 카테고리(Programs, Maps, Tools, Concepts)로 구성되어 있습니다.

주요 기능

  • 프로그램 타입: kprobe, kretprobe, tracepoint(시스콜 훅), XDP(드라이버 수준 패킷 처리), TC, socket_filter
  • BPF 맵 타입: HASH, ARRAY, RINGBUF(커널→유저 이벤트), PERF_EVENT_ARRAY와 bpf_perf_event_output
  • __uint(type), __uint(max_entries), __type(key), __type(value) 매크로를 사용한 현대적 BTF 스타일 맵 선언
  • bpftrace 원라이너: tracepoint와 printf를 활용한 빠른 커널 트레이싱
  • BCC Python API: BPF() 클래스, attach_kprobe(), Python 측 이벤트 폴링
  • libbpf 스켈레톤 API: open_and_load(), attach(), CO-RE 구조체 필드 접근
  • bpftool: 프로그램 목록 조회, 맵 내용 덤프, BTF 타입 정보 검사 명령어
  • 핵심 개념: BPF_CORE_READ로 CO-RE 이식성, BTF vmlinux.h, eBPF 검증기 안전성 모델

자주 묻는 질문

kprobe와 tracepoint 프로그램 타입의 차이는 무엇인가요?

kprobe는 이름으로 임의의 커널 함수 진입점에 연결하여(예: tcp_sendmsg) 함수 인수에 접근합니다. kretprobe는 커널 함수 반환 시점에 연결하여 반환 값을 캡처합니다. tracepoint는 커널 버전 간 변경이 보장되지 않는 커널의 안정적으로 명시된 훅(예: syscalls/sys_enter_openat)에 연결합니다. 커널 업데이트 시 깨질 수 있는 kprobe보다 tracepoint가 더 안정적이므로 사용 가능한 경우 tracepoint를 권장합니다.

XDP와 TC의 차이는 무엇인가요?

XDP(eXpress Data Path) 프로그램은 네트워크 수신 경로에서 가장 이른 지점인 네트워크 드라이버 내부, sk_buff 할당 이전에 실행됩니다. 이를 통해 가장 낮은 지연 시간과 최고의 처리량을 제공하여 DDoS 완화와 로드 밸런싱에 이상적입니다. XDP 프로그램은 XDP_PASS, XDP_DROP, XDP_TX, XDP_REDIRECT를 반환합니다. TC(Traffic Control) 프로그램은 스택에서 나중에 tc ingress/egress 훅에서 실행되며 sk_buff에 접근할 수 있어 더 유연하지만 약간 느립니다.

BPF_MAP_TYPE_RINGBUF는 언제 PERF_EVENT_ARRAY 대신 사용해야 하나요?

BPF_MAP_TYPE_RINGBUF(Linux 5.8부터 사용 가능)는 커널에서 유저스페이스로 이벤트를 보내는 PERF_EVENT_ARRAY의 현대적 대체품입니다. 링 버퍼는 모든 CPU에서 단일 공유 버퍼를 사용하여 perf 이벤트 배열의 CPU별 오버헤드를 줄입니다. 또한 가변 길이 레코드를 지원하고 메모리 효율성이 더 높습니다. 커널 5.8 이상을 대상으로 하는 새 프로그램에는 RINGBUF를, 이전 커널 호환성을 위해서는 PERF_EVENT_ARRAY를 사용하세요.

CO-RE란 무엇이고 왜 중요한가요?

CO-RE(Compile Once — Run Everywhere)는 커널 버전마다 구조체 레이아웃이 다르기 때문에 컴파일된 것과 다른 커널 버전에서 eBPF 프로그램이 깨지는 문제를 해결합니다. CO-RE는 BPF_CORE_READ() 매크로와 BTF 타입 정보를 사용하여 로드 시 구조체 필드 접근을 자동으로 재배치합니다. 이를 통해 BTF를 노출하는 어떤 커널에서도 재컴파일 없이 단일 컴파일된 BPF 오브젝트 파일이 실행될 수 있습니다.

BTF란 무엇이고 커널이 BTF를 지원하는지 어떻게 확인하나요?

BTF(BPF Type Format)는 커널의 C 타입 정보(구조체 레이아웃, typedef, 함수 프로토타입)를 인코딩하는 컴팩트한 바이너리 형식입니다. CO-RE 이식성과 풍부한 인트로스펙션을 가능하게 합니다. ls /sys/kernel/btf/vmlinux로 지원 여부를 확인하세요. 파일이 존재하면 커널이 BTF를 지원합니다. 그러면 개별 커널 헤더 대신 vmlinux.h(bpftool btf dump file vmlinux format c > vmlinux.h로 생성)를 사용할 수 있습니다.

eBPF 검증기는 어떤 역할을 하나요?

eBPF 검증기는 BPF 프로그램이 로드되기 전에 실행되는 커널 내 정적 분석 엔진입니다. 커널을 충돌시키거나 침해할 수 있는 프로그램을 거부합니다. 무한 루프나 제한 없는 루프, 범위 외 배열 접근, null 포인터 역참조, 초기화되지 않은 값 사용, 명령 수 한도 초과가 포함됩니다. 검증기는 상징적 실행을 수행하고 모든 레지스터의 타입과 범위를 추적하여 메모리 안전성을 증명합니다. 검증 오류는 bpf_log_buf에 기록됩니다.

bpftrace, BCC, libbpf의 차이는 무엇인가요?

bpftrace는 일회성 커널 트레이싱을 위한 고수준 스크립팅 언어입니다. BCC(BPF Compiler Collection)는 C 문자열로 eBPF 프로그램을 작성하고 LLVM으로 런타임에 컴파일한 다음 Python에서 연결하는 Python/Lua API를 제공합니다. libbpf는 사전 컴파일된 BPF ELF 오브젝트와 CO-RE를 사용하는 프로덕션 배포용 저수준 C 라이브러리입니다. bpftrace는 빠른 조사에, BCC는 프로토타이핑에, libbpf는 프로덕션 도구와 데몬에 적합합니다.

로드된 eBPF 프로그램 목록을 보고 BPF 맵을 검사하는 방법은 무엇인가요?

bpftool prog list로 로드된 모든 BPF 프로그램의 ID, 타입, 이름을 확인하세요. bpftool map dump name <맵이름>으로 명명된 BPF 맵의 내용을 검사하세요. bpftool map show는 타입, 키/값 크기, 최대 항목 수와 함께 모든 맵 목록을 표시합니다. BPF 파일시스템(/sys/fs/bpf/)에 맵을 핀(pin)하여 프로세스 간에 공유하거나 프로그램 재시작 후에도 유지할 수 있습니다.