Linux BTF(BPF Type Format)란? eBPF의 타입 정보를 저장하는 BTF 구조와 활용법 완벽 이해

eBPF가 처음 등장했을 때 가장 큰 문제 중 하나는 커널 버전마다 내부 구조체(Layout)가 달라진다는 점이었습니다.

예를 들어 task_structsock, sk_buff 같은 커널 구조체는 Linux 버전마다 멤버의 위치나 크기가 달라질 수 있습니다. 따라서 특정 버전에서 컴파일한 eBPF 프로그램은 다른 커널에서 제대로 동작하지 않는 경우가 많았습니다.

이 문제를 해결하기 위해 Linux는 BTF(BPF Type Format) 를 도입했습니다.

BTF는 커널과 eBPF 프로그램의 타입(Type) 정보를 저장하는 메타데이터입니다. 이를 이용하면 eBPF 프로그램이 실행 중인 커널의 실제 구조체 정보를 읽어 자동으로 맞춰 사용할 수 있으며, CO-RE 기술의 핵심 기반이 됩니다.

이번 글에서는 BTF의 개념과 구조, 동작 원리, CO-RE와의 관계, 주요 명령어, 실무 활용 방법을 자세히 알아보겠습니다.

Linux BTF란?

BTF(BPF Type Format)는 Linux Kernel과 eBPF 프로그램에서 사용하는 타입 정보를 저장하는 메타데이터 형식입니다.

기본 구조는 다음과 같습니다.

C Source

↓

LLVM

↓

BTF 생성

↓

ELF Object

↓

Kernel BTF

↓

CO-RE

즉, BTF는 변수나 구조체 자체가 아니라 타입 정보를 설명하는 데이터입니다.

BTF가 필요한 이유

예를 들어 다음과 같은 구조체가 있다고 가정해 보겠습니다.

struct task_struct {
    int pid;
    char comm[16];
};

다른 커널에서는 다음과 같이 변경될 수도 있습니다.

struct task_struct {
    long flags;
    int pid;
    char comm[16];
};

pid의 위치가 달라졌지만 BTF를 이용하면 현재 커널의 구조를 자동으로 확인하여 올바른 위치를 참조할 수 있습니다.

BTF의 동작 원리

전체 과정은 다음과 같습니다.

Compile

↓

BTF 생성

↓

Kernel BTF 비교

↓

Field Offset 계산

↓

자동 수정

↓

Program 실행

실행 시점에 현재 커널 구조에 맞게 필요한 정보가 자동으로 보정됩니다.

BTF가 저장하는 정보

BTF는 다양한 타입 정보를 저장합니다.

대표적으로

  • 구조체(Struct)
  • 공용체(Union)
  • 열거형(Enum)
  • 함수(Function)
  • 변수(Variable)
  • 배열(Array)
  • 포인터(Pointer)
  • Typedef

등을 저장합니다.

BTF와 ELF

컴파일된 eBPF Object에는 BTF가 포함됩니다.

대표적인 Section은 다음과 같습니다.

.text

.maps

.BTF

.BTF.ext

.BTF에는 타입 정보가,

.BTF.ext에는 CO-RE Relocation 정보가 저장됩니다.

Kernel BTF

최신 Linux는 Kernel 자체의 BTF도 제공합니다.

대표 위치

/sys/kernel/btf/vmlinux

이 파일에는 Kernel 전체 타입 정보가 저장됩니다.

BTF와 CO-RE의 관계

CO-RE는 BTF를 이용하여 동작합니다.

전체 흐름

Kernel BTF

↓

Field Offset 확인

↓

Relocation

↓

Program 실행

BTF가 없다면 CO-RE도 사용할 수 없습니다.

BTF 확인

Kernel BTF 존재 여부 확인

ls /sys/kernel/btf

대표 출력

vmlinux

Kernel이 BTF를 지원한다는 의미입니다.

bpftool로 BTF 확인

BTF 목록 확인

sudo bpftool btf show

출력 예시

ID 1

vmlinux

특정 BTF 확인

sudo bpftool btf dump id 1

BTF Dump

C 형태로 출력

sudo bpftool btf dump file /sys/kernel/btf/vmlinux format c

출력 예시

struct task_struct {
    ...
};

커널 내부 구조체를 확인할 수 있습니다.

BTF의 장점

BTF를 사용하면 다음과 같은 장점이 있습니다.

  • 커널 버전 호환성 향상
  • CO-RE 지원
  • 구조체 자동 분석
  • 디버깅 편리
  • 코드 재사용 증가
  • 유지보수 향상

현재 대부분의 eBPF 프로젝트에서 필수적으로 사용됩니다.

BTF와 DWARF의 차이

항목BTFDWARF
목적eBPF 타입 정보디버깅 정보
크기작음
CO-RE 지원OX
Kernel 지원OX
eBPF 최적화OX

BTF는 eBPF에 최적화된 경량 타입 정보 형식입니다.

BTF 사용 시 주의사항

BTF를 사용하기 위해서는 다음 사항을 확인해야 합니다.

  • Kernel BTF 지원 여부
  • 최신 Clang 사용
  • 최신 libbpf 사용
  • CO-RE 지원 환경
  • BTF 생성 옵션 활성화

구형 Kernel에서는 BTF가 제공되지 않을 수 있습니다.

실무에서 자주 사용하는 명령어

Kernel BTF 확인

ls /sys/kernel/btf

BTF 목록 확인

sudo bpftool btf show

BTF Dump

sudo bpftool btf dump file /sys/kernel/btf/vmlinux format c

Program 확인

sudo bpftool prog show

Kernel 기능 확인

sudo bpftool feature

libbpf 버전 확인

pkg-config --modversion libbpf

실무 사례

예를 들어 하나의 eBPF 프로그램을 Ubuntu 22.04 서버에서 컴파일한 뒤 Rocky Linux, Debian, Fedora 등 다양한 Linux 배포판에서 실행해야 한다고 가정해 보겠습니다.

예전에는 커널 구조체 차이 때문에 각 서버에 맞게 프로그램을 다시 컴파일해야 했습니다.

하지만 BTF와 CO-RE를 사용하면 다음과 같은 과정으로 실행됩니다.

  1. eBPF 프로그램 컴파일
  2. BTF 정보 생성
  3. 대상 서버에서 Kernel BTF 확인
  4. CO-RE가 구조체 오프셋 자동 보정
  5. 동일한 바이너리를 여러 커널에서 실행

이처럼 BTF는 eBPF 프로그램의 이식성과 유지보수성을 크게 향상시키는 핵심 기술입니다.

자주 묻는 질문

BTF는 반드시 필요한가요?

필수는 아니지만, 최신 eBPF 개발에서는 사실상 필수 기술로 여겨집니다. 특히 CO-RE를 사용하려면 Kernel과 Object 파일 모두 BTF 정보를 포함해야 합니다.

BTF는 어떤 정보를 저장하나요?

구조체, 공용체, 열거형, 함수, 배열, 포인터 등 타입과 관련된 메타데이터를 저장합니다. 실제 데이터가 아니라 데이터의 구조를 설명하는 정보입니다.

BTF와 CO-RE는 어떤 관계인가요?

CO-RE는 BTF를 기반으로 실행 시점에 커널 구조체의 실제 레이아웃을 확인하고 필요한 Relocation을 수행합니다. 따라서 BTF는 CO-RE의 핵심 기반 기술입니다.

마무리

Linux BTF(BPF Type Format)는 eBPF 프로그램과 커널의 타입 정보를 저장하는 메타데이터 형식으로, CO-RE를 가능하게 하는 핵심 기술입니다. 구조체 레이아웃이 다른 다양한 커널에서도 하나의 eBPF 프로그램을 실행할 수 있도록 지원하며, 현대적인 eBPF 개발에서는 사실상 필수 요소로 자리 잡았습니다.

댓글 남기기